情報学入門(データ演習) / 第 2 章

シート上の計算

Value と Formula ── 「答えを入れる」と「式を入れる」は違う

この章のねらい

1. セルを読んで、計算して、書く

プログラムの基本の形は入力 → 処理 → 出力です。 表計算の上では、これがそのまま「読む → 計算する → 書く」になります。

Sub Macro2()
    ' ① 読む
    Dim tate As Double
    Dim yoko As Double
    tate = Cells(1, 2).Value
    yoko = Cells(2, 2).Value

    ' ② 計算する
    Dim menseki As Double
    Dim shuui As Double
    menseki = tate * yoko
    shuui = (tate + yoko) * 2

    ' ③ 書く
    Cells(3, 1) = "面積"
    Cells(3, 2) = menseki
    Cells(4, 1) = "周の長さ"
    Cells(4, 2) = shuui
End Sub

B1 と B2 の値は、あらかじめ入れてあります(8 と 5)。 プログラムの中で tate = 8 と書いてしまうと、 値を変えるたびにプログラムを書き直さなければなりません。 データはシートに、手順はプログラムに ── この分け方が、あとで効いてきます。

2. Value と Formula

元資料 15 枚目に、こうあります。

「さらに、数式を代入する時は、Formula プロパティを用いる。 Range("A1").FormulaCells(1,3).Formula のように書くこともできる。」

ここが、この章のいちばん大事なところです。同じセルに対して、2 通りの入れ方があります。

.Value = 40.Formula = "=B1*B2"
セルに入るもの答えそのもの(40 という数)計算のしかた(式)
画面に見えるもの4040(Excel が計算した結果
B1 を 8→10 に変えると40 のまま50 に自動で変わる
数式バーに表示されるもの40=B1*B2

このページの処理系では、数式は計算されません。 .Formula = "=B1*B2" と書くと、 =B1*B2 という文字列がそのまま入ります (Excel の計算エンジンは持っていないためです)。 下のモデルでその様子が見えます ── 本物の Excel との違いとして、はっきり示しておきます。

Sub Macro3()
    ' 答えを入れる(VBA が計算して、結果だけを置く)
    Cells(4, 1) = "Value で入れた"
    Cells(4, 2).Value = Cells(1, 2).Value * Cells(2, 2).Value

    ' 式を入れる(本物の Excel なら Excel が計算する)
    Cells(5, 1) = "Formula で入れた"
    Cells(5, 2).Formula = "=B1*B2"

    ' Value に "=" から始まる文字列を入れても、Excel では数式になる
    Cells(6, 1) = "Value に式を入れた"
    Cells(6, 2).Value = "=B1+B2"
End Sub

どちらを使うべきか。 元資料は書き方を示すだけですが、これは設計の判断です。

実務では、この取り違えが原因の事故が起きます ── 「数式のままコピーして送ったら、相手の環境で参照が壊れて全部 0 になった」 「値で固定したことを忘れて、元データを直したのに集計が変わらなかった」。 どちらの意図で入れたのかを、自分で分かって書くことが肝心です。

2.1 では、なぜ VBA で計算するのか

面積を求めるだけなら、セルに =B1*B2 と打てば済みます。 わざわざプログラムを書く意味は何でしょうか。

Excel の数式VBA
得意1 つの値を求める。表の形が決まっている 手順を書く。繰り返し・条件・場合分け
100 行に同じ計算コピーする(人の操作)For で 100 回まわす(第 7 章)
条件で処理を変えるIF 関数を入れ子にする(読みづらくなる)If 〜 ElseIf で素直に書ける(第 5・6 章)
終わりが決まらない計算書けないDo Loop で書ける(第 8 章:互除法など)
手順に名前をつけて再利用難しいSub / Function(第 9 章)

つまり VBA の値打ちは「同じことを何度も」「場合によって違うことを」「終わりが決まらないことを」 書けることです。 この章の例はどれも数式で書けますが、それは第 5 章以降の準備です。 いまは「読む → 計算する → 書く」の形に慣れることが目的です。

3. 表をつくる

元資料の「簡単な計算 1〜4」にあたる練習です。 複数の値を読み、合計や平均を出して書き戻します。

Sub Macro4()
    Dim a As Double, b As Double, c As Double, d As Double
    Dim goukei As Double
    Dim heikin As Double

    a = Cells(2, 2).Value
    b = Cells(3, 2).Value
    c = Cells(4, 2).Value
    d = Cells(5, 2).Value

    goukei = a + b + c + d
    heikin = goukei / 4

    Cells(6, 1) = "合計"
    Cells(6, 2) = goukei
    Cells(7, 1) = "平均"
    Cells(7, 2) = heikin

    ' 平均より上の科目に色をつける
    If a > heikin Then Cells(2, 2).Interior.Color = RGB(255, 235, 156)
    If b > heikin Then Cells(3, 2).Interior.Color = RGB(255, 235, 156)
    If c > heikin Then Cells(4, 2).Interior.Color = RGB(255, 235, 156)
    If d > heikin Then Cells(5, 2).Interior.Color = RGB(255, 235, 156)
End Sub

4 科目ならこれで書けますが、40 科目だったらどうでしょう。 a から z まで名前を用意しても足りません。 ここで必要になるのが繰り返し(第 7 章)と配列(第 11 章)です。 「面倒だ」と感じたところに、次に学ぶ道具がある ── この授業はその順番で進みます。

4. セルが空のとき

元資料には出てきませんが、実際に必ずぶつかる問題です。 空のセルを読むと何が入るか。 VBA では Empty という特別な値になり、 計算では 0 として扱われます。 だから「まだ入力されていない」と「0 が入力された」の区別がつきません。 平均を出すときに、これが原因で答えが狂います。

Sub Macro5()
    Dim s As Double
    Dim n As Integer
    Dim i As Integer

    ' 3 行目(空)も足してしまう書き方
    s = Cells(2, 1) + Cells(3, 1) + Cells(4, 1) + Cells(5, 1)
    Cells(2, 3) = "合計"
    Cells(2, 4) = s
    Cells(3, 3) = "4 で割った平均"
    Cells(3, 4) = s / 4

    ' 空でないものだけ数える書き方
    s = 0: n = 0
    For i = 2 To 5
        If Cells(i, 1).Value <> "" Then
            s = s + Cells(i, 1).Value
            n = n + 1
        End If
    Next i
    Cells(5, 3) = "空を除いた個数"
    Cells(5, 4) = n
    Cells(6, 3) = "正しい平均"
    Cells(6, 4) = s / n
End Sub

4 で割ると 45、空を除いて 3 で割ると 60。15 点も違います。 Excel の AVERAGE 関数は空セルを自動的に除きますが、 VBA では自分で書かないと除いてくれません。 「便利な関数が裏でやってくれていたこと」を、自分の手で書くのがプログラミングです。

5. まとめ

  1. 基本の形は読む → 計算する → 書く
  2. データはシートに、手順はプログラムに置く
  3. .Value答え.Formula計算のしかた。 元データを変えたら追いかけてほしいなら数式、固定したいなら値
  4. VBA の値打ちは繰り返し・場合分け・終わりが決まらない計算が書けること
  5. 空のセルは 0 として扱われる。平均を出すときは自分で除く

章末問題

付録:元資料からの修正一覧

もとにしたのは「情報学入門(VBA)110-2018」全 19 枚です。

元資料この教材種別
Formula プロパティの書き方だけを示し、 Value との違いに触れていない 「答えを入れる」と「式を入れる」の違いを表で比較し、 元データを変えたときに追いかけるかどうかという使い分けの判断まで示した不足
19 枚のうち15 枚が Excel 画面のスクリーンショットで、 プログラムの本文が画像の中にしかない プログラムを実行できる形で載せ、書き換えて試せるようにした体裁
「簡単な計算 1〜4」の各マクロが、何を練習させたいのかが本文に書かれていない 「読む → 計算する → 書く」という共通の骨組みを明示し、 データとプログラムを分けるという意図を書いた不足
Excel の数式で足りることを VBA で書く理由が説明されていない §2.1 として、数式と VBA の得意・不得意を比較した表を追加不足
空のセルを読んだときのふるまいに触れていない §4 として追加(Empty は 0 扱い、平均が狂う実例)不足