今まで5万人以上のユーザーにVBAを教えてきた経験でいうと、多くのビギナーにとって「変数の使い方」はVBAの学習を投げ出す原因のひとつです。その中でもA = A + 1という書き方、というか概念は、多くのビギナーを悩ませてきました。だって、「A」と「A + 1」はゼッタイ等しくないのに「A = A + 1」だなんてあり得ない・・・と。
VBAでは、記号の「=」は2つの意味を持ちます。
「等しい」として使う「=」は、数学で習う「=」と同じです。これは、主にIfステートメントなどの条件判定で使われます。
Sub Sample1() If Range("A1") = Range("B1") Then MsgBox "等しいです" Else MsgBox "等しくないです" End If End Sub
上のコードでIfステートメントの条件に指定しているのは「もし、セルA1とセルB1が等しかったら」という意味です。もうひとつ、「=」は右辺を左辺に代入するという働きもあります。これは、いわば
左辺 ← 右辺
のようなイメージです。たとえば次のように使います。
Sub Sample2() Range("A1") = 100 End Sub
この短いコードは、セルA1に数値の100を代入します。右辺の100を、左辺のセルA1に代入せよという命令です。イメージ的には
セルA1 ←100
という感じです。
ここで大事なことは、右辺を左辺に代入するのですから、必ず右辺を先に計算しなければならないということです。
Range("A1") = 100
は、問題ないですね。では
Range("A1") = 100 + 50
ではどうでしょう。右辺を左辺に代入するには、先に右辺の「100 + 50」を計算しなければ、代入する値が確定しません。ですから、「=」による代入は、必ず右辺を先に計算しなければならないのです。であれば、
Range("A1") = Range("A1") + 1
も、先に右辺の「Range("A1") + 1」を計算して、その結果を左辺の「Range("A1")」に代入することになります。このルールをイメージできれば、次のコードの意味もわかりますよね。
Sub Sample3() Dim i As Long, A As Long For i = 1 To 3 A = A + 1 Next i MsgBox A End Sub
For Nextステートメントで3回繰り返しを行います。実行するのは「A = A + 1」です。なお、長整数(Long)型の変数は、宣言した直後は0です。
これを応用すると、個数をカウントしたり、数値を合計することができます。たとえば、次のようなデータがあったとします。
このデータから
するには、どうしたらいいでしょう。
2行目から13行目まで、順にセルを調べることは明白です。ということは、For Nextによる繰り返しを使って
Sub Sample1() Dim i As Long, A As Long For i = 2 To 13 A列のi行目を調べて処理する Next i MsgBox A End Sub
という流れになります。変数Aは、個数をカウントしたり、合計を計算したりするときに使います。
まず「"田中"の個数をカウントする」には
Sub Sample1() Dim i As Long, A As Long For i = 2 To 13 もし A列のセルが 田中 だったら 変数 A を 1 ずつ増やす Next i MsgBox A End Sub
ですね。もし~だったら…は、Ifステートメントです。変数Aを1ずつ増やすのは、上で解説した「A = A + 1」を使います。
Sub Sample1() Dim i As Long, A As Long For i = 2 To 13 If Cells(i, 1).Value = "田中" Then A = A + 1 End If Next i MsgBox A End Sub
では「"田中"の数値を合計する」場合はどうでしょう。もしA列が"田中"だったら・・・変数Aに、次々と数値を足し込んでいきます。「A = A + 1」は変数Aが1ずつ増えていきます。この「1」を「B列の数値」に置き換えれば、B列の数値を合計できます。
Sub Sample1() Dim i As Long, A As Long For i = 2 To 13 If Cells(i, 1).Value = "田中" Then A = A + Cells(i, 2).Value End If Next i MsgBox A End Sub
「A = A + 1」は、カウンター(交通量調査などでやっているアレ)をカチカチと押すイメージです。一方の「A = A + セル」は、セルの値を次々と電卓に足し込んでいくイメージです。
Excelには、COUNTIF関数やSUM関数など便利な関数がたくさんあります。個数を数えるときは「COUNTIF関数を使う」あるいは、数値を合計するときは「SUM関数を使う」と、目的を達成するために、何かそれ専用の関数なり仕組みを利用することが多いです。しかし、そもそも個数をカウントするとは、数値を合計するとは、どういうことかを突き詰めれば、それは「A = A + 1」であり「A = A + セル」なんです。マクロを作成するときは、そうしたプログラミング的な発想が重要になります。