えのきの備忘録

お金や選挙などについての備忘録です(本記事のリンクには広告が含まれています)

Excel VBAを勉強したメモ書き③

えのき

Excel VBAを勉強したので、自分用のメモを残しておきます。


ちなみに、メモ書き①、②は以下の記事です。



ちなみに、私が初めてExcel VBAを勉強したのは、こちらの本でした。

いちばんやさしいExcelVBAの教本 人気講師が教える実務に役立つマクロの始め方 (「いちばんやさしい教本」シリーズ)
いちばんやさしいExcelVBAの教本 人気講師が教える実務に役立つマクロの始め方 (「いちばんやさしい教本」シリーズ)
インプレス
伊藤潔人

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関数)

上の例では、繰り返し回数を「10回」と指定してマクロを書いた。


しかし、中には繰り返し回数を自動で数えたい場合もある。

そんなときは「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」と書くことで、画面の更新を停止できる。


とりあえず今日はここまで。