Value と Formula の違いを説明し、使い分けの判断ができるプログラムの基本の形は入力 → 処理 → 出力です。 表計算の上では、これがそのまま「読む → 計算する → 書く」になります。
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 と書いてしまうと、
値を変えるたびにプログラムを書き直さなければなりません。
データはシートに、手順はプログラムに ── この分け方が、あとで効いてきます。
元資料 15 枚目に、こうあります。
「さらに、数式を代入する時は、Formula プロパティを用いる。
Range("A1").Formula、Cells(1,3).Formula のように書くこともできる。」
ここが、この章のいちばん大事なところです。同じセルに対して、2 通りの入れ方があります。
.Value = 40 | .Formula = "=B1*B2" | |
|---|---|---|
| セルに入るもの | 答えそのもの(40 という数) | 計算のしかた(式) |
| 画面に見えるもの | 40 | 40(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 になった」 「値で固定したことを忘れて、元データを直したのに集計が変わらなかった」。 どちらの意図で入れたのかを、自分で分かって書くことが肝心です。
面積を求めるだけなら、セルに =B1*B2 と打てば済みます。
わざわざプログラムを書く意味は何でしょうか。
| Excel の数式 | VBA | |
|---|---|---|
| 得意 | 1 つの値を求める。表の形が決まっている | 手順を書く。繰り返し・条件・場合分け |
| 100 行に同じ計算 | コピーする(人の操作) | For で 100 回まわす(第 7 章) |
| 条件で処理を変える | IF 関数を入れ子にする(読みづらくなる) | If 〜 ElseIf で素直に書ける(第 5・6 章) |
| 終わりが決まらない計算 | 書けない | Do Loop で書ける(第 8 章:互除法など) |
| 手順に名前をつけて再利用 | 難しい | Sub / Function(第 9 章) |
つまり VBA の値打ちは「同じことを何度も」「場合によって違うことを」「終わりが決まらないことを」 書けることです。 この章の例はどれも数式で書けますが、それは第 5 章以降の準備です。 いまは「読む → 計算する → 書く」の形に慣れることが目的です。
元資料の「簡単な計算 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 章)です。
「面倒だ」と感じたところに、次に学ぶ道具がある ── この授業はその順番で進みます。
元資料には出てきませんが、実際に必ずぶつかる問題です。
空のセルを読むと何が入るか。
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 では自分で書かないと除いてくれません。
「便利な関数が裏でやってくれていたこと」を、自分の手で書くのがプログラミングです。
.Value は答え、.Formula は計算のしかた。
元データを変えたら追いかけてほしいなら数式、固定したいなら値もとにしたのは「情報学入門(VBA)110-2018」全 19 枚です。
| 元資料 | この教材 | 種別 |
|---|---|---|
Formula プロパティの書き方だけを示し、
Value との違いに触れていない |
「答えを入れる」と「式を入れる」の違いを表で比較し、 元データを変えたときに追いかけるかどうかという使い分けの判断まで示した | 不足 |
| 19 枚のうち15 枚が Excel 画面のスクリーンショットで、 プログラムの本文が画像の中にしかない | プログラムを実行できる形で載せ、書き換えて試せるようにした | 体裁 |
| 「簡単な計算 1〜4」の各マクロが、何を練習させたいのかが本文に書かれていない | 「読む → 計算する → 書く」という共通の骨組みを明示し、 データとプログラムを分けるという意図を書いた | 不足 |
| Excel の数式で足りることを VBA で書く理由が説明されていない | §2.1 として、数式と VBA の得意・不得意を比較した表を追加 | 不足 |
| 空のセルを読んだときのふるまいに触れていない | §4 として追加(Empty は 0 扱い、平均が狂う実例) | 不足 |