ループ処理-前判定-(Do Until)

前判定により条件が成り立つまで同じ処理を繰り返すループ処理のコード

'アクティブセルが10以上になるまで1を足す
Do Until ActiveCell >= 10
ActiveCell = ActiveCell + 1
Loop

ループ処理には、種類が複数あります
大きく分けると「For」と「Do」の2つがあり、それらが少し派生します

なかでも使いやすいのは「Do」の「Until」を使用する形です
「Until」はループの終了条件を指定するものです
条件式の書き方は他のコードと同じ書き方をし、このDoの後に条件式を書くことを前判定といいます(後判定はこちら)
Untilは条件式が真(True)になった時に終了します

これとは別に「While」という終了条件判定もありますが、こちらは終了の条件ではなくループを続ける条件を指定します
基本的にループ処理を作ることを考えたときに、終了条件の方が考えやすいと思うので「While」の説明は割愛します
条件式の作り方でどちらも同じ動きをするため、両方つかいこなす必要もありません

無限ループについて

ループ処理には常に付いて回るエラーが、無限ループです

たとえばこの記事の条件では10以上となっています
これを「Do Until ActiveCell = 10」として、セルの数値が11以上であった場合「12…13…14…」と加算されていき、永遠に10になることが無いので無限ループに陥ります

ループを作成した場合は、しっかりループが終了する事を確認してから処理の実行を行うようにしてください

もし無限ループに陥った場合は、「Ctrl+Break」か「Esc」で処理の実行をキャンセルさせるようにします(うまくいかない場合もあります)

ただ、この無限ループは意図せず発生した場合にエラーとして認識しますが通常は監視用無限ループというプログラミングもあります
なんらかの条件が成り立つまで待機するようなプログラムを作る際に使用します

ですが、VBAはプロシージャの複数同時実行は得意ではありません
1つのプロシージャを監視無限ループさせて、別のプロシージャで別の処理を並行して行うことは基本的に出来ません、というか安定しないので出来てもしないでください

この作りではデバッグもうまく機能しません、別のプロシージャに切り替えるようなデバッグの方法がありません

これを実現したい場合はVBAではなく、VBScriptという別のプログラミング言語がありますのでそちらを応用します

SelectCase条件分岐、逆条件

SelectCaseで答えの値から条件分岐をする方法

'条件を対象にして分岐
Select Case True
Case UserForm1.OptionButton1.Value

Case UserForm1.OptionButton2.Value

Case Else

End Select

SelectCase分岐の逆説的な使い方として、答えの方から分岐させる方法があります

よく使うのがユーザーフォームでオプションボタンを使用した際に、どれがチェックがついているかを判断することです

オプションボタンは、複数の中で1つだけONにできるコントロールです
オプションボタンはONの状態(チェックがついた状態)で「Value」プロパティが「True」になり、OFFなら「False」になります

そして、そのTrueを対象として各コントロールのValueプロパティを検証します
それが「Select Case True」の部分になります

この後の条件式には、対象とするコントロールを指定していきます
オプションボタンなら1つしかTrueにならないのでいいですが、チェックボックスなどで検証する場合は上にあるほど優先されることに注意します
逆にその優先度を利用することもいいかもしれません

OFF状態を検証したい場合は、対象を「False」とします
もちろん数値や文字列などを対象に検証することもできます

SelectCase条件分岐

複数の条件で分岐する際に使用するSelectCaseステートメントの使い方

'複数の条件で分岐
Select Case ActiveCell
Case 10

'10の時の処理内容

Case 20

'20の時の処理内容

Case Else

'10と20ではない時の処理内容

End Select

SelectCase条件分岐は複数の条件を1つの対象に検証して分岐します
対象が1つのものに条件を立てていくので、条件比較がわかりやすい条件分岐です

ちなみに、条件式は上から順番に検証されるので同じ条件で当てはまる場合は上の処理が優先されるのでIf構文のように続く条件に下限値などの設定は必要ありません

「Case ~~」~~の部分に条件の数値や文字列などを入力します
このCaseは追加で増やしていくことが可能です

最終的にどれにも当てはまらない場合は、「Case Else」にある処理が実行されます

Caseの書き方

'数値の範囲指定
Case 0 To 5

数値の範囲指定には「To」を使用します
開始と終了の数値を入力することにより、その範囲の数値であれば真となります
例コードであれば対象が0~5の数値であれば真です

'検証対象との比較
Case Is <= 5

検証対象を条件式に使用する場合は「Is」を使用します
「Case ActiveCell <= 5」は間違いになります、赤字の部分はIsに書き換えます
最大や最小の数値が分からない時はこちらで対応します

'複数の条件を指定
Case Is <= 6, 8 To 9

複数の条件を指定する場合は「,」で区切って追加します
変則的な数値であったりする場合はここで追加入力していきます
また、この条件はOr検証なので条件のどれかが成り立ったら真となります

IF条件分岐(And、Or、Not)

条件分岐をより細かく行うために使用するAnd・Or・Notのそれぞれの解説

'And(両方成り立つとき)
If ActiveCell = 100 And ActiveCell = 200 Then
'Or(どちらかが成り立つとき)
If ActiveCell = 100 Or ActiveCell = 200 Then
'Not(条件に当てはまらないとき)
If Not ActiveCell = 100 Then

Andすべての条件式が真のときに真を返します
さらにAndを追加して条件式を1行に増やしていくことも可能です
もちろんそんなことをすれば、コードが読み取りづらくはなります

Orどれか1つでも条件式が真のときに真を返します
Andと同じく追加することが可能です

Notは条件式の結果を反転させます
この場合だと、アクティブセルが100でなければ真となります
ただこの例だとあえて使う必要性がまったくありません
等符号の場合は、向きや右左辺を入れ替えればいいだけなので
「Like」や「Is」などの向きの変更ができなかったりするときに使います
Notを使う場面は初心者では少ないかもしれません

またこれらのコードは全て組み合わせて使用することもできます
ネストでは対応できない場合に使用するようにして、なるべくコードの可読性を落とさないように注意して使用してください

IF多数条件分岐

2択の条件分岐を連続して行う場合のコード

'Ifによる処理分岐
If ActiveCell = 100 Then

'1つ目が真の時の処理内容

ElseIf ActiveCell = 200 Then

'2つ目が真の時の処理内容

Else

'どちらも偽の時の処理内容

End If

IF条件分岐の多数条件です

1つ目の条件は、「If ~~ Then」の「~~」に条件式を入力します

2つ目の条件は、「ElseIf ~~ Then」の「~~」に条件式を入力します
1つ目の書式にElseを頭に追加するだけです

今回の場合は、アクティブセルの値が100なら1つ目が真、200なら2つ目が真となります
それ以外の数値や文字列、空白もすべて偽になります
どちらの結果になって処理が実行されても、最後のEnd Ifまできてその後の処理につながります

またElseIfはさらに追加して入力していくことができます
ただそんなことをすると訳がわからなくなる可能性が非常に高いので、せいぜいElseIfは1つぐらいがいいと思います
そもそも多数条件の場合はSelect分岐の方が良いです

IF条件分岐

2択で処理を分岐させるIFステートメントの使用方法

'Ifによる処理分岐
If ActiveCell = 100 Then

'真の時の処理内容

Else

'偽の時の処理内容

End If

IF条件分岐は、条件式が成り立つかどうかで処理を分岐させるコードです

プログラミングの必須知識として重要な処理です
関数でもあるので、多少はやったことがあるかもしれません

If ~~ Then

コード中間の「~~」に条件式を入力します

例コードでは「ActiveCell = 100」の部分が条件式になります
アクティブセルが100かどうかを調べています
それ以外の数値や文字列、空白もすべて偽になります

条件が成り立った場合は、「Then」以降の次の行からElseの前まで実行されます
条件が成り立たなかった場合は、「Else」以降の次の行から処理が実行されます

どちらの結果になって処理が実行されても、最後の「End If」まできてその後の処理につながります

ONOFF型の変数宣言

真・偽(True・False)のON・OFF切替のような2択にはBoolean型を使用します

'ONOFF型の変数宣言
Dim ブール型 As Boolean
ブール型 = True 'ON
ブール型 = False 'OFF
'ONOFF切替
ブール型 = Not ブール型

ONOFF型の変数は「Boolean型」を使用します
この変数は2通りの値しか代入できません
「True」と「False」の2つのみです

一応、「True」がON、「False」がOFFという感じで考えてください
もちろんこれは処理の作り次第で入れ替えられますが、初期値が「False」なので最初がOFFという方が自然です

この変数を使用するのは、フラグ処理で使うことが多いです

フラグという単語自体はそれほど専門的な単語とは思いませんが、ONになった状態のことをフラグが立ったという表現をします

この変数を最初に使ったのは、ユーザーフォームのイベント無効のためでした
ユーザーフォームにはイベントを無効にするプロパティが存在しないため、自分で無効処理を作る必要がありました
そんな時に、使ったのがこの変数です

ユーザーフォームの特定の処理を実行したら、まずはこの変数をTrueにします
無効にしたいイベントのプロシージャの先頭に、この変数の状態で処理を実行するかを分岐させます
特定の処理が終わったら、変数をFalseに戻します

イベントの処理は変数がFalseであれば実行されるため、任意のタイミングでイベントを無効にすることが出来ます

これを処理中はフラグを立てておく、という表現です

またこのTrueとFalseというのは、文字列ではなくキーワードというVBAのコードの一部として認識されるのでコーディング上もこの変数を使ったほうが分かり易くなります

ブール型 = True 'ON
ブール型 = False 'OFF

例コードで、2つ目と3つ目はそれぞれON・OFFを切り替えています

TrueとFalseを指定せずに切り替え

'ONOFF切替
ブール型 = Not ブール型

さらに4つ目のコードは、簡単にON・OFFを切り替える方法として紹介しています
この右辺についている「Not」はその後に続くものの否定になります
ここでこの変数の最大限の効力を発揮します
TrueのNotはFalse、FalseのNotはTrueとなります
なので、いちいちON・OFFを書き込まなくても、このコードの発生回数で切り替えが制御できることになります

もちろん、もともとの値も変更後の値も可変でコード上からは分からないのでこれだけで良いとはなりませんが、便利な使い方です

さらにこの使い方は、TrueとFalseをプロパティに持つものすべてに対して有効です
チェックボックスのValueもこれで簡単に切り替えたりできますので、他でも使用してみてください

文字列型の変数宣言

文字列を扱う際にはString型を使用します。固定長の宣言方法もあります

'文字列型の変数宣言
Dim 文字列型 As String
'5文字まで代入できる文字列型の変数宣言
Dim 制限文字列型 As String * 5

文字列の変数には「String」型を使用します
また、この変数には文字数の制限を行う場合とそうでない場合の2種類が存在します

Dim 文字列型 As String

文字数の制限を行わないのが、1つ目の例コードになります
この文字列を「可変長文字列」といい、0文字から自由に代入した文字列がそのまま代入できます

Dim 制限文字列型 As String * 5

文字数の制限を行うものが、2つ目の例コードになります
この文字列を「固定長文字列」といい、定まった文字数を常に返す変数になります

基本的な文字列の使用時には1つ目の可変長文字列を使用すればいいです

固定長は固定文字数なので、制限文字数が代入されない場合は空白で文字数を埋めて返されます
例えば、例コードでは5文字の固定長となっています

制限文字列型 = "123"
→→→ 123  

この変数に「123」を代入すると、「123」と空白が2文字分追加されて5文字の固定長文字列になります

制限文字列型 = "123456"
→→→ 12345

また制限を超えた場合は、以降の文字は切り捨てられます

今回の例のように数値でも「”」で囲むことによって文字列にして代入させることができます

ただ、この「”」を代入させたい場合もあります
その方法に関しては以下の記事を確認してください

文字列として「”」を代入

「”(ダブルクォーテーション)」を文字列として認識させる方法

変数などへの文字列の代入に関して、文字列は通常「”」で囲むことになります
しかし、「”」を文字列として代入させたい場合があります

その場合には2通りの方法を使用します

「”」を連続で入力する

「”」を入れたい箇所に「””」と入れます
「””」とすることで「”」の代入になります

"123""456"
→→→ 123"456

間に「”」が1つ挿入された状態になります

"123""""456"
→→→ 123""456

4つ入力することで、2つ挿入された状態になります

Chr関数で入力する

Chr(34)

Chr関数は文字コードから文字を返す関数です
これを利用する事でも入力できます

"123" & Chr(34) & "456"
→→→ 123"456

Chr(34)を1つ入力すれば、1つ挿入された状態になります

"123" & Chr(34) & Chr(34) & "456"
→→→ 123""456

2つ入力すれば、当然2つ挿入された状態になります

こちらでは、挿入したい個数がイメージしやすいので可読性は良いかもしれません
ただ、コードが長くなってしまうので1行が長くなりすぎる場合は考え物かもしれません

万能型の変数宣言

Variant型は値もオブジェクトも配列も代入できる万能の型の解説

'万能型変数の宣言
Dim 万能型変数 As Variant
'万能型変数の省略宣言
Dim 省略万能型変数

万能型変数とは、値とオブジェクトどちらのどの型も代入することのできる変数の型です
また、2つ目の例のように型の宣言を省略した場合はこの型に指定されます

型の指定が必要なく便利なように感じるかもしれませんが、そういった意味での使用は絶対に行わないでください
使用に関しての注意点がいくつかあります

●メモリの使用が大きくなる可能性がある
●値とオブジェクトどちらでも入るため、役割が読み取りにくい

無作為に使いすぎると困る点ですね
基本的には、配列を使うときや戻り値が「Variant型」の時に使用します
便利なので、という使い方をすることはありません