この記事ではプログラミング初心者向けに、VBAの基本を分かりやすく解説しています。
主に繰り返し処理(ループ処理)の基本事項を解説しています。
※当サイトではVBAの基本を解説しています。
もし、VBAの基本が分からなければ、下記リンクより基礎を学習できます。
⑤VBAの繰り返し処理について解説(本記事)
⑦Excelでバックテストする方法。【VBAによるツール開発】
プログラミング知識ゼロからシステムトレードを自作できるようになった経験を活かし、この記事を書いてます。
VBAの繰り返し処理とは?
繰り返し処理とはループ処理とも呼ばれ、特定の処理を条件を満たすまで繰り返す処理になります。
例えば、移動平均の作成プログラムは以下の図のようになります。
※移動平均とは特定期間の終値の平均です。(今回は5日で計算)
Range(“C6”) = (Range(“B2”) + Range(“B3”) + Range(“B4”) + Range(“B5”) + Range(“B6”)) / 5
Range(“C7”) = (Range(“B3”) + Range(“B4”) + Range(“B5”) + Range(“B6”) + Range(“B7”)) / 5
End sub
今回のプログラムで求めた移動平均は2つです。
これが100個分必要になる場合はどうプログラミングするべきでしょうか?
非効率的でスマートではありません。
ここで役に立つのが繰り返し処理になります。
VBAの繰り返し処理構文
基本的な繰り返し処理のFor文を紹介します。
For文は指定した回数分、処理を繰り返します。
For分
構文は以下のとおりです。
‘ここに処理を記載
Next 変数 ‘(変数は省略可能)
黒太字はこのまま入力し、赤字は任意の値をいれます。
ForとNextの横の変数は同じものを入力します。
初期値、終了値 は数字もしくは数字として認識される変数(Integer、Long)などを入力します。
For分の説明
初期値から終了値までFor~Next間に記載された処理が繰り返されます。
初期値が「1」で終了値が「100」であれば100回の処理を繰り返すことになります。
また、変数には繰り返しの間に1~100までの値が代入されます。
For分ではこの変数をうまく使うことがキーになります。
※変数はカウンタ変数と呼ばれ、慣例的に小文字の「i」,「j」,「l」などが使われます。
あくまで慣例のため、任意の名前でもOKです。
例 100日分の移動平均を作成するプログラム
まずはNG例です。
Sub 移動平均算出()
Dim i As Integer ‘For文のカウンタ変数を宣言
For i = 1 To 100 ‘100回繰り返す
Range(“C6”) = (Range(“B2”) + Range(“B3”) + Range(“B4”) + Range(“B5”) + Range(“B6”)) / 5
Next
End sub
上記のコードは、同じセル範囲の移動平均を100回算出するため、100回計算させる意味がありません。
次に正しい例です。
Sub 移動平均算出()
Dim i As Integer ‘For分のカウンタ変数を宣言
For i = 6 To 106 ‘初期値は1である必要なし
Cells(i, 3) = (Cells(i – 4, 2) + Cells(i – 3, 2) + Cells(i – 2, 2) + Cells(i – 1, 2) + Cells(i, 2)) / 5
Next
End sub
コードの説明
Cells(1, 3)
上記のコードは、セルに対して処理するためのコードです。
Range(“A1”)との違いは、数値でセルの座標を指定できることです。
Cells(1,3)の最初の「1」は行を表し、次の「3」は列を表します。
つまり、Cells(1,3)はC3セルを表します。
Cells(i, 3) = (Cells(i – 4, 2) + Cells(i – 3, 2) + Cells(i – 2, 2) + Cells(i – 1, 2) + Cells(i, 2)) / 5
このコードの左辺Cells(i, 3)は、移動平均の算出先を表します。
右辺は移動平均の計算元データです。
また、For構文でのカウンタ変数「i」の値が繰り上がる特性を活かし、i-nとすることで行を指定しています。
移動平均で使用するデータ数は5個のため、i、i-4、i-3、i-2、i-1の5行分のデータの合計を算出し、5で割ることで移動平均を算出します。
もし、i=6であれば
i-4が2行目
i-3が3行目
i-2が4行目
i-1が5行目
iが6行目 となります。
For文では、上記で解説した移動平均の算出を100回分繰り返しています。
初期値、終了値 をそれぞれ6、106とした理由は、移動平均を計算するために5つ分のデータを使用するため、一番最初に移動平均が算出されるセルは「C6」セルとなるからです。
このように、For分を使用することで大量のデータ処理が可能になります。
また、For分の中にFor分を作ることで、入れ子(ネスト)構造にすることもできます。
最初のループを1~100とし、その中のループを1~10とした場合、1~10のループを100回ループさせ、合計1000回の処理を可能にします。
このようにダブルループもよく使う処理のため、覚えておきましょう。
例
Sub 移動平均算出()
Dim i As Integer ‘1つ目のループのカウンタ変数を宣言
Dim j As Integer ‘2つ目のループのカウンタ変数を宣言
For i = 1 To 100
For j = 1 to 10
’ここに処理を記載
Next j
Next i
End sub
補足事項 インデントについて
インデントとはプログラミングする際、行の先頭に空白を入力し、字下げを行うことです。
インデントはキーボードの「TABキー」を押すことで可能です。
インデントはしてもしなくても、プログラムの結果に影響はありませんが、プログラムを書くときやデバックする際に視覚的に分かりやすくなります。
※デバックとはプログラムのバグを修正することです。
以下の例で説明します。
インデントしていないコード
Dim i As Integer
Dim j As Integer
Dim l as Integer
For i = 1 To 100
For j = 1 to 10
For l = 1 to 10
‘ここに処理を記載
Next
Next
Next
End sub
インデントしているコード
Dim i As Integer
Dim j As Integer
Dim l as Integer
For i = 1 To 100
For j = 1 to 10
For l = 1 to 10
’ここに処理を記載
Next
Next
Next
End sub
どちらも同じ3重ループのFor文です。
インデントしているコードのほうが、For構文の入れ子構造が分かりやすくなっています。
インデントしたほうがわかりやすい!
VBAでのインデントは任意ですが、
わかりやすいプログラムを書くために、
インデントするくせをつけましょう。