• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAで別モジュールへの変数の受け渡し方法)

VBAで別モジュールへの変数の受け渡し方法

sample_の回答

  • sample_
  • ベストアンサー率76% (20/26)
回答No.2

はい、できますよ。 いくつかポイントがあるのでそちらを説明したのちにコードを掲載しておきます。 ■他のモジュールの変数にアクセスしたい時 アクセスしたい変数はDimではなくPublicで宣言する必要があります。 スコープ範囲が外からでもアクセスできるようにする必要があるからです。 Publicで宣言した後、どのようにアクセスすればよいかですが たとえば、Sheet1という名前のシート内で宣言したPublic変数にアクセスしたい時は debug.print Thisworkbook.Sheets("Sheet1").変数名 でアクセスできます。 標準モジュール(Module1)内であれば debug.print Module1.変数名 ■ユーザーフォームの変数にアクセスする時 ユーザーフォーム(UserForm1)内であれば debug.print UserForm1.変数名 でアクセスできます。 ただし、UnLoadや×印で閉じてしまうとメモリ上から消えてしまい変数にアクセスすることはできません。 そのため、×印を押した際に閉じるのではなく、非表示にしてあげる必要があります。 以上を踏まえると以下のようになります。 標準モジュール:Module1 Sub SampleCode() MsgBox "変数abcの値は:" & UserForm1.hogehoge UserForm1.Show MsgBox "変数abcの値は:" & UserForm1.hogehoge End '全ての処理が終わったらEndでPublic宣言の変数をリセットする End Sub ユーザーフォーム:UserForm1 Public hogehoge As String Private Sub CommandButton1_Click() hogehoge = "abc" 'UserForm1の変数に保存 End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) Me.Hide 'メモリから消えてしまわないよう非表示にする Cancel = True 'デフォルトの挙動(メモリから消える)をキャンセルする End Sub

master817199
質問者

お礼

お返事していなくて申し訳ありません。 お陰様で解決しました。 ご丁寧な回答に心から感謝します。

関連するQ&A

  • VBAのCallステートメントについて

    ExcelのSheet1にCommandButton1(表示)があります。 -------------------------------------------------- Private Sub 表示_Click() (DBより表示処理) End Sub -------------------------------------------------- UserForm1にCommandButton1(登録)があります。 -------------------------------------------------- Private Sub 登録_Click() (DBへの登録処理) UserForm1.Hide Call WorkSheets("Sheet1").表示_Click() ・・・☆ Exit Sub End Sub -------------------------------------------------- 表記のようなプログラムにしたところ、☆印のところで、 下記エラーが表示されてしまいます。 【エラー】--------------------------------------------------- 実行時エラー'91': オブジェクト変数またはWithブロック変数が設定されていません。 ------------------------------------------------------------- どのようにしたらCallステートメントで表示_Clickを呼び出すことが できるのでしょうか。

  • フォームからモジュール内の処理を実行したい

    Sub CommandButton_Click() 集計処理 End Sub 上記のコードでは何も処理されません。集計処理はModule1に入っています。いろいろ足りないと思うのですがどのようにするとよろしいでしょうか。

  • 【VBA】値の引渡しについて

    VBA初心者です。 VBAの勉強もかねて、今、【 標準モジュール 】と【 UserForm 】を用いて あるプログラムを作っています。 その中で、プロシージャ間をまたいで 『 値の受け渡し 』をしたいと思っています。 今回、質問をさせていただいたのは、その『 値の受け渡し 』が 「できる場合」と「できない場合」があるので、常にできるように その対応方法を教えていただきたく、今回投稿させていただきました。 ---------------------------------------------------------------- 今困っているパターンを例にあげると、 ユーザフォームの中に2つのボタン 「OK」ボタンと「キャンセル」ボタンが あるとします。 【 「キャンセル」ボタンがおされた場合には「終了する」 】という 仕組みにしたいと思っています。 そこで以下のようなプログラムを作ろうとしました。 ---------------------------------------------------------------- ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 1) General部にPublic変数(以下「P変数」)を宣言する。      Public cancel as byte 2) 【標準モジュール】のプロシージャから【フォーム】の「Userform1」を表示させる。          Sub A処理()           Userform1.show           End sub   3) 【フォーム】のUserform1._CommandButton2に以下のように記述する。    (キャンセルボタンがクリックされた場合)          Private Sub CommandButton2_Click()       cancel = False       Unload Me       Exit Sub      End Sub 4) 【標準モジュール】のプロシージャの、一連の処理の最後に    以下のようにプログラムを記述する。          Sub A処理()           Userform1.show      ↓      ↓           if cancel = false then                exit sub           end if      End sub ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 1)~4)のようにして 「キャンセルがクリックされた場合、すべての処理を終了する。」 というようなプログラムを記述してみました。 すると、デバッグを使って、変数「cancel」の中身を見てみると 3)の段階で、その変数「cancel」に「false」値を格納したはずなのに、 プロシージャ間をまたいだことで 4)の段階では、変数「cancel」の中身が必ず「""」と 値が空値になってしまいます。 4)の段階でも、変数「cancel」の値が保持できる、 何かしらの方法はないでしょうか。 回答をよろしくお願いします。

  • VBA:助けてください。呼び出してもいないのに独立なプロシージャへ、処理が飛んでしまう。アドバイスお願い致します。

    Useform1のコマンドボタンをクリックすると Private Sub CommandButton1_Click() Call 処理 End Sub というように、「処理」を呼び出し。これで終わるようにしていました。しかし、不具合が出てしまい、ステップインで見てみると「処理」からEndSubに行き、その後Useform2のコマンドボタンイベントのEnd Withへ Private Sub CommandButton1_Click() With Userform1 .... End With ←    ・・・ End Sub 上のように矢印の部分へ飛んでしまいます。全く、独立な、コマンドイベントへ飛んで処理されているのです。それも、飛んだ箇所がEnd Withからです。こんなことがあるのでしょうか? Private Sub CommandButton1_Click() Call 処理 Exit Sub End Sub 上のようにExit Subを追加してもやはりそこから飛んでしまいます。 なぜでしょうか?詳しい方アドバイスお願い致します。

  • 別のSubで宣言されている変数を別のSubで参照

    よろしくお願いいたします。 環境:Excel2003 以下のようなイメージで別Sub内で宣言された変数を同じ変数名で別のSub内で参照したいです。 Sub hoge() nn As Integer nn = 1 End Sub Sub hogehoge() MsgBox (nn) End Sub Sub hogehogehoge() Call hoge Call hogehoge End Sub エラーが発生する為、typeについて検索をかけてみました所、以下のような変数参照方法は出てきましたが、別のSubで宣言されている変数を同じ変数名で別のSub内で参照する方法はないでしょうか? Type PData    hoge As String    hogehoge As Long End Type Sub Sample1()    Dim Pppp(5) As PData End Sub よろしくお願いいたします。

  • エクセルVBAで

    CommandButton2がクリックされた時に、 すでに表示されているUserForm1を消したいのですが、 Private Sub CommandButton2_Click() UserForm1.(  ) End Sub (  )にくる言葉は何でしょうか?

  • EXCEL VBAのユーザーフォームに引数を渡す方法について

    すいません、EXCEL VBAのユーザーフォームに引数を渡す方法についてご質問があります。 シート上にコマンドボタンを2つ用意する。 コマンドボタン1を押すと変数mは1 コマンドボタン2を押すと変数mは2 としてユーザーフォームを呼び出す。 Public m As Integer Private Sub CommandButton1_Click()  m = 1  Call フォーム呼び出し(m) End Sub Private Sub CommandButton2_Click()  m = 2  Call フォーム呼び出し(m) End Sub Sub フォーム呼び出し(m As Integer)  UserForm1.Show End Sub 次にユーザフォームにコマンドボタンを1個置き、 ボタンを押したとき、mが1であれば「ボタン1」 mが2であれば「ボタン2」 とメッセージボックスを出し、ユーザーフォームを閉じる。 Private Sub CommandButton1_Click()   If m = 1 Then    MsgBox "ボタン2"   ElseIf m = 2 Then    MsgBox "ボタン2"   End If  Unload UserForm1 End Sub プロシージャ間の引数渡しは色々なテキストに載っているのですが ユーザーフォームに引数を渡す方法はどうも見つからず、 Private Sub CommandButton1_Click(m) としても、コンパイルエラーとなってしまいます。 よろしくご教示をお願いいたします。

  • VBA 標準モジュールとフォーム (続き)

    先ほど、同じ質問タイトルで質問させていただいたものです。この場合どうなりますか? モジュールでの変数file_nameをフォームのボタンをクリックしたら"text.xls"が表示されるようにしたいです。 (イメージとしては、エクセルのsheet1にコマンドボタンがあってクリックするとフォームが立ち上がってフォームのコマンドボタンをクリックすると"test.xls"が表示される) モジュール Private Sub CommandButton1_Click() ←エクセルsheet1にボタンがある   dim file_name as string file_name="test.xls"   UserForm1.Show End Sub フォーム(UserForm1) Sub CommandButton1_Click() ←フォームにボタンがある MsgBox file_name End Sub

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

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

  • WordでVBAの変数について

    ThisDocumentにて宣言した変数内の数値をModule1の処理内で使用したいのですが ThisDocumentにてPublicで宣言した変数に数値を入れてModule1にてMsgboxを使用して確認した所参照できていませんでした Module1にてPublicで宣言した変数内の数値をModule2で参照することはできましたがThisDocumentだとうまくいきません Publicで宣言すれば別モジュールから参照できると認識しているのですが間違いでしょうか? プログラム等やったことがないので根本的な勘違いをしているかもしれませんがどなたかご教授ください。