電子書籍の厳選無料作品が豊富!

Private Sub test1()
Dim x, y
x = 1
y = 2
Call test2(x, y)
'*
End Sub

Private Sub test2(x, y)
Dim z
z = x + y
End Sub

上記のようなコードで、*の部分でtest2のx+yの結果が格納された状態の変数zを使うにはどうすればいいですか?

A 回答 (3件)

使いやすい方のどちらかですね。


どちらかというと、後者のモジュールレベル変数ですね。
'------------------------------
Private Sub test1()
Dim x, y, z
x = 1
y = 2
Call test2(x, y, z)
'*
Dubug.Print z
End Sub

Private Sub test2(x, y, z) '参照渡しで
z = x + y
End Sub

'別案-----------------------------
Private z 'モジュールレベル変数で
Private Sub test1R()
Dim x, y
x = 1
y = 2
Call test2R(x, y)
'*
Debug.Print z
End Sub

Private Sub test2R(x, y)
z = x + y
End Sub
'--------------------------------
前者が使いにくいのは、引数のデータ型とプロシージャのデータ型の不一致に振り回されるときがあるからです。
    • good
    • 0
この回答へのお礼

こんな簡単な方法があるんですね。
とても助かりました。
ありがとうございました。

お礼日時:2005/05/31 22:04

こんばんわ。



>zを持ち帰りたいのは一箇所のみです。

他の関数からもtest2を使用しているということでしょうか?

なら、

Private Sub test1()
Dim x, y,z2
x = 1
y = 2
Call test2(x, y,z2)
msgbox z2 'メッセージ
End Sub

↓-999 に設定したのはありえない数字を与えてください。
Private Sub test2(x, y,optional byref z as long=-999)
if z <> -999 then
z = x + y
end if
End Sub

では、どうでしょうか?
byref 宣言は、参照元の変数の値を変える宣言で、
optional は必要があるときだけ指定すればOKです。
    • good
    • 0
この回答へのお礼

参考になりました。

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

お礼日時:2005/05/31 21:55

こんにちは。

maruru01です。

グローバル変数使ってもいいけど、普通はSubプロシージャではなく、Functionプロシージャを使うのでは?


Private Sub test1()
Dim x, y, z
x = 1
y = 2
z = test2(x, y)
MsgBox z
End Sub

Private Function test2(x, y)
test2 = x + y
End Function


それから、余計なことかも知れないが、変数はちゃんと型宣言した方がいいですよ。
    • good
    • 0
この回答へのお礼

早速ありがとうございます。

実際のコードではtest2は200行の処理を行っていて、zを出すために使っているのではなく、あくまでzはその副産物なんです。
またtest2は複数の箇所から呼び出されていますが、zを持ち帰りたいのは一箇所のみです。
わかりにくくてすみません。

お礼日時:2005/05/31 20:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!