[PR]当サイトはアフィリエイト広告を利用しています。
はじめに
VBAゼロからシリーズです。
今回は「繰り返し」です。
決まった回数何らかの処理を繰り返すやり方を解説します。
そこで少し思い出していただきたいのがSUM()関数です。
エクセルでセルの合計を出したいというときよく使います。
あれはセルの範囲を指定したら、そのセルの合計が出力されますよね。
今回はそれをVBAで再現するという例題に取り組みます。
またそこで登場するのが「繰り返し」処理です。
指定したセルを読み込んで、足し算するというときにこの処理を使います。
少しずつ解説していきますので、読み進んでいただければと思います。
なおやや高度な内容として、エクセルソルバーの繰り返し処理について知りたい場合は以下の記事をご覧ください。
繰り返しの簡単な説明
次の簡単なプログラムで感覚をつかみましょう。
Sub sample()
Dim i As Integer
For i = 1 To 3
MsgBox i
Next i
End Sub
実行すると1、2、3と順番に表示されます。
ForとToの間に更新する変数を書きます。最初にiに1が代入されてForとNextの間の処理が実行されます。
iはNextに到達するたびに1ずつ増えて、Toの後に書かれた3まで増えます。3まで増えてからNextまで進むとFor文を抜けます。
これを流れ図で描くと次のようになります。
今回の例題
エクセルを開いてシートに次のように入力します。
B3: 1
B4: 4
B5: 6
B6: 11
B7: 3
このように入力します。
例題は次のようになります。
「B3からB7まで入力されている5つの数値の合計を求めよ」
エクセルの関数で求める場合
B8セルに次のように入力します。
=SUM(B3:B7)
B3:B7はB3セルからB7セルまでをドラッグすれば入力されます。
エンターキーを押したらB8セルに25と出力されたでしょうか?
VBAで求める場合
コード入力欄に次のように入力します。
初めにVBAコード全体を示して、その後ポイントごとに解説します。
Sub repeat()
Dim i As Integer
Dim s As Integer
s = 0
For i = 1 To 5
s = s + Cells(i + 2, 2).Value
Next i
Range("C8").Value = s
End Sub
VBAを実行したらC8セルに25と出力されたでしょうか?
初期値の定義
Dim i As Integer
Dim s As Integer
s = 0
変数iとsを定義します。
iが繰り返し処理用の変数。
sが足し算するとき用の変数。
sに初期値0を入力します。
合計を求めるアルゴリズムの解説
VBAにも合計を一発で求める関数みたいな命令文はあるのですが、繰り返し処理の練習のために足し算だけで求めます。
まずたくさんの値を足し算して合計を求めるという処理を手作業で考えてみましょう。次の図をご覧ください。
まず数値列の一番上の1と次の4を足します。答えは5ですね。
そしてこの5に次の数値である6を足します。答えは11ですね。
そしてこの11に次の数値である11を足します。答えは22ですね。
そしてこの22に最後の数値である3を足します。答えは25ですね。
これで合計値25が求められました。
やっていることはsという変数に計算結果を格納して、数値列の値を一つずつ足していって最後まで到達したら終了という処理です。
これをプログラムの文法に従って記述すれば合計値が求められます。
Range()と同じくらい重要なCells()
今回見慣れないCells()という命令文が出てきました。
まずこれについて解説します。
エクセルのセルにはセルごとに番地のようなものが設定されています。
次の図をご覧ください。
右の表がセルの番地です。
カンマ記号の左と右に数値がありますね。
左が縦の何番目かを表しています。
右が横の何番目かを表しています。
Cells()はこの番地を指定することでその番地のセルの情報を取得できる命令文です。
Cells(1,1)でA1セルを、Cells(2,3)でC2セルの値を取得します。
Range()と同じく.Valueをつけます。
つけなくても動きますけどわかりやすさのために今回はつけることにします。
なぜRange()があるのにCells()を使うのかということですが、Range()はこのセルの番地を指定できないのです。あくまでA1とかB4とかエクセルの表記に従ってセルの情報を扱うのがRange()なのです。
セルの番地で管理できる命令がCells()です。
なぜ番地で管理するとよいかという話ですが、これは「繰り返し」処理と相性が良いからです。
Range(“A1”)の下に向かうとRange(“A2”)ですね。
1を2に進めればよいです。
しかしRange(“A1”)の右に向かうとRange(“B1”)ですね。
AをBに変更する必要があります。
これが面倒なのです。
プログラミングをやっていくとわかるのですが、セルを繰り返し処理するときは数値で表現された番地で管理したほうがコードを書きやすいのです。
そのときのためにCells()という命令文があると覚えていただければと思います。
繰り返し処理
For i = 1 To 5
s = s + Cells(i + 2, 2).Value
Next i
初めてFor文が出てきました。
これは繰り返し処理を記述する命令文です。
Forの後に
i = 1
とあります。
これは繰り返しの最初にiを1にするという意味です。
Toの後に5とあります。
これはiを5まで1ずつ増やすという意味です。
Nextのあとにiとあります。
これはForのすぐ後に指定した変数を書くおまじないくらいの理解でかまいません。
For ToとNextの間に記述されるのが本体です。
この本体が、iが1の状態でまず実行されます。
次にiが2になって本体がまた実行されます。
次にiが3になって本体がまた実行されます。
…
最後にiが5になって本体が実行されて終了します。
本体の解説をします。
s = s + Cells(i + 2, 2).Value
「=」の左と右にsがあります。
この書き方をすると「=」の右の計算をしてから左に値が格納されます。
右のsは「現在のs」という意味です。
左のsは「計算した後のs」という意味です。
Cells(i + 2, 2).Valueというのがiの変化に合わせてどう変化するか見ていきます。
最初のiは1でした。
つまり最初の本体は
s = s + Cells(3,2).Value
です。
Cells(3,2)はRange(“B3”)ですね。
sの初期値は0でしたから、「=」の右側は0 + 1で1ですね。
これが左側のsに格納されます。
これが実行されるとiが2になってまた本体が実行されます。
s = s + Cells(4,2).Value
です。
Cells(4,2)はRange(“B4”)ですね。
現在のsの値は1でしたから、1に4が足されてsに5が格納されます。
すると今度はiが3になって本体が実行されます。
…
これを繰り返すとiが5になって最後の本体の実施です。
最後は
s = s + Cells(7,2).Value
です。
計算していくとsの中身が22のときに3を足す処理となります。
そしてFor文はすべて終了です。
最後に
Range(“C8”).Value = s
を実行してC8セルに合計を求めたsの値を格納します。
For文を使わずにVBAで合計を求める(エクセル関数をVBAで呼び出す)
VBAはエクセルの関数を呼び出すこともできます。
こんな方法もあるよ、というくらいの気持ちで読んでいただければ幸いです。
Sub sum()
Range("D8").Value = WorksheetFunction.sum(Range("B3:B7"))
End Sub
WorksheetFunction.sum(Range(“B3:B7”))
と書けば
=SUM(B3:B7)
と同じ結果が出力されます。
SUMと大文字だったのが、sumと変更されています。
また
(B3:B7)だったのが(Range(“B3:B7”))と変更されています。
少しの違いがありますけど、エクセル関数に慣れている場合はこのほうがわかりやすいですね。
今回は繰り返し処理を解説するためにFor文で合計を求めただけです。
使いやすい方法で求めればいいと思います。
まとめ
今回は繰り返し処理を解説しました。
Cells()の概念は数学の行列と似たような概念なので慣れるまで時間がかかるかもしれません。
色々コードを書いていく中で慣れていけばいいと思います。
For文も初めての場合は慣れるのに時間がかかります。
こちらも色々なコードを書いて慣れていけばいいと思います。
その入り口として今回の記事を書いてみました。
基本的に抽象を覚えたからあらゆる具体が扱えるということはありません。
つまりFor文の書き方の外枠だけ覚えてもあらゆる状況でFor文が適切に書けるという話ではないのです。
外枠を覚えたら、色々な具体例で枠を使っていくことで色々な応用ができるようになっていきます。
少しずつ経験を積みましょう。だんだん使えるようになっていくはずです。
ここまでで「条件分岐」と「繰り返し」を解説したので、使い方次第では色々なコードが書けます。つまり「条件分岐」と「繰り返し」を組み合わせるということです。
それについては次回以降で解説していく予定ですのでご覧いただけましたら幸いです。