Excel VBAを勉強したメモ書き③
Excel VBAを勉強したので、自分用のメモを残しておきます。
ちなみに、メモ書き①、②は以下の記事です。
ちなみに、私が初めてExcel VBAを勉強したのは、こちらの本でした。
VBAの文法について詳しく書かれているので、しっかりと構造を理解したい方にオススメです。
Excel VBAの基本構文
ループ処理①(For~Next文)
同じ処理を10回繰り返したいときは、以下のような「For~Next文」を用いる。
Sub マクロ名()
Dim i
For i = 1 To 10 '10回繰り返す
(繰り返したい処理)
Next
End Sub
具体例は、以下の通り。
Sub 選択セルから10回合計する_ForNext()
Dim i
For i = 1 To 10 '10回繰り返す
Selection.Value = Selection.Offset(0, -2).Value _
+ Selection.Offset(0, -1).Value
Selection.Offset(1, 0).Select
Next
End Sub
For~Next文は、1ステップごとに進む(「i = i + 1」は必要ない)。
ループ処理②(Do~Loop文)
同じ処理を10回繰り返したいときは、以下のような「Do~Loop文」を用いる。
変数iの値が10になったら、ループを抜ける。
Sub マクロ名()
Dim i
Do
(繰り返したい処理)
i = i + 1
Loop Until i = 10 '変数iが10になるまで繰り返す
End Sub
具体例は、以下の通り。
Sub 選択セルから10回合計する_DoLoop()
Dim i
Do
Selection.Value = Selection.Offset(0, -2).Value _
+ Selection.Offset(0, -1).Value
Selection.Offset(1, 0).Select
i = i + 1
Loop Until i = 10 '10回繰り返す
End Sub
また、繰り返し終了条件を「合計する値が0(空白)になったとき」に設定すると、以下のように書くこともできる。
Sub 選択セルから最終行まで合計する_DoLoop2()
Do
Selection.Value = Selection.Offset(0, -2).Value _
+ Selection.Offset(0, -1).Value
Selection.Offset(1, 0).Select
Loop Until Selection.Offset(0, -1).Value = 0 '選択セルの隣が0になったとき
End Sub
「For~Next文」と「Do~Loop文」の使い分け
For~Next文の特徴は以下の通り。
- 繰り返す回数を記載しなければならない(For i = 1 To 10)
- 多い回数(1000回とか)でも可能
一方で、Do~Loop文の特徴は以下の通り。
- 繰り返しの終了条件を設定できる
- 繰り返し回数が決まっていなくてもOK
なので、使い分けとしては以下の通り。
- 繰り返し回数が決まっているとき
⇒For~Next文 - 繰り返し回数が決まっていない(繰り返しの終了条件はある)
⇒Do~Loop文

繰り返し回数を自動で数える(COUNTA関数)
- COUNTA関数(カウントエー関数):
文字列や数値など「何かしら入力されている」セルの個数を数える関数
For~Next文の場合は、以下の通り。
Sub 選択セルから10回合計する_ForNext_COUNTA()
Dim i
For i = WorksheetFunction.CountA(Range("B:B")) - 1 '項目名を除くので-1する
Selection.Value = Selection.Offset(0, -2).Value _
+ Selection.Offset(0, -1).Value
Selection.Offset(1, 0).Select
Next
End Sub
Do~Loop文の場合は、以下の通り。
Sub 選択セルから最終行まで合計する_DoLoop3()
Dim i
Do
Selection.Value = Selection.Offset(0, -2).Value _
+ Selection.Offset(0, -1).Value
Selection.Offset(1, 0).Select
i = i + 1
Loop Until i = WorksheetFunction.CountA(Range("B:B")) - 1 '項目名を除くので-1する
End Sub

マクロ作成のTips
- Do~Loop文で「Until~」を書き忘れると、無限ループする
- 無限ループの抜け方
Escapeボタン→「デバッグ」→「リセット」で中断される - 変数の宣言を強制する
モジュールの最初に「Option Explicit」と書くことで、使用している変数の整理ができる(宣言した変数しかマクロに書けない) - ウォッチウィンドウ
「表示」→「ウォッチウィンドウ」→変数を選択して右クリック→「ウォッチ式の追加」
変数を削除するときは、ウォッチウィンドウの該当行を右クリックして削除できる - 画面の更新を停止
処理に時間がかかるのは、画面を更新しているため
画面の更新なしで処理だけにすると、スピードアップする
マクロの始め(Sub マクロ名のすぐ下、変数の宣言の上)に「Application.ScreenUpdating = False」と書くことで、画面の更新を停止できる。
とりあえず今日はここまで。
