3日がかりのその仕事、3分で終わらせる方法教えます!
パソコンスキルの心技体

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

2012年3月4日
  • このエントリーをはてなブックマークに追加
  • follow us in feedly

エクセルマクロ・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]まで実行された段階で、以下のような状況になっています。

       |A列  |
-------------
1 行目 |5    |
-------------
2 行目 |15   |
-------------

で。

ひきつづき、[3]の行が実行されるわけなのですが。

そのとき。

[選択肢A] セルA2の値は、「15」のままなのでしょうか。

[選択肢B] それとも、「30」に変わるのでしょうか。

というのが、今日のテーマ。

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

[選択肢A]が正解です。

[3]まで終わった段階では、以下のようになっています。

       |A列  |
-------------
1 行目 |5    |
-------------
2 行目 |15   |
-------------

自分でマクロを実行し、これの結果を見たとしても。

「まったく理解出来ない!」

とおっしゃる受講生が、いつも、だいたい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時間後にでも見に来ると、よく分かるかと思います。
..ということで。

キーワード

コメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

最新の記事

人気記事

最新記事

カテゴリ

最新コメント

タグクラウド