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

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

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

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

Q&A

解決済

2回答

11628閲覧

ユーザーフォーム~標準モジュール間で変数を共有したい

jun_endo

総合スコア56

VBA

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

0グッド

0クリップ

投稿2018/07/13 01:39

#最初はpublicなら大丈夫と思っていた
最初はpublicでoptionexplicitに配置すればできる(ユーザーフォーム側)と思っていたのですが、
できませんでした。
どうすれは、同じ変数を扱えるようになるのでしょうか?
以下のプログラムは、コピペできなかったので
手書きです。誤字などがありましても、
本来のプログラムはないので、そこは気にしないでください。

lang

1UserForm側------------------------------------------------- 2Option Explicit 3Public hensu As Currency 4----------------------------------------------------------- 5Private Sub Commmandbutton1_click() 6hensu = Textbox1.Text 7End Sub 8----------------------------------------------------------- 9標準モジュール側-------------------------------------------- 10Sub 初期化() 11Userform1.Show 12End Sub 13----------------------------------------------------------- 14Sub 処理() 15Dim a As Variant 16Call 初期化 17a = hensu 18End Sub 19-----------------------------------------------------------
エラー:変数が定義されていません(hensu)

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

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

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

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

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

guest

回答2

0

今回の例ではsysjojo さんの方法が適切ですが、蛇足としてユーザーフォーム側に変数を持たせる場合の方法を書いておきます。

変数へのアクセス方法

以下のようにフォームオブジェクト.変数名とすれば変数にアクセスはできます(実際にはプロパティ扱い)。

a = UserForm1.hensu

注意点

この時注意すべき点として、普通にユーザーフォームを閉じると、その時点でhensuも初期化されてしまいます(質問のコードを書き換えただけだと0しか取得できない)。

対処案1:初期化される前に情報を確保する

ユーザーフォーム内に以下のようなメソッドを定義し、初期化を呼ばずに直接a = UserForm1.ShowDialog()と代入します。

'UserForm側 Function ShowDialog() As Currency Call Me.Show(vbModal) Let ShowDialog = hensu 'Let ShowDialog = CCur(Me.TextBox1.Text) End Function
Sub 処理() Dim a As Variant 'Call 初期化 a = UserForm1.ShowDialog() Stop 'break point 確認用 End Sub

対処案2:初期化されないようにする

ユーザーフォームを普通に閉じた場合は、Unload ユーザーフォーム相当の処理となり、初期化されてしまいます。
代わりにHideメソッドで隠すことで初期化を防ぐことができます。

Private Sub CommandButton1_Click() hensu = TextBox1.Text Me.Hide End Sub

この時、自分でUnloadしないとユーザーフォームがメモリ内に残り続けてしまいます。
Unloadを忘れてしまうと2回目以降の表示時に前回の情報が残った状態で表示されます。

投稿2018/07/13 10:45

imihito

総合スコア2166

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

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

0

ベストアンサー

Public変数を標準モジュール側に持っていったら上手くいきませんか?
http://home.att.ne.jp/zeta/gen/excel/c04p10.htm

投稿2018/07/13 01:42

編集2018/07/13 01:44
sysjojo

総合スコア325

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

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

jun_endo

2018/07/13 01:49

コンパイルが通りました! ただ、ユーザーフォームに値を入力して 実行しても何の反応もありませんでした。 一応念のために"Sub 処理()"側で、End Subの前に msgbox(hensu) を入力してもう一度実行しましたが、 ウィンドウは表示されませんでした。 おそらく、標準モジュール側に処理が回っていないっぽいのですが、 どうすればいいでしょうか?
sysjojo

2018/07/13 01:54

ボタンを押したときに処理()が走ればいいですか? Commmandbutton1_clickの中で処理()をCallしてやればいいですよ。 処理()はただのSubではなくPublic Subにしないとフォーム側から呼べないですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問