- ベストアンサー
なぜ値が代入されるのかわからない
Sub Sample1() Dim 文字 As String 文字 = "あああ" Call Sample2(文字) 'プロシージャSample2の引数に変数を渡して呼び出す End Sub Sub Sample2(a As String) MsgBox a End Sub ---------------------------------- をやってみて疑問なのですが、 なぜ a = 文字 がないのに、 aに”あああ”が代入されるのでしょう? aにウォッチ式の追加をあてて、F8で一行ずつステップインしてみると Sub Sample2(a As String) の部分で、 aに””あああ”が代入されています。 a = 文字 と Sub Sample2(a As String) は 同じ意味なのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> Sub Sample2(a As String) このa As Stringというような表記は引数(ひきすう)と呼ばれ、 外部のデータを受け取れます。 Sample2()からしたらSample1()は外部なわけです。 Sample1()から「文字」変数をSample2の引数として渡していますので、 Sample2()でいうaは、「文字」変数を受け取ることになります。 因みにこの引数宣言にはちょっと宣言内容が抜け落ちてます。 以下の3つを試してみるとどうなるか分かりますよ。 具体的には、『Sample1()で「文字」変数の値が変化するかどうか』です。 【1つめ】 Sub Sample1() Dim 文字 As String 文字 = "あああ" Call Sample2(文字) MsgBox 文字 End Sub Sub Sample2(a As String) MsgBox a a = "あいう" End Sub 【2つめ】 Sub Sample1() Dim 文字 As String 文字 = "あああ" Call Sample2(文字) MsgBox 文字 End Sub Sub Sample2(ByRef a As String) MsgBox a a = "あいう" End Sub 【3つめ】 Sub Sample1() Dim 文字 As String 文字 = "あああ" Call Sample2(文字) MsgBox 文字 End Sub Sub Sample2(ByVal a As String) MsgBox a a = "あいう" End Sub 変化している部分は引数の宣言部のみです。 結果、ByRef、ByValという文字を省略しない方がいいだろうということが 分かると思います。
その他の回答 (2)
- keithin
- ベストアンサー率66% (5278/7941)
Sample2マクロは、引数としてaを用意しています。 このため call sample2(文字) と書くことで、変数「文字」の内容を引数aに「直接引き渡し」ています。これが「引数」の機能です。 もちろん、呼び出し側で変数を使わずに call sample2("直接の文字の値") のように書いて、引数aに「直接の文字の値」を渡す事も可能です。 >a = 文字 >と >Sub Sample2(a As String) >は同じ意味なのでしょうか? aに文字の中身が入るという「結果」だけは同じですが、意味合いは全く違います。 詳しくは「変数の適用範囲(スコープ)」について、参考書やVBEのヘルプで更に勉強してください。 a = 文字 というマクロが実際に作動するためには、変数「a」と変数「文字」が同じプロシジャの中で同時に生存していなければなりません。 しかし、今のあなたのマクロでは、そのようには書かれていません。 変数「文字」はあくまでもSample1の中だけで有効、一方変数「a」はSample2の中だけで有効で、命令として a = 文字 を成立させる準備が出来ていません。そういう制約の中で、いまaに文字の値を引き渡すために、引数という機能を利用します。 #実際のところ、アナタのマクロに >プロシージャSample2の引数に変数を渡して呼び出す と説明が書いてある、全くその通りでそれ以上説明のしようがないぐらいです。
お礼
call sample2(文字) でも call sample2("直接の文字の値") でも値を引き渡すことが可能なのですか。 難しいのでもっと勉強してみます。 ありがとうございました。
- hanabutako
- ベストアンサー率54% (492/895)
サブルーチンの引数というのはそういうものです。 Call Sample2(文字)とやると、 Sub Sample2(a As String)のaに文字列が代入された状態でSub Sample2の中身を実行します。 その意味では、Call Sample2(文字)がa = 文字と同じ意味と言えるでしょうね。 ただ、単純な代入とサブルーチン呼び出しの引数にaを書くのとは、aの値が有効である範囲が違います。 Basicで"a = 文字"と書いてある場合、基本的にその後どこでaの値を読んでもその時の文字の値である "あああ"が入っていますが、Call Sample2(文字)をした場合は、Sub Sample2の中でのみaに文字が入った状態になり、そこから脱出すると自動的にaの値はCall Sample2を実行した時の値に戻ります。 例えば、 a = "ああああ" Call Sample2("いいいい") MsgBox a と実行すると、Sub Sample2の中で実行したMsgBoxが"いいいい"と表示し、その呼び出し元のところで実行したMsgBoxが"ああああ"と表示します。 まぁ、サブルーチン呼び出しについてちょっと調べてみると良いと思います。
お礼
Call Sample2(文字) が a = 文字 ですか。 「そういうもの」という事で覚えます。 勉強不足の為、後半の説明は良くわからなかったので、もっと勉強してみます。 Sub Sample3() Dim a As String a = "ああああ" Call Sample2("いいいい") MsgBox a End Sub は、理解できました。ありがとうございました。大変参考になりました。
お礼
ご回答ありがとうございます。