質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

19439閲覧

ExcelのVBAにて。Subプロシージャの中の変数を他のSubプロシージャで使いたい

nissanngtr34

総合スコア24

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2015/10/06 04:56

編集2015/10/06 05:04

Subプロシージャ内の変数を、別のSubプロシージャに変数受け渡しすることは可能なのでしょうか?

Sub A()
変数=何かしらの処理
End Sub

Sub B()
Sub Aの中の変数を使って処理したい
End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

SUB Aの中からSUB Bをコールするなら引数で渡すだけで(値渡しor参照渡し)いいと思います。
他のプロシージャを経由するなら、参照渡しでできるのではないでしょうか?参考

手元に環境が無いのでちゃんと動くか自信がないですが、こんな雰囲気

vba

1Sub sample() 2 Dim str As String 3 str = "Hello" 4 Call A(str) 5 Call B(str) 6End Sub 7 8Sub A(ByRef str As String) 9 str = str & " World!" 10End Sub 11 12Sub B(ByRef str As String) 13 MsgBox str 14End Sub

投稿2015/10/06 05:34

編集2015/10/06 05:46
hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nissanngtr34

2015/10/06 05:46

ご返答ありがとうございます。 ByValとByRefのことでしょうか?
hirohiro

2015/10/06 05:47

はい。そうですね。
nissanngtr34

2015/10/06 06:07

Sub A(ByRef str As String) str = str & " World!" End Sub A(ByRef str As String)の括弧内って引数ですよね? sampleでstrに「Hello」が代入されたものが、ByRef str As Stringで引数として使われ、戻り値が??ってなってしまいまして。 すみません。よく分かってなく。
hirohiro

2015/10/06 06:24 編集

環境手元になくて、ちゃんと動いてるか自信がないのですが、 sampleでstrというロッカーをレンタルし、そこに"Hello"を詰め込みます。 A(ByRef str As String) でA()にstrの使用許可を与えます。 A()の「str = str & " World!"」で、" World!"を加え中身が"Hellow World!"になります。 sample()もA()も使ってるのは同じ入れ物です。 この辺は「参考」に付けたリンク先に詳しく書かれています
nissanngtr34

2015/10/06 06:33

なるほど。使用許可を与えているわけですね。 ByRefが使ってプログラミングしてみようと思います。ありがとうございます。
hirohiro

2015/10/06 06:50 編集

説明の為に使用許可と書きましたが、実際は参照を渡しています…… 変数宣言すると、メモリの何処かに領域を確保します。 それが何処なのかは宣言したスコープを覗けるものにしか解りません。 参照渡しByRefではその位置を渡します。 渡された側は、その場所を直接参照したり、変更したりします。 値渡しByValでは中身の複製物を渡し、場所は教えません。 渡された側は独自にメモリ上の別の場所を確保し、渡されたデータを格納します。
nissanngtr34

2015/10/06 06:55

仕組みまで説明して頂き、ありがとうございます。 ByRefで動くようになりましたので、これで学習を進めていこうと思います。 ありがとうございます。
guest

0

Sub関数の外側に変数宣言しておけば、どこの関数でも参照可能になります

vba

1Public X 2 3Sub A() 4 X=1 5End Sub 6 7Sub B() 8 Call A 9 MsgBox X ' メッセージボックスに 1 と表示 10End Sub

ちなみに
public とすればどこのモジュールからも参照可能
private とすればそれを宣言したモジュール内でのみ参照可能
となります

投稿2015/10/06 05:09

takito

総合スコア3111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nissanngtr34

2015/10/06 05:19

ご返答ありがとうございます。 なるほど。普段Module1しか使っていませんが、これが複数になってどのモジュールからでも参照したければpublic,そうでなければprivateなのですね。 若干動きが分かっていないのですが、Aの処理後、Public xにも1が代入されたということなのでしょうか? Bではpublic xに入ったものを表示させているのでしょうか? よろしければ教えて頂けませんでしょうか? Aの処理が終わると、Public Xに1が入り、 Bの処理で
nissanngtr34

2015/10/06 05:45

あとすみません。 BにてAをCallすると、 Aの処理をすべて実行してしまうのでしょうか?
takito

2015/10/06 05:58

認識はだいたいあっています A は 変数 X に 1 を代入するだけの処理 B は A を呼んで、その後に 変数 X の内容をメッセージボックスに表示する処理 Sub B にちょっと書き足して --- Public X Sub A() X=1 End Sub Sub B() X = 0 ' ←これを追加 Call A MsgBox X ' メッセージボックスに 1 と表示 End Sub --- こうした場合、やはりメッセージボックスには 1 が表示されます つまり、AでもBでも同じ X を参照しています (補足) このように広域で使えるようにした変数は、実はリスクがともないます public X Sub A Dim X X = 1 End Sub Sub B() X = 0 Call A MsgBox X ' メッセージボックスに何が出る??? End Sub いかがでしょう? さらに X を演算する関数が他にもいたりすると、いつどのタイミングにどんな値が入っているのかわからなくなり、不具合の元となりかねません 学習中はよいと思いますが、いずれは他の方の回答にあるように値渡しや参照渡しによって、必要な時に必要な範囲で使うような変数の設計が必要になるでしょう
takito

2015/10/06 06:08

>あとすみません。 >BにてAをCallすると、 >Aの処理をすべて実行してしまうのでしょうか? はい、します
nissanngtr34

2015/10/06 06:19

BのXはSub AのXを見ているからBでX=0をしても変化はないのですね。 Sub A()  X=1 End Sub 下の場合だと違ってくるのですか?
takito

2015/10/06 06:34

> BのXはSub AのXを見ているからBでX=0をしても変化はないのですね。 言い回しが微妙な感じですが、、、とにかく A でも B でも見ている X は同じです B の処理で X = 0 としてから Call A をするので、A の処理に入った時はすでに X には 0 が入っています そして A の中では A = 1 としているので、Aの処理が終わってBに戻ったときには、X には 1 が入っています ということです 補足した方の話しですが Sub A Dim X X = 1 End Sub これは A の中で Dim X が宣言されているので、Public X とは別物(同じ名前の変数が2つ存在)となります このような状態で X をどんなに加工しても、Public X にはまったく影響を与えません
nissanngtr34

2015/10/06 06:53

すごく丁寧に書いて頂きありがとうございます。 書いてくださったプログラムを参考にし、自分でも作って勉強してみます。 ByRefの方でもプログラミングして受け渡しが出来たので、これで慣れていこうと思います。
guest

0

こんにちは。

以下のどれかの対応が必要になると思います。

  • 変数スコープを変更する
  • SubではなくFunctionを使う
  • ByRefで引数で引き渡していく

投稿2015/10/06 05:08

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nissanngtr34

2015/10/06 05:22

ご返答ありがとうございます。 とても参考になります。Subに拘ってなく、 Functionでも出来るようになりたいのですが、いまいち使い方が分かってなく困っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問