VBAエキスパート対策
ステートメント(スタンダード)

Excel VBAエキスパート対策です
公開日:2018-03-09 最終更新日:2019-08-26

ステートメント(スタンダード)


・Select Case
・Do...Loop
・For...Eachほか


【ここでのポイント】

VBAには、基本かつ最重要ステートメントが6つあります。

If...End If
For...Next
With...End With
Select Case
Do...Loop
For...Eachほか

ベーシックのステートメントでは、最初の3つまでやっていますので、ここでは、残りの3つを取り上げます。
・【ここでのポイント】 ・If...End If ・For...Next ・With...End With ・【業務改善の実務】 ・【本サイト内の関連ページ】 ・VBAエキスパート公式テキスト

言うまでもない事ですが、ベーシックの範囲は完全にマスターしていることが前提になります。
自信がない場合は、ベーシックに戻って再確認しておきましょう。

試験の内容としては、直接的にこれらのステートメントを問う問題というより、
VBAコードを正しく読み解けるかを問う問題が多いはずですので、サンプルコードを何度も読んで慣れておきましょう。

VBAステートメントは多数あります。
VBAステートメントの一覧
マクロVBAステートメントの一覧と解説です。基本ステートメント フロー制御ステートメント ファイル・フォルダ関連ステートメント フォーム・クラス関連ステートメント レジストリ関連ステートメント 太字はリンク付きは、詳細解説ページ、または、応用したVBAコードがあるページにリンクしています。

以下の今後の章では、それぞれに必要なステートメントを学ぶことになります。
エラーへの対処
APIとOLEオートメーション
変数と配列
レジストリの操作
ファイルの操作

試験に出題される可能性のあるステートメントで、出題範囲として曖昧なものとして、
Exit
Mid

この2つのステートメントも、ここで紹介しておきます。

Select Case

Select Caseは、多肢条件分岐のときに使用します。


Ifステートメントは、真偽の2分岐なのに対し、
Select Caseは、複数条件による複数分岐になります。

Ifステートメントで、ElseIfを使って複数分岐させることもできますが、
Select Caseは、Ifステートメントに比べてより強力な条件判定が使えるようになっています。
つまり、
Select Caseは、多肢条件分岐に特化したステートメントということです。


Select Caseステートメントです。

Select Case testexpression
    [Case expressionlist-n
        [statements-n]]

    ・・・
    [Case Else
        [elsestatements]]
End Select


testexpression 必ず指定します。
任意の数式または文字列式を指定します。
expressionlist-n

Case 節がある場合は、次の形式で必ず指定します。
また、複数指定するときは、カンマ (,) で区切ります。
expression
expression To expressionIs
comparisonoperator expression
引数 expression には数式または文字列を、引数 comparisonoperator には比較演算子を指定します。
キーワード To は、値の範囲を指定するキーワードです。
キーワード To を使って値の範囲を指定するときは、小さい方の値を先 (左側) に指定してください。
キーワード Is は、値の範囲を指定するキーワードで、Is 演算子と Like 演算子以外の比較演算子と共に使われます。
キーワード Is は指定しなくても自動的に設定されます。

statements-n 省略可能です。
引数 testexpression が引数 expressionlist-n のいずれかと一致するとき、一致した引数 statements-n のステートメントが実行されます。
elsestatements 省略可能です。
引数 testexpression が Case 節のいずれとも一致しないとき、引数 elsestatements のステートメントが実行されます。

少しわかり易く、日本語で構文を書くと、

Select Case 変数または式
  Case 条件式1
    条件1の時に実行する命令
  Case 条件式2
    条件1の時に実行する命令
  ・・・
  Case Else
    上記の条件以外の時に実行する命令
End Select


Select Caseの後ろに書く、変数または式には、
変数、定数、オブジェクト式、関数等々、何らかの値を返す全ての式を書くことが出来ます。
ここに書かれた、変数または式の値が、
Caseに書かれた条件に一致するかを、上から順に判定していきます。
※公式テキストでは「複数の条件を同時に判定」と書かれていますが、
  同時には判定しません。
  上から順に判定し、条件が満たされれば、それ以降の条件は判定しません。

Caseの条件を上から順に判定し、一致したCase内の命令が実行されます。
Case内の命令が実行された後は、End Selectの後ろに制御が移ります。

全てのCaseの条件に合致しない場合は
Case Elseが書かれていれば、Case Else内の命令が実行され、
Case Elseが省略されていれば、Select Caseは何も処理しません。


Case条件式の書き方
条件式には、
変数、定数、オブジェクト式、関数等々、何らかの値を返す全ての式を書くことが出来ます。
Select Caseの後ろの値と、Caseの後ろの値とを比較します。

以下の値は、変数や式の結果としての値として理解してください。

Case 値
 値と同値であるかの判定となります。

Case 値1, 値2, 値3 ・・・
 カンマで区切られた値をOr条件で判定します。
 値1 Or 値2 Or 値3 ・・・

Case 値1 To 値2
 値1から値2の範囲判定です。
 >=値1 And <=値2

Case Is 比較演算子 値
 比較演算子は、>,<,>=,<=になります。(=も書けますが使う意味がありません)
 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~ElseIf~End Ifは、Select Caseで書き直すことが出来ます。

If 条件式1 Then
  条件式1が真の処理
ElseIf 条件式2
  条件式2が真の処理
ElseIf 条件式3
  条件式3が真の処理
Else
  全ての条件式が偽の処理
End If


これは、

Select Case True
  Case 条件式1
    条件式1が真の処理
  Case 条件式2
    条件式2が真の処理
  Case 条件式3
    条件式1が真の処理
  Case Else

    全ての条件式が偽の処理
End Select

上記2つは、同一となります。
TrueはBooleanの値です。
条件式はTrueまたはFalseを返します。
従って、この2値の比較が行われるということです。

Do...Loop

繰り返し処理のステートメントです。


繰り返しのステートメントとしては、For~Nextがありますが、
その違いは、
For~Nextは、繰り返す回数を指定するものです。
Do~Loopは、繰り返す条件を指定するものです。


Do~Loopの構文

Do [{While | Until} condition]
  [statements]
  [Exit Do]
  [statements]

Loop

または、次の構文を使用できます。

Do
  [statements]
  [Exit Do]
  [statements]

Loop [{While | Until} condition]


condition 省略可能です。
真 (True) または偽 (False) を評価する数式、あるいは文字列式を指定します。
引数 condition の値が Null 値の場合、引数 condition は偽 (False) であるとみなされます。
statements 引数 condition が真 (True) である間、または引数 condition が真 (True) になるまで繰り返し実行される、
任意の行数のステートメントを記述します。


書き方のパターンが複数ありますので、
日本語で簡略化して、パターンを示します。


Do
  ・・・処理・・・
Loop
無限にループします。
従って、
処理内で、Exit DoまたはExit Sub等で処理を抜ける必要があります。


Do While 条件式
  ・・・処理・・・
Loop

Doループの最初に条件が判定されます。

条件が満たされている間、ループ内の処理が繰り返されます。
つまり、
条件が満たされなくなった時に、ループを抜けます。


Do Until 条件式
  ・・・処理・・・
Loop

Doループの最初に条件が判定されます。

条件が満たされるまで、ループ内の処理が実行されます。
つまり、
条件が満たされた時に、ループを抜けます。


Do
  ・・・処理・・・
Loop While 条件式

Doループの最後に条件が判定されます。
ループに入るときに条件判定をしないので、少なくとも1回はループ内の処理が実行されます。

条件が満たされている間、ループ内の処理が繰り返されます。
つまり、
条件が満たされなくなった時に、ループを抜けます。


Do
  ・・・処理・・・
Loop Until 条件式

Doループの最後に条件が判定されます。
ループに入るときに条件判定をしないので、少なくとも1回はループ内の処理が実行されます。

条件が満たされるまで、ループ内の処理が実行されます。
つまり、
条件が満たされた時に、ループを抜けます。


条件式は、Ifステートメント等が書く条件式と同じ書き方になります。


例文です。
A1セルからA10セルに、1を入れる場合です。

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は、条件を満たす迄

従って、
WhileUntilの条件は、補集合の関係になります。
つまり、
Not(Whileの条件) = Untilの条件Whileの条件 = Not(Untilの条件)
の関係になります。

また、
i = 1
これは、変数iに、1を入れています。

そして、
i = i + 1
これは、変数iに1を足して、変数iに入れ直しています。
つまり、変数iは、1増える事になります。

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のネスト(入れ子)

縦10行、横10列に1を入れる場合です。

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 は、配列やコレクションの各要素に対して繰り返し処理を実行します、

※For Eachでは配列も扱えますが、試験に出る可能性は低いと思います。
  使い方はコレクションと同じなので、コレクションをしっかり覚えておけば問題ありません。
  以下では、コレクションの場合を説明します。

コレクションはオブジェクトの集まりですので、
For Each は、コレクションの中から、個別のオブジェクトを取り出して処理する場合に使用します。

コレクションの全ての要素に対し処理を行うと、ループは終了します。

For Each の構文
For Each element In group
  [statements]
  [Exit For]
  [statements]

Next [element]

element 必ず指定します。
コレクションの各要素を繰り返す変数を指定します。
引数 element にはバリアント型 (Variant) 変数、総称オブジェクト型変数、または任意の固有オブジェクト型のオブジェクトの変数を指定できます。
group 必ず指定します。
オブジェクト コレクション名を指定します。
statements 省略可能です。
引数 group の各メンバに対して実行するステートメントを指定します。


elementのデータ型について
elementに指定するデータ型は、コレクションの要素であるオブジェクトの型になります。
しかし、オブジェクトの型が不明な場合もあります。
その場合は、VariantやObjectを使って指定します。

Variant(バリアント型) > Object(総称オブジェクト型) > 固有オブジェクト型

固有オブジェクト型が不明な場合は、総称オブジェクト型やバリアント型でも良いのですが、
そもそも、コレクション名は分かっている訳ですから、
コレクション名の最後のsを取れば、それで通常は固有オブジェクト型になります。

Dim 変数 As ○○○
For Each 変数 In ○○○s
 ・・・
Next 変数


○○○がオブジェクト、○○○sがコレクションです。


使用例

Dim ws As Worksheet
For Each ws In Worksheets
  ws.PrintPreview
Next ws

これで、全シートが印刷プレビューされます。
(印刷プレビューについては、後々説明します。)

これは、For Eachを使わずに書くと、

Dim i As Integer
For i = 1 To Worksheets.Count
  Worksheets(i).PrintPreview
Next i

このようになります。

.Countはコレクションの要素数です。


RangeオブジェクトのFor Each

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,・・・
の順に処理されます。
つまり、
処理順は、シートの横→縦ということです。

試験では、間違えやすい問題として出題しやすいので、確実に覚えておいてください。

その他

Exitステートメント
Do...Loop ループ、For...Next ループ、Function、Sub、これらの各プロシージャを抜ける時に使います。

以下の4通りの使い方があります。

Exit Do
 Do~Loopの中から抜けます。

Exit For
 For~Nextの中から抜けます。

Exit Function
 Function~End Functionの中から抜けます。

Exit Sub
 Sub~End Subの中から抜けます。

Exit For
指定の終了数値に達する前に、
For~Nextのループ処理を終了したい場合に使用します。

通常のFor~Nextは指定回数繰り返す為に使うので、Exit Forを使う事はすくないのですが、
特定の条件になった場合は、指定回数の処理を完了する前にループを抜けたい場合に使用します。

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列に既に値が入っていたら、そこで終了するという処理になります。

Fortがネストされている場合は、
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のループ処理を終了したい場合に使用します。

良く使う場合としては、

Do
 処理を終了したい時に、Exit Do
Loop

このように、Doに終了条件を書かずに、
ループの中で、終了条件を判定し処理を終了する場合には、Exit Doを使います。

Midステートメント

Midステートメントは、文字列変数の一部を他の文字列に置き換えます。
これは、VBAのステートメントで、Mid関数とは根本的に違うものです。


Mid関数は、文字列の一部を取り出す関数ですが、
Midステートメントは、文字列の一部を置換するものです。

試験に出る可能性は低いとは思いますが、
VBA上級者では常識的なステートメントになりますので、一応は覚えておきましょう。

Midステートメント

Mid(stringvar, start[, length]) = string

stringvar 必ず指定します。
変更する文字列変数の名前を指定します。
start 必ず指定します。
バリアント型 (内部処理形式 Long) の値を指定します。
引数 stringvar の中の置き換えを始める位置を文字数単位で指定します。
length 省略可能です。
バリアント型 (内部処理形式 Long) の値を指定します。
置き換えを行う文字数を指定します。
省略すると、文字列すべてが対象となります。
string 必ず指定します。
新しく置き換える文字列式を指定します。

Midステートメントの実行しても、元の文字列の文字数は変更できません。

startに、stringvarの文字数よりも大きい値を指定するとエラーとなります。
start + length が、stringvarの文字数を超える場合は、stringvarの文字数までが置換対象となります。
string(置き換える文字列)がlengthを超えている場合は、lengthの文字数までが有効となります。
実際には、lengthは省略し、stringの文字数が置換されるようにします。


使用例.

Dim MyString As String
MyString = "ABCDEF"
Mid(MyString, 3, 2) = "cd"
MsgBox MyString

”ABcdEF”と表示されます。

【業務改善の実務】

Select Case、Do...Loop、For...Each
これらを使いこなすことは、実務でのVBA開発では必須になります。

これらは、1点の曇りも無く覚えなくてはなりません。

多肢分岐なら、Select Case
複数ファイル処理なら、Do...Loop
コレクション処理なら、For...Each


考えるまでも無く、これらが使えるようになっておきましょう。

【本サイト内の関連ページ】

第17回.繰り返し処理(Do Loop)
・Do~Loopの構文 ・条件式 ・Do Loop 例文 ・Exit Do ・Do~Loopのネスト(入れ子) ・最後に一言

第22回.条件分岐(Select Case)
・Select Caseステートメントの構文 ・Select Case の例文 ・Select Case の応用

第59回.コレクション処理(For Each)
・For Each の構文 ・Exit For ・For Each の使用例 ・RangeオブジェクトのFor Each ・For Each サイト内の参考ページ

第101回.Midステートメント
・Midステートメント ・MidBステートメント ・Midステートメントの使用例 ・Midステートメントの必要性 ・実践での使用例

VBAエキスパート公式テキスト

2019/5/30発売リニューアル版


2019/7/26発売リニューアル版

こちらは必須として購入した方が良いでしょう。
ちょっと高いなーとは思いますが、
書籍を購入することで、学習用データが提供されています。
・サンプルブック
・VBAエキスパート模擬問題
これらが使えるようになります。
このシリーズでは、テキストを読みながら学習していることを前提とします。



同じテーマ「VBAエキスパート対策」の記事

VBAベーシック試験対策まとめ
プロシージャ
イベント
ステートメント(スタンダード)
関数
エラーへの対処
APIとOLEオートメーション
変数と配列
レジストリの操作
ファイルの操作
ユーザーフォームとメニューの操作


新着記事NEW ・・・新着記事一覧を見る

ブール型(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)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ