![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
いつもお世話になってます。
この度Excelvba2013で、標準モジュールから最初のユーザーフォームtest1を呼び出し、CommandButton1をクリックしてさらに別のユーザーフォームtest2を呼び出し、test1で使用していた変数をそのまま使いたいのですが、標準モジュールにPublicで宣言すると使えるという方法があるそうですが、その方法を使いたくない場合、どのようにすればよいか分かりませんでした。
どのようにすれば宜しいでしょうか?
また、test1からtest2を呼び出した時に、test2のラベルの内容に、test1で取得していたdictionaryオブジェクトの値を表示したいのですが、どのようにすれば宜しいでしょうか?
お手数をおかけしますが、ご教授下さい。
★★★標準モジュール記載
Public Sub ShowForm()
Load test1
test1.Show vbModeless
End Sub
★★★フォーム1つ目(test1)
Dim ws As Worksheet
Dim myDic As Object
Dim mydicKey As Variant
Dim mydicitem As Variant
Dim row As Long
Dim c As Range
Private Sub UserForm_Initialize()
Dim i As Long
Set ws = ThisWorkbook.ActiveSheet
Set myDic = Nothing
Set myDic = CreateObject("Scripting.dictionary")
row = ws.Range("B" & Rows.Count).End(xlUp).Row
For Each c In ws.Range(ws.Cells(1, 2), ws.Cells(row, 2))
If c.Value Like "*番" Then
myDic.Add c.Value, c.Address
End If
Next c
mydicKey = myDic.Keys
mydicitem = myDic.Items
With ComboBox1
.ColumnCount = 2
.TextColumn = 2
For i = LBound(mydicKey) To UBound(mydicKey)
.AddItem ""
.List(i, 0) = mydicKey(i)
.List(i, 1) = ws.Range(mydicitem(i)).Offset(1, 0)
Next i
End With
End Sub
Private Sub CommandButton1_Click()
Me.Hide
Load test2
test2.Show vbModeless
End Sub
★★★フォーム2つ目(test2)test1から呼び出し
----test1で使用していた変数やオブジェクトを使用したい
----test2を呼び出したタイミングで、[Label1.Caption = UBound(mydicKey)]のような表示を行いたい
Private Sub Label2_Click()
Dim i As Long
For i = LBound(mydicKey) To UBound(mydicKey)
Debug.Print mydicKey(i)
Debug.Print mydicitem(i)
Next i
End Sub
Private Sub Label3_Click()'test2終了してtest1へ戻る
Load test1
test1.Show vbModeless
Unload Me
End Sub
No.2ベストアンサー
- 回答日時:
★★★フォーム1つ目続きtest2呼び出し
Private Sub CommandButton1_Click()
Me.Hide
Load test2
test2.Value2 = UBound(mydicKey)
test2.Show vbModeless
End Sub
★★★フォーム2つ目(test2)test1から呼び出し
Privete mValue2 As Long
Public Property Let Value2(ByVal Value1 As Long)
mValue2 = Value1
End Sub
Private Sub TextBox1_Change()
Label1.Caption = mValue2
End Sub
んな感じ。
何とかいけました。
Public Propertyの終わりは、End Propertyでした。
また、最初のコードとの組み合わせは、フォーム1のCall test2.FormInit(UBound(mydicKey))の前にtest2.Value2 = UBound(mydicKey)を入れることでできました。後ろでは、だめでした。
また、Public Property Letの方は、Value2 やらValue1 やらmValue2 やら名前が次々変化していてよく分からないのですが、これから動きを確認していこうと思います。
この度は、どうもありがとうございました。
No.1
- 回答日時:
★★★フォーム1つ目(test1)
Private Sub CommandButton1_Click()
Me.Hide
Load test2
Call test2.FormInit(UBound(mydicKey))
test2.Show vbModeless
End Sub
★★★フォーム2つ目(test2)test1から呼び出し
Public Sub FormInit(ByVal Value1 As Long)
Label1.Caption = Value1
End Sub
んな感じ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) フォーム上のリストボックスに重複して表示しています 3 2022/10/19 11:55
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オークションでパソコンを売る場合
-
1、Rstudioで回帰直線を求める...
-
JavaScriptの定数名が取り消し...
-
フィルターかけた後、重複を除...
-
広告ブロッカーのアドカードと...
-
for whichの使い方
-
エクセルVBAでEdate関数は使え...
-
誰か教えてください
-
マイクラPC版のコマンドで効率...
-
pythonで同じコード内で複数の...
-
外部参照してるキーを主キーに...
-
差し込み後、元データを変更し...
-
マクロ 連続印刷
-
副問合せの書き方について
-
英語ができる方、問題をお願い...
-
This video is no longer avail...
-
SQLによる"あいうえお"順でソー...
-
SQLについての質問
-
変数名「cur」について
-
c言語 入力した二つの数字の足...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
BULKINSERTのWITHオプションに...
-
片方のテーブルに無いデータを...
-
日付型項目のNULLについて(Pos...
-
SQLServerでtime型への変換
-
Access 2000 サブクエリとJOIN
-
オークションでパソコンを売る場合
-
指定値を否定した条件で、NULL...
-
差分のSQL
-
データ突合のよい方法を教えて...
-
SQL文について
-
プロシージャがみつかりません...
-
ユーザーID入力について
-
【SQL】指定期間の合計、MAX...
-
Excelvba2013で、ユーザーフォ...
-
外部結合+合計を出したい
-
マクロの同時実行
-
テーブルの結合(GROUP BY句の制...
-
UPDATEについて(結合による)
-
MS SQL Serverでのクエリ文
-
カラム名がcurrent_dateのテー...
おすすめ情報
なるほど。
----test2を呼び出したタイミングで、[Label1.Caption = UBound(mydicKey)]のような表示を行いたい
こちらは、うまくできました。
----test1で使用していた変数やオブジェクトを使用したい
については、今自分で見直しています。何とかできそうです。
見直しました。文字数の関係で分けます。一応動作しました。
★★★フォーム1つ目(test1)
Dim ws As Worksheet
Dim myDic As Object
Dim mydicKey As Variant
Dim mydicitem As Variant
Dim row As Long
Dim c As Range
Private Sub UserForm_Initialize()
Dim i As Long
Set ws = ThisWorkbook.ActiveSheet
Set myDic = Nothing
Set myDic = CreateObject("Scripting.dictionary")
Call 別モジュール.mydic_set(ws, myDic, mydicKey, mydicitem, row)
'~以下省略
End Sub
★★★フォーム1つ目続きtest2呼び出し
Private Sub CommandButton1_Click()
Me.Hide
Load test2
Call test2.FormInit(UBound(mydicKey),ws, myDic, mydicKey, mydicitem, row)
test2.Show vbModeless
End Sub
★★★フォーム2つ目(test2)test1から呼び出し
Public Sub FormInit(ByVal Value1 As Long)
Label1.Caption = Value1
End Sub
★★★サブモジュール
Function mydic_set(ByVal ws As Worksheet, myDic As Object, mydicKey As Variant, mydicitem As Variant, row As Long) As Object
Dim c As Range
row = ws.Range("B" & Rows.Count).End(xlUp).Row
For Each c In ws.Range(ws.Cells(1, 2), ws.Cells(row, 2))
If c.Value Like "*番" Then
myDic.Add c.Value, c.Address
End If
Next c
mydicKey = myDic.Keys
mydicitem = myDic.Items
End Function
以上
こんな感じでうまくいきました。
変数の宣言は、最初のフォームで行っています。サブモジュールで、Dim c As Rangeのみ入れてあります。他のモジュールで別の使い方をする為引き継いでいません。
これらを含め、問題ない書き方(引き継ぎ方)なのでしょうか?
お手数をおかけしますが、ご確認していただければありがたいです。
サブモジュールの宣言の最後にいらないのが付いていました。こっちが正しいですかね。
★★★サブモジュール
Function mydic_set(ByVal ws As Worksheet, myDic As Object, mydicKey As Variant, mydicitem As Variant, row As Long)
さて、今、続きを作っていて、Public Sub FormInit内で、 Value1を使用することができたのですが、
例えばですが、フォーム2の別の所で、
Private Sub TextBox1_Change()
Label1.Caption = Value1
End Sub
などとすると、Value1の値は0に戻っていました。どうやれば、フォーム1から引き継いだ値をフォーム2の他のテキストボックスなどでも使えるのでしょうか?
度々申し訳ございません。