.Valueで値を設定したあと、参照元セルの値を変更すると? - Excelマクロ・VBA

昨日の続きです。

「式」と「戻り値」、「値」

今日は、こんなマクロの挙動について考えてみたいです。

Sub hoge()  
    Range("A1").Value = 5 '[1]  
    Range("A2").Value = Range("A1").Value * 3 ' [2]  
    Range("A1").Value = 10 '[3]  
End Sub  

[1] で、セルA1に、「5」という値が入ります。
[2] で、セルA2に、「15」という値が入ります。([2]を実行する直前の段階で、セルA1には「5」が入っていたから)
[3] で、セルA1に、「10」という値が入ります。([1]で入った値を、上書きします)

さてさて、それで。
[2]まで実行された段階で、以下のような状況になっています。
2300_1

で。
ひきつづき、[3]の行が実行されるわけなのですが。
そのとき。
[選択肢A] セルA2の値は、「15」のままなのでしょうか。
[選択肢B] それとも、「30」に変わるのでしょうか。
というのが、今日のテーマ。

...どっちだと、思います?
試してみると分かりますが。


では、解答です。

[選択肢A]が正解です。
[3]まで終わった段階では、以下のようになっています。
2300_1

自分でマクロを実行し、これの結果を見たとしても。
「まったく理解出来ない!」
とおっしゃる受講生が、いつも、だいたい2割くらいです...。

なので、こんな解説をしています。
ここで、前提となる考え方を以下に書いておきます。
セルに .Value プロパティを設定しようとすると、右辺の「式」から得られた「戻り値」が、セルに書き込まれる
のです。

例えば、
Range("C1").Value = 5 * 15
ならば、右辺の「式」は「5 * 15」です。

そこから得られる「戻り値」は「75」
なので、セルC1に「75」と書き込まれます。

Range("C2").Value = 5 + Range("A1").Value 'ただし、セルA1に「5」という値が入っていたとします。
ならば、右辺の式は、「5 + Range("A1").Value」です。
そこから得られる「戻り値」は、「10」
なので、セルC2に「10」と書き込まれます。

Range("C3").Value = 100
ならば、右辺の式は、「100」です。
そこから得られる「戻り値」は、「010」
なので、セルC2に「100」と書き込まれます。

最後のは、若干混乱するかも。
前回のブログ: 「式」と「戻り値」、「値」でも書いたとおり、単体の「100」といった数値も、「式」たり得るわけです。

ということで。
冒頭お話したことについての解説。

Sub hoge()  
    Range("A1").Value = 5 ' [1]  
    Range("A2").Value = Range("A1").Value * 3 ' [2]  
    Range("A1").Value = 10 '[3]  
End Sub  

各行を実行すると、以下のようになります。
[1]では、右辺の式は「5」です。
そこから得られる戻り値は、「5」
ということで、セルA1には、「5」と書き込まれます。

[2]では、右辺の式は「Range("A1").Value * 3」です。
そこから得られる戻り値は、「15」
ということで、セルA2には、「15」と書き込まれます。[*]

[3]では、右辺の式は「10」です。
そこから得られる戻り値は、「10」
ということで、セルA1には、「10」と書き込まれます。

ここまで、何も難しくないですよね。
で、上記の、[ * ]の部分に注目してください。
セルA2には、「15」と書きこんだんですよね。
ここでは、「=A1*3」みたいなエクセルの関数式を書き込んだのではなく、
「Range("A1").Value * 3」という計算をした結果である、「15」という値を書き込んだわけです。
セルA2に入っていたのが「=A1 * 3」だとしたら、セルA1の値が変わる都度、自動的に、セルA2の値も変わります。

ですが、セルA2に入っていたのは、「15」というただの値ですから、
セルA1の値がその後どうなろうと、セルA2は知ったこっちゃありません。

よって、[3]でセルA1の値が上書きされて「10」になろうとも、セルA2の値は、「15」のままです。
昨日も書きましたが、エクセルの関数を作るにしても、マクロを書くにしても、エクセル内の部品のウラの組みについて理解しておくと、よりよいものを作れるようになりますし、何か失敗したときにも、ウラの仕組みを理解していると、原因の発見、問題の解決も早くなります。


ということで、今日は、部品レベルのことから説明をしてみました。
この記事を読んでいるだけだと、ピン、と来にくいかもしれません。
なので、今、手元にエクセルがあれば、ぜひ、トライしてみてください。
慣れないと、「細かくてややこしい!」と感じられるかもしれませんが、「なんとなく」程度でよいので、この感覚をつかんでおいてください。
それでよく分からなければ、この記事をブックマークしておいて、また1時間後にでも見に来るとよく分かるかと思います。

公開日時: 2022/08/17 12:00