VBAエキスパート対策
ステートメント

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

ステートメント


・If...End If
・For...Next
・With...End With


【ここでのポイント】

VBAには、基本かつ最重要ステートメントが6つあります。
ベーシックでは、最初の3つまでになります。

If...End If
For...Next
With...End With

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

Select Caseからは、スタンダードの出題範囲になります。

この中でも、特に、If...End IfFor...Next については、どんなプログラミング言語においても存在するものです。
最も頻繁に使われるステートメントであり、プログラミング学習としては真っ先に学ぶべきものです。
ここの理解が不足していては、その先に進む意味がないと言っても良いでしょう。

試験問題も必ず複数出題されるはずですし、結構凝った問題となることも考えられます。
従って、ここは時間をかけてしかっりと学んでおく必要があります。
そして、
ここでの学習方法は、必ずタイピングして実際に動かしてください。
机上の勉強では、実際のVBAコードを見たときの読解能力が養われません。

If...End If

ある条件の時だけ処理したい事もあれば、条件によって処理内容を変更したい事もあります、
条件により処理を分岐させたい場合に使うのが、Ifステートメントです。


Ifステートメント

If 条件式 Then 真の処理 [Else 偽の処理]

または

If 条件式 Then
  真の処理
[Else
  偽の処理]
End If

[ ]内は省略可能です。

真とは、条件式を満たした場合
偽とは、条件式を満たさない場合


条件式

真(True)か偽(False)を評価する数式または文字列式を指定します。

数式とは、数値と比較演算子・論理演算子の組み合わせ、
文字列式とは、文字列と比較演算子・論理演算子の組み合わせです。

比較演算子 意味
= 等しい
<> 等しくない
> より大きい
>= 以上
< より小さい
<= 以下

論理演算子 意味
And 論理積
Or 論理和
Xor 排他論理和
Eqv 論理等価
Imp 論理包含
Not 論理否定

And、Or、Not以外の論理演算子は覚えなくて構いません。


例文1.

If Cells(1, 1) >= 100 Then Cells(1, 2) = "○"


A1セルが100以上の場合、B1セルに"○"


例文2.

If Cells(1, 1) > 100 Then
  Cells(1, 2) = "○"
End If


例文1.と同じです。


例文3.

If Cells(1, 1) > 100 Then
  Cells(1, 2) = "○"
Else
  Cells(1, 2) = "×"
End If


A1セルが100以上の場合、B1セルに"○"
A1セルが100未満の場合、B1セルに"×"


例文4.

If Cells(1, 1) > 100 Then Cells(1, 2) = "○" Else Cells(1, 2) = "×"


例文3.と同じです。
ただし、この使い方は一般的にもしませんし、出題されるとは思われません。


真偽を入れ替える方法

If Cells(1, 1) > 100 Then
  Cells(1, 2) = "○"
Else
  Cells(1, 2) = "×"
End If


この真と偽を入れ替える方法は、以下の2通りになります。

条件式の判定を変える
If Cells(1, 1) <= 100 Then
  Cells(1, 2) = "×"
Else
  Cells(1, 2) = "○"
End If

Not演算子を使う
If Not Cells(1, 1) > 100 Then
  Cells(1, 2) = "×"
Else
  Cells(1, 2) = "○"
End If


論理式を反転させる方法
論理式をその否定形に変換する場合は、比較演算子を以下の規則で入れ替えます。

And ⇔ Or
= ⇔ <>
> ⇔ <=
>= ⇔ <
< ⇔ >=
<= ⇔ >


もしくは、Not演算子で論理式全体を括弧で囲みます。

A = B And C = D

A <> B Or C <> D
または
Not (A = B And C = D)

どちらの書き換えもできるようにしておきましょう。


Ifのネスト(入れ子)

Ifステートメントをネストすることで、より複雑な条件分岐が可能です。

If Cells(1, 1) >= 100 Then
  If Cells(1, 1) >= 200 Then
    Cells(1, 2) = "A"    '>= 200
  Else
    Cells(1, 2) = "B"    '>=100 AND < 200
  End If
Else
  If Cells(1, 1) >= 50 Then
    Cells(1, 2) = "C"    '< 100 AND >= 50
  Else
    Cells(1, 2) = "D"    '< 50
  End If
End If


A1セルが
>= 200の場合、B1セルに"A"
>=100 AND < 200の場合、B1セルに"B"
< 100 AND >= 50の場合、B1セルに"C"
< 50の場合、B1セルに"D"

ネストのレベルに特に制限はありませんが、
実務としては、概ね3段階までにしましょう。
試験としては、2段階までしか出題されないと思います。


IfステートメントでのElsiIf

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

[]は省略可能です。


ElseIf 条件式 Then
  条件式が真の処理


この部分を繰り返し書く事が出来ます。

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


これを、ElseIfを使わずに書くと、

If 条件式1 Then
  条件式1が真の処理
Else

  If 条件式2
    条件式2が真の処理
  Else

    If 条件式3
      条件式3が真の処理
    Else
      全ての条件式が偽の処理

    End If
  End If
End If


これらは同じ処理になります。
多肢分岐の場合は、ElseIfを使う事でずっと見易くなります。

真偽の入れ替えや、
ElseIfを使ったVBAコードを、ElseIfを使わずに書き換える
これらは、すんなりできるようにしておきましょう。


実務としても、試験勉強としても重要になります。
この書き換えができるようなら、Ifステートメントを理解できているという判断にもなります。

For...Next

For Nextは、繰り返し処理をするためのステートメントです。
繰り返す処理をループ処理と言い、For Nextを使います。


For Next ステートメント

指定した回数だけ、一連のステートメントを繰り返すフロー制御ステートメントです。

構文

For counter = start To end [Step step]
  [statements]
  [Exit For]
  [statements]

  
Next [counter]

counter 必ず指定します。
カウンタに使う数値変数を指定します。
配列変数およびブール型 (Boolean) に含まれる変数は指定できません。
start 必ず指定します。
引数 counter の初期値を指定します。
end 必ず指定します。
引数 counter の最終値を指定します。
step 省略可能です。
ループを繰り返すごとに引数 counter に加算される値を指定します。
引数 step を省略すると、ループを繰り返すごとに引数 counter には 1 が加算されます。
statements 省略可能です。
ループ内で実行される一連のステートメントで、For と Next の間に記述します。
ここに記述したステートメントは、For...Next ステートメントで指定した回数だけ実行されます。

上記構文の余分なものを消して、日本語に直してみましょう。

For 変数 = 開始数値 To 終了数値
  ・・・処理・・・
Next

つまり、変数開始数値から終了数値になるまで繰り返すということです。


例文で理解を深めて下さい。


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

Sub 練習1()
  Dim i
  For i = 1 To 10
    Cells(i, 1) = 1
  Next i
End Sub

変数iが、1から10まで、自動的にアップしていきます

Cells(1, 1) = 1
Cells(2, 1) = 1
・・・
Cells(10, 1) = 1

と、順に、変数i1~10で実行してくれます。


では、1行目、3行目、5行目・・・のように、
1行置きにする場合

Sub 練習2()
  Dim i
  For i = 1 To 10 Step 2
    Cells(i, 1) = 1
  Next i
End Sub

Step 2

これが1行置きの指定です、iが2ずつ増えていきます

つまり、これを書かない時は、

Step 1

と言う事です。

このStepは、マイナス数値も指定できます

Step -1

とすれば、iは、1ずつ減っていきます。


Exit For

公式テキストでは、スタンダードで解説されています。
しかし、発表されている出題範囲はそこまで詳細に書かれていません。
従って、出題されないとも限りませんし、
何より、ここで概要だけでも一緒に学んでおくべきものです。

Exit Forは、For~Nextのループを抜けます。

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


For~Nextのネスト(入れ子)

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

Sub 練習3()
  Dim i, j
  For i = 1 To 10
    For j = 1 To 10
      Cells(i, j) = 1
    Next j
  Next i
End Sub

実行して、確認して下さい。

For~Nextのネストは何段階でも書けますが、
実務としても、2段階くらいまでが普通ですので、
試験対策としても、2段階までで良いでしょう。

With...End With

With ステートメントは、指定したオブジェクトに対してオブジェクト名を再定義することなく、一連のステートメントを実行することができます。


文章で言えば、主語を一度書いたら、その後は主語を省略するような書き方になります。

構文

With object
 [statements]

 ・・・
End With

With~End Withの間では、

Withに指定したオブジェクト名を省略できるようになります。


Withステートメントを使わない通常の記述では、


オブジェクト.プロパティ = 値

とするところを

With オブジェクト
 .プロパティ = 値
End With


このように書く事が出来るということです。

使用例

Worksheets(1).Cells(1, 1) = 1
Worksheets(1).Cells(2, 1) = 2


これを、Withを使って書くと、

With Worksheets(1)
  .Cells(1, 1) = 1
  .Cells(2, 1) = 2
End With


With~End Withの間では、

.で書き始めれば、.の前のWithのオブジェクトが省略できることになります。

Range("A1").Font.Bold = True
Range("A1").Font.Color = vbRed
Range("A1").Font.Size = 12


これを、Withを使うと、

With Range("A1")
  .Font.Bold = True
  .Font.Color = vbRed
  .Font.Size = 12
End With


これは、さらに

With Range("A1").Font
  .Bold = True
  .Color = vbRed
  .Size = 12
End With


このように書くこともできます。


Withのネスト

Withはネストする事も出来ます。

With Range("A1")
  With .Font
    .Bold = True
    .Color = vbRed
    .Size = 12
  End With
End With


Withがネストされている場合に、.の前の省略されているオブジェクトは、
直前(そのステートメントが含まれる最も内側)のWithステートメント


Withステートメントを使った時の、最も多い間違いは、先頭の「.」を書き忘れてしまう事でしょう。


試験問題として、これのひっかけ問題が出るとは思えませんが、
とにかく、Withが出てきたら.の有無をしっかり見るようにして下さい。

【業務改善の実務】

VBAを実務で使うには、ここの内容が必須です。
ここでのステートメントの理解無くして、実務でVBAを使う事は出来ません。

VBAをとにかく早く覚えたいのなら、
VBAの構文や変数の勉強に時間をかける前に、
とにかく最初に、
セルの操作と、このステートメントからここから始めることが早道です。
その他の事は、やりながら覚えるくらいでちょうど良いとも言えます。

そして、
とにかく書いて動かす
この繰り返しでしかマスターすることは出来ないと言っても良いでしょう。

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

第20回.条件分岐(If)
・Ifステートメントの構文 ・IFステートメントの条件式 ・Ifステートメントの使用例文 ・Ifステートメントのネスト(入れ子) ・サイト内のIfステートメント参考ページ ・最後に

第21回.条件分岐(ElseIf)
前回のIFステートメントでは、真か偽の二択でした。今回は、もっと多くの分岐が必要な、Ifステートメントで多肢条件分岐の場合の書き方です。ステートメントとしては、Ifステートメントです。IfステートメントのElseIfの構文 If条件式1Then 条件式1が真の処理 [ElseIf条件式2Then 条件式2が真の処理…

第16回.繰り返し処理(For Next)
・For Next ステートメント ・For Next 例文 ・For Next をステップ イン実行で目で見て確認しましょう。 ・1行置きに処理する場合 ・Exit For ・For~Nextのネスト(入れ子) ・最後に一言

第51回.Withステートメント
・Withの構文 ・Withを使った時と使わない時の比較 ・Withの使用例 ・Withのネスト ・Withを使ったときに気を付けるべき書き方 ・Withの使いどころ ・サイト内の参考ページ

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

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


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

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



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

VBAの構文
変数と定数
セルの操作
ステートメント
ブックの操作
シートの操作
デバッグデの基礎
マクロの実行
VBAベーシック試験対策まとめ
プロシージャ
イベント


新着記事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.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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


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