ステートメント(スタンダード)
・Select Case
・Do...Loop
・For...Eachほか
【ここでのポイント】
For...Next
With...End With
Select Case
Do...Loop
For...Eachほか
言うまでもない事ですが、ベーシックの範囲は完全にマスターしていることが前提になります。
自信がない場合は、ベーシックに戻って再確認しておきましょう。
VBAコードを正しく読み解けるかを問う問題が多いはずですので、サンプルコードを何度も読んで慣れておきましょう。
VBAステートメントの一覧
以下の今後の章では、それぞれに必要なステートメントを学ぶことになります。
エラーへの対処
APIとOLEオートメーション
変数と配列
レジストリの操作
ファイルの操作
Exit
Mid
この2つのステートメントも、ここで紹介しておきます。
Select Case
Select Caseは、多肢条件分岐のときに使用します。
Select Caseは、複数条件による複数分岐になります。
Select Caseは、Ifステートメントに比べてより強力な条件判定が使えるようになっています。
つまり、
Select Caseは、多肢条件分岐に特化したステートメントということです。
[Case expressionlist-n
[statements-n]]
・・・
[Case Else
[elsestatements]]
End Select
testexpression | 必ず指定します。 任意の数式または文字列式を指定します。 |
expressionlist-n |
Case 節がある場合は、次の形式で必ず指定します。 |
statements-n | 省略可能です。 引数 testexpression が引数 expressionlist-n のいずれかと一致するとき、一致した引数 statements-n のステートメントが実行されます。 |
elsestatements | 省略可能です。 引数 testexpression が Case 節のいずれとも一致しないとき、引数 elsestatements のステートメントが実行されます。 |
少しわかり易く、日本語で構文を書くと、
Case 条件式1
条件1の時に実行する命令
Case 条件式2
条件1の時に実行する命令
・・・
Case Else
上記の条件以外の時に実行する命令
End Select
変数、定数、オブジェクト式、関数等々、何らかの値を返す全ての式を書くことが出来ます。
ここに書かれた、変数または式の値が、
Caseに書かれた条件に一致するかを、上から順に判定していきます。
※公式テキストでは「複数の条件を同時に判定」と書かれていますが、
同時には判定しません。
上から順に判定し、条件が満たされれば、それ以降の条件は判定しません。
Case内の命令が実行された後は、End Selectの後ろに制御が移ります。
Case Elseが書かれていれば、Case Else内の命令が実行され、
Case Elseが省略されていれば、Select Caseは何も処理しません。
変数、定数、オブジェクト式、関数等々、何らかの値を返す全ての式を書くことが出来ます。
Select Caseの後ろの値と、Caseの後ろの値とを比較します。
値と同値であるかの判定となります。
カンマで区切られた値をOr条件で判定します。
値1 Or 値2 Or 値3 ・・・
値1から値2の範囲判定です。
>=値1 And <=値2
比較演算子は、>,<,>=,<=になります。(=も書けますが使う意味がありません)
Isは単なる文法上の記述でしかありません。
VBEでは、比較演算子を書けば、Isが自動挿入されます。
Case 値1, 値2 To 値3
=値1 Or (>=値1 And <=値2)
例文です。
Select Case 変数
Case 1
変数=1の処理
Case
2
変数=2の処理
Case Else
変数が上記以外の処理
End
Select
Select Case 変数
Case 1, 2
変数=1 Or 変数=2の処理
Case 3, 4, 5
変数=3 Or 変数=4 Or 変数=5の処理
Case Else
変数が上記以外の処理
End Select
Select Case 変数
Case 1 To 2
変数=1 ~ 2の処理
Case 3 To 5
変数=3 ~ 5の処理
Case Else
変数が上記以外の処理
End
Select
Select Case 変数
Case Is <= 2 'Is は書かなければ自動挿入されます。
変数<=2の処理
Case Is <= 5
変数<= 5の処理
Case Else
変数が上記以外の処理
End
Select
ElseIfとの書き換え
If 条件式1 Then
条件式1が真の処理
ElseIf 条件式2
条件式2が真の処理
ElseIf 条件式3
条件式3が真の処理
Else
全ての条件式が偽の処理
End If
Case 条件式1
条件式1が真の処理
Case 条件式2
条件式2が真の処理
Case 条件式3
条件式1が真の処理
Case Else
全ての条件式が偽の処理
End Select
上記2つは、同一となります。
TrueはBooleanの値です。
条件式はTrueまたはFalseを返します。
従って、この2値の比較が行われるということです。
Do...Loop
繰り返し処理のステートメントです。
その違いは、
For~Nextは、繰り返す回数を指定するものです。
Do~Loopは、繰り返す条件を指定するものです。
[statements]
[Exit Do]
[statements]
Loop
[statements]
[Exit Do]
[statements]
Loop [{While | Until} condition]
condition | 省略可能です。 真 (True) または偽 (False) を評価する数式、あるいは文字列式を指定します。 引数 condition の値が Null 値の場合、引数 condition は偽 (False) であるとみなされます。 |
statements | 引数 condition が真 (True) である間、または引数 condition が真 (True) になるまで繰り返し実行される、 任意の行数のステートメントを記述します。 |
書き方のパターンが複数ありますので、
日本語で簡略化して、パターンを示します。
・・・処理・・・
Loop
従って、
処理内で、Exit DoまたはExit Sub等で処理を抜ける必要があります。
Do While 条件式
・・・処理・・・
Loop
つまり、
条件が満たされなくなった時に、ループを抜けます。
Do Until 条件式
・・・処理・・・
Loop
つまり、
条件が満たされた時に、ループを抜けます。
Do
・・・処理・・・
Loop While 条件式
ループに入るときに条件判定をしないので、少なくとも1回はループ内の処理が実行されます。
つまり、
条件が満たされなくなった時に、ループを抜けます。
Do
・・・処理・・・
Loop Until 条件式
ループに入るときに条件判定をしないので、少なくとも1回はループ内の処理が実行されます。
つまり、
条件が満たされた時に、ループを抜けます。
条件式は、Ifステートメント等が書く条件式と同じ書き方になります。
Sub 練習1()
Dim i
i = 1
Do While i <= 10
Cells(i, 1) = 1
i = i + 1
Loop
End Sub
または
Sub 練習2()
Dim i
i = 1
Do Until i > 10
Cells(i, 1) = 1
i = i + 1
Loop
End Sub
Whileは、条件を満たす間
Untilは、条件を満たす迄
WhileとUntilの条件は、補集合の関係になります。
つまり、
Not(Whileの条件) = Untilの条件、Whileの条件 = Not(Untilの条件)
の関係になります。
i = 1
これは、変数iに、1を入れています。
i = i + 1
これは、変数iに1を足して、変数iに入れ直しています。
つまり、変数iは、1増える事になります。
Sub 練習1()
Dim i '変数iを宣言
i = 1 '変数iに1を入れる
Do While i <= 10 '変数iが10以下の間処理を続ける
Cells(i, 1) = 1 'A列のi行に1を入れる
i = i + 1 '変数iを1増やす
Loop 'Doの処理範囲はここまで
End Sub
For~Nextの Step 2 のように、1行置きに処理したい場合は、
i = i + 2
このようにすれば良いという事です。
Do~Loopのネスト(入れ子)
Sub 練習3()
Dim i, j
i = 1
Do Until i > 10
j =
1
Do Until j > 10
Cells(i, j) = 1
j = j +
1
Loop
i = i + 1
Loop
End
Sub
For...Each
使い方はコレクションと同じなので、コレクションをしっかり覚えておけば問題ありません。
以下では、コレクションの場合を説明します。
For Each は、コレクションの中から、個別のオブジェクトを取り出して処理する場合に使用します。
[statements]
[Exit For]
[statements]
Next [element]
element | 必ず指定します。 コレクションの各要素を繰り返す変数を指定します。 引数 element にはバリアント型 (Variant) 変数、総称オブジェクト型変数、または任意の固有オブジェクト型のオブジェクトの変数を指定できます。 |
group | 必ず指定します。 オブジェクト コレクション名を指定します。 |
statements | 省略可能です。 引数 group の各メンバに対して実行するステートメントを指定します。 |
しかし、オブジェクトの型が不明な場合もあります。
その場合は、VariantやObjectを使って指定します。
そもそも、コレクション名は分かっている訳ですから、
コレクション名の最後のsを取れば、それで通常は固有オブジェクト型になります。
For Each 変数 In ○○○s
・・・
Next 変数
使用例
Dim ws As Worksheet
For Each ws In
Worksheets
ws.PrintPreview
Next ws
これで、全シートが印刷プレビューされます。
(印刷プレビューについては、後々説明します。)
Dim i As Integer
For i = 1 To Worksheets.Count
Worksheets(i).PrintPreview
Next
i
このようになります。
RangeオブジェクトのFor Each
Dim MyRange As Range
Dim i As Long
i = 1
For Each MyRange In
Range("A1:B5")
MyRange = i
i = i +
1
Next
これを実行してみれば解りますが、
A1,B1,A2,B2,・・・
の順に処理されます。
つまり、
処理順は、シートの横→縦ということです。
その他
Do~Loopの中から抜けます。
For~Nextの中から抜けます。
Function~End Functionの中から抜けます。
Sub~End Subの中から抜けます。
For~Nextのループ処理を終了したい場合に使用します。
特定の条件になった場合は、指定回数の処理を完了する前にループを抜けたい場合に使用します。
Sub 練習3()
Dim i
For i = 1 To 10
If Cells(i, 1) <> "" Then
Exit For
End If
Cells(i, 1) = 1
Next
End Sub
10行目まで繰り返したいが、
A列に既に値が入っていたら、そこで終了するという処理になります。
Exit Forが含まれているForの再内側のForからだけ抜けます。
For i = 1 To 10
For j = 1 To 10
Exit For
Next j
Next i
このExit Forは、
For~Next jの中から抜けるだけなので、
For~Next iのループは継続されます。
Exit Do
Do~Loopのループ処理を終了したい場合に使用します。
処理を終了したい時に、Exit Do
Loop
ループの中で、終了条件を判定し処理を終了する場合には、Exit Doを使います。
Midステートメント
Midステートメントは、文字列変数の一部を他の文字列に置き換えます。
これは、VBAのステートメントで、Mid関数とは根本的に違うものです。
Midステートメントは、文字列の一部を置換するものです。
VBA上級者では常識的なステートメントになりますので、一応は覚えておきましょう。
stringvar | 必ず指定します。 変更する文字列変数の名前を指定します。 |
start | 必ず指定します。 バリアント型 (内部処理形式 Long) の値を指定します。 引数 stringvar の中の置き換えを始める位置を文字数単位で指定します。 |
length | 省略可能です。 バリアント型 (内部処理形式 Long) の値を指定します。 置き換えを行う文字数を指定します。 省略すると、文字列すべてが対象となります。 |
string | 必ず指定します。 新しく置き換える文字列式を指定します。 |
Midステートメントの実行しても、元の文字列の文字数は変更できません。
start + length が、stringvarの文字数を超える場合は、stringvarの文字数までが置換対象となります。
string(置き換える文字列)がlengthを超えている場合は、lengthの文字数までが有効となります。
実際には、lengthは省略し、stringの文字数が置換されるようにします。
使用例.
Dim MyString As String
MyString = "ABCDEF"
Mid(MyString, 3, 2) =
"cd"
MsgBox MyString
”ABcdEF”と表示されます。
【業務改善の実務】
これらを使いこなすことは、実務でのVBA開発では必須になります。
複数ファイル処理なら、Do...Loop
コレクション処理なら、For...Each
【本サイト内の関連ページ】
第22回.条件分岐(Select Case)
第59回.コレクション処理(For Each)
第101回.Midステートメント
VBAエキスパート公式テキスト
こちらは必須として購入した方が良いでしょう。
ちょっと高いなーとは思いますが、
書籍を購入することで、学習用データが提供されています。
・サンプルブック
・VBAエキスパート模擬問題
これらが使えるようになります。
このシリーズでは、テキストを読みながら学習していることを前提とします。
同じテーマ「VBAエキスパート対策」の記事
VBAベーシック試験対策まとめ
プロシージャ
イベント
ステートメント(スタンダード)
関数
エラーへの対処
APIとOLEオートメーション
変数と配列
レジストリの操作
ファイルの操作
ユーザーフォームとメニューの操作
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.ブック・シートの選択(Select,Activate)|VBA入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- マクロVBA入門編
- VBAエキスパート対策
- ステートメント(スタンダード)
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。