A = A + 1の意味


今まで5万人以上のユーザーにVBAを教えてきた経験でいうと、多くのビギナーにとって「変数の使い方」はVBAの学習を投げ出す原因のひとつです。その中でもA = A + 1という書き方、というか概念は、多くのビギナーを悩ませてきました。だって、「A」と「A + 1」はゼッタイ等しくないのに「A = A + 1」だなんてあり得ない・・・と。

VBAでは、記号の「=」は2つの意味を持ちます。

  1. 右辺と左辺が等しい
  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です。

  1. For Nextの繰り返しが始まる前
    変数Aの値は [0] です

  2. For Nextの1回目
    A = [0] + 1
      ↓
    A = 1
    変数Aに [1] が入る

  3. For Nextの2回目
    A = [1] + 1
      ↓
    A = 2
    変数Aに [2] が入る

  4. For Nextの3回目
    A = [2] + 1
      ↓
    A = 3
    変数Aに [3] が入る

  5. For Nextが終了したあと
    変数Aの値は [3] です

プログラミング的な発想

これを応用すると、個数をカウントしたり、数値を合計することができます。たとえば、次のようなデータがあったとします。

このデータから

  • "田中"の個数をカウントする
  • "田中"の数値を合計する

するには、どうしたらいいでしょう。

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 + セル」なんです。マクロを作成するときは、そうしたプログラミング的な発想が重要になります。