• ベストアンサー

エクセルVBAの次のコードの意味教えて下さい。

Sub macro1() Dim a As Integer, b As Integer a = 1 b = 5 macro2 a, b MsgBox a + b End Sub Sub macro2(c As Integer, d As Integer) c = c * 10 d = d * 5 End Sub 答えは35と出ます。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 そのサンプルは、どこかの本に載っていたものではありませんか? そういうことは、段階的にVBAとしては、応用コースに出てくるものです。ある程度、自分でマクロを書くようになれば、自然に覚えます。 書籍では、「値渡しと参照渡し」というタイトルなどが付いています。 ただ、サンプルコードとしては、以下のように書き換えたほうが分かりやすいです。 '「参照渡し」ByRef Sub macro2(a As Integer, b As Integer) a = a * 10 b = b * 5 End Sub このサブプロシージャは、「参照渡し」になっていますから、値は、サブプロシージャの中で計算されて、元のMacro1 側に戻されます。 それに対比するのが、「値渡し」という方法です。 '「値渡し」ByVal Sub macro3(ByVal a As Integer, ByVal b As Integer) a = a * 10 b = b * 5 End Sub こちらの比較してみてください。引数の前に何もつけないと、自動的に、サブプロシージャでは、「参照渡し」になります。 >Sub macro2(c As Integer, d As Integer) >のようにサブプロシージャの後の()の中に入れるのと >改行してDim・・・と書くのは同じことなのでしょうか? ()の中は、引数(アーギュメント)といいます。引数を取るものと、引数を取らないものでは、引数を取らないものは、自己完結しますが、引数を取るものは、他のプログラム等から呼び出しが必要になります。 まず、ローカルウィンドウや、ウォッチウィンドウの使い方を覚えてください。そこで変数がどう変化するか見てください。

NEWYORKERS
質問者

お礼

ご指導ありがとうございます。 単に回答だけでなく、なにを勉強すればいいのかも 教えていただけてよかったです。 おしえてもらった事はすべて初耳のことばかりでしたので、 びっくりしました。本当にありがとうございました。

その他の回答 (3)

  • marbin
  • ベストアンサー率27% (636/2290)
回答No.3

#2です。 質問文およびokormazdさんのレスをよく見てませんでした。 失礼しました。 私のレスはスルーしてください。

  • marbin
  • ベストアンサー率27% (636/2290)
回答No.2

参考になると思います。 Sub testb(ByVal a As String, b As String) MsgBox a & b End Sub Sub testa() Dim c As String Dim d As String c = "本日は" d = "晴天なり" Call testb(c, d) End Sub

NEWYORKERS
質問者

お礼

回答ありがとうございます。 ()内にいれるのは、出だしでもいいんですね。 なぜか文字だと少し理解できた気がしました。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

Sub macro1() macro1という名前のサブプロシージャです。引数はありません。 Dim a As Integer, b As Integer a,bは整数ですよ。どんな変数を使うか(コンピュータ) に知らせています。 a = 1 aは1です。 b = 5 bは5です。 macro2 a, b macro2というサブプロシージャを実行してください。実行するのに必要なaとbをつけてお願いします。 MsgBox a + b a+bを表示してください。 End Sub これでmacro1は終わりです。 Sub macro2(c As Integer, d As Integer) macro2という名前のサブプロシージャです。実行するには、整数の引数cとd 2つ必要です。 macro1で、a=1,b=5で実行するように頼まれています。これがcとdにはいります。だから、c=1,d=5になります。 c = c * 10 c×10を計算してその結果を新しいcにしてください。 c=1×10=10になります。これが頼まれたmacro1のaとしてもどります。 d = d * 5 d×5を計算してその結果を新しいdにしてください。 d=5×5=25になります。これが頼まれたmacro1のbとしてでもどります。 End Sub これでmacro2は終わりです。macro2の実行を頼まれたmacro1に戻ります。aは10、bは25になっています。 macro1に戻ってa+bを表示するのですから、 10+15=35が表示されます。

NEWYORKERS
質問者

お礼

ご指導ありがとうございました。

NEWYORKERS
質問者

補足

Sub macro2(c As Integer, d As Integer) のようにサブプロシージャの後の()の中に入れるのと 改行してDim・・・と書くのは同じことなのでしょうか? aがcに、はいり、bがdに、はいるところですが、 なぜaがdで、bがcになったりしないのでしょうか? どうか教えて下さい。