• ベストアンサー

Callで呼び出したプロシージャから変数を持ち帰るには

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を使うにはどうすればいいですか?

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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 '-------------------------------- 前者が使いにくいのは、引数のデータ型とプロシージャのデータ型の不一致に振り回されるときがあるからです。

freednia
質問者

お礼

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

その他の回答 (2)

  • guruguru2
  • ベストアンサー率29% (39/132)
回答No.2

こんばんわ。 >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です。

freednia
質問者

お礼

参考になりました。 ありがとうございました。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。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 それから、余計なことかも知れないが、変数はちゃんと型宣言した方がいいですよ。

freednia
質問者

お礼

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

関連するQ&A

  • VBAのプロシージャのことで

    TEST1のプロシージャ内に使用している readfileという変数の中にテストという文字列を代入し、 文字列が代入された状態で Callによって別のプロシージャを読みにいったとき TEST(変数)に入った文字列ごと持っていくには どの様に記述すればよいかどなたか教えていただけませんでしょうか・・・。。 ----------------------------------------------------------- Sub TEST () Dim readfile As String readfile = "テスト" Call TEST2 End Sub ----------------------------------------------------------- Sub TEST2() readfile ←テストという文字列をTESTプロシージャから持ってきたい End Sub ----------------------------------------------------------- 単純に書いてみたコードですが、この様なことは可能なのでしょうか? すいませんがいただけないでしょうか><;

  • エクセル VBA Call

    VBA初心者です。 callというのを知ったのですが、 ------------------------------- sub aaa() Dim z As Integer For z = 1 To 30 Step 1 Dim y As String y = Cells(2 + z, 3).Value Dim x As String x = Cells(2 + z, 2).Value ・ ・ call m1 call m2 call m3 call m4 ・ ・ next z end sub という記載があって呼び出し元に sub m1 sheet(y).select と書きたいです。この y とか x を先に記載した内容と同じ 認識にするにはどうしたら良いですか。 ど素人に分かるようにお願いします。教えてエクセル大先生。

  • プロシージャをまたいて変数を扱いたい!

    こんばんは! プロシージャ間での変数の取り扱いについて読んでいてよく分からないので教えて頂きたいです。 現在、ユーザーフォームにて下記のコードを記述していますが、テキストボックス1に表示するiの値を初めは50として、正解ならiに1を加算、不正解ならi から1を減算して、テキストボックス1の内容を更新するようにしたいのですが、どのように記述すればよろしいでしょうか。 ----------------------------------------------- private sub userform_initialize() Textbox1 = int(i) end sub ----------------------------------------------- private sub commandbutton1_click() If 条件式 then "正解" else "不正解" end if call userform_initialize() end sub ------------------------------------------------- commandbutton2 以降省略

  • 別のプロシージャに変数を渡したい

    別のプロシージャに変数を渡せなくて困っています。 下記の内容を実行させようとしています。 1.command1ボタンをクリックして計算を終えて 2.command2ボタンをクリックすると計算結果をクリップボードに入れてメモ帳に貼り付ける コードの概要は下記です。 【1.】////////////////////////////////////////////////////////////// Private Sub Command1_Click() Dim final as String 'いろいろと計算して最終的にfinalというstring型変数に文字列を得る。 final=計算結果 End Sub 【2.】////////////////////////////////////////////////////////////// Private Sub command2_click() Clipboard.Clear Clipboard.SetText final Dim memo As Long memo = Shell("Notepad.exe", vbNormalFocus) AppActivate memo, True 'アプリをアクティブにする SendKeys "^v" End Sub ////////////////////////////////////////////////////////////////////// 調べた結果,ByValがキーワードではないかと思い,Private Sub Command1_Click(ByVala final as string)など試してみましたができませんでした。 [余談] 1.のプロシージャ内で,クリップボードに入れてしまえばよいのですが,そうすると,1.の処理が終わってから,command2を押すまでの間にユーザがクリップボードを利用したら,このプログラムが成立しなくなるので,それは避けたいと思っています。

  • プロシージャー名を変数にはできない?

    シートに test1 test2 test3 として、 -------------------------------- Sub Sample() Dim myRow As Long Dim procedure As String For myRow = 1 To Cells(Rows.Count, "A").End(xlUp).Row procedure = Cells(myRow, 1) Call procedure Next myRow End Sub Sub test1() End Sub Sub test2() End Sub Sub test3() End Sub -------------------------------- こういう事ってできないのでしょうか? シートの文字を読み取ってプロシージャーを実行できれば、順番変えたり、要らないプロシージャーを消したりを、シート上で管理できるから楽なのになと思ったのですが。 これをやろうとすると、procedureというプロシージャーがないから Sub、Function、または Property が必要です。 になってしまいます。

  • VB.NETの関数プロシージャの書き方を教えてください。

    Public A As String という変数にある文字列データが入っていて、 ボタンを押すとその時に変数X,Y,Zに入っている 文字列を検索してButton1_Clickプロシージャ内に戻って来て KekkaX,KekkaY,KekkaZに数値が入るような関数プロシージャなのですが、 呼び出す部分の書き方と関数のプロシージャ名の書き方を教えて頂きたいです。 検索する部分は自分で出来ると思うので大丈夫です。 Public A As String = "何かの文字列" Button1_Click Dim X,Y,Z As String Dim KekkaX,KekkaY,KekkaZ as Integer '変数Aの中からX,Y,Zを検索したい X="*****" Y="ABCDE" Z="#####" GetKensakuKekka(????????) ←この部分の書き方を教えて下さい。 'KekkaX,KekkaY,KekkaZ 内に検索結果を取得したい Console.WriteLine(KekkaX) Console.WriteLine(KekkaY) Console.WriteLine(KekkaZ) End Sub Function GetKensakuKekka (???????????) ←この部分の書き方を教えて下さい。 ・ ・ ・ End Function よろしくお願い致します。

  • VB6.0で、LSetの動作がわからない

    よろしくお願いします。 LSetのサンプルを検索していて以下のコードを見つけました。 Option Explicit Private Type B4 B(3) As Byte End Type Private Type S1 S As Single End Type Private Sub Form_Load() Dim X As B4 Dim Y As S1 X.B(0) = 37 X.B(1) = 82 X.B(2) = 154 X.B(3) = 68 LSet Y = X Debug.Print Y.S End Sub このコードを実行するとデバッグウィンドウに 1234.567 と表示されます。 このコードではいったい何が起こっているのでしょうか? X.Bとして4つの配列変数が用意され、それがY.Sという配列ではない通常の変数に代入されているのはわかるのですが、 どうして結果が1234.567になるのかわかりません。

  • パターン処理(再度) vbscript

    excel VBA(vbscript) 質問1 文字変数Xを処理して変数yを求めるマクロコードのヒントを     (つまり.xlsを除き、続いて文字や_を取り去る) 質問2 文字変数Xを処理して変数zを求めるマクロコードのヒントを     (つまり文字のみを取り去る) (例)x=FILE20041211_1212system.xls    y=FILEsystem    z=20041211_1212.xls   上記に対して次の回答があり、満たします。 ANo.2 Sub test()  Dim x As String  Dim y As String  Dim z As String   x = "FILE20041211_1212system.xls"  With CreateObject("VBScript.RegEXP")       .Pattern = "^(\D*)(\d+\_\d+)(\D*)\b.xls\b$"       If .test(x) Then          y = .Replace(x, "$1") & .Replace(x, "$3")          z = .Replace(x, "$2") & ".xls"       End If       MsgBox x & vbLf & y & vbLf & z  End With End Sub (今回の質問)(例)x=FILE20041211_1212system.xlsにおいて "_"が実ははいらない場合もありまして、そのような例 x=FILE200412111212system.xlsにおいては、どのようにANo.2 Sub test()を変更すべきか。

  • 変数の扱いについて

    こんにちは。お世話になります。 ユーザーフォームモジュールで宣言した変数を標準モジュールのサブプロシージャ内で使うには どのようにしたらよいのでしょうか? ====== ユーザーフォームモジュール ======= Dim MyData1 as Long Dim MyData2 as Long Private Sub CommandButton1_Click() For MyData1 = 1 To 10 MyData2 = MyData1 * 2 Call test1 Call test2 Next MyData1 End Sub ====== 標準モジュール ======= Sub test1() Worksheets("Sheet1").Range("A" & MyData1).value = MyData2 * MyData2 End Sub Sub test2() Worksheets("Sheet2").Range("A" & MyData1).value = MyData2 + MyData2 End Sub For~Nextは標準モジュール内ではなくユーザーフォームモジュール内に作りたいのです。 おわかりの方よろしくお願いしますm(_ _)m

  • 元のプロシージャーを取得するプロパティ

    Sub test1() Call test2 End Sub Sub test2() If ?? Then MsgBox "test1から実行されたマクロです。" End If End Sub 上記のコードで どこから実行されたプロシージャ化を取得する方法はありますか? 現在は、 Dim bl_test1_yes As Boolean Sub test1() bl_test1_yes = True Call test2(bl_test1_yes) End Sub Sub test2(bl_test1_yes) If bl_test1_yes = True Then MsgBox "test1から実行されたマクロです。" End If End Sub としていますが、 元のプロシージャーを取得するプロパティがあれば教えてください。

専門家に質問してみよう