
いつもお世話になってます。
この度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ランキング
-
9月17日でサービス終了らし...
-
エクセルのdatedif関数を使って...
-
エクセルのVBAで集計をしたい
-
【マクロ】【配列】3つのシー...
-
特定のセルだけ結果がおかしい...
-
エクセル ドロップダウンリスト...
-
【マクロ】列を折りたたみ非表...
-
vba テキストボックスとリフト...
-
【関数】同じ関数なのに、エラ...
-
ページが変なふうに切れる
-
【条件付き書式】シートの中で...
-
【マクロ】オートフィルターの...
-
【マクロ】EXCELで読込したCSV...
-
【マクロ】アクティブセルの時...
-
【マクロ】3行に上から下に並...
-
エクセルの循環参照、?
-
【マクロ】A列にある、日付(本...
-
iPhoneのExcelアプリで、別のシ...
-
エクセル
-
【マクロ】WEBシステムから保存...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
BULKINSERTのWITHオプションに...
-
SQLServerでtime型への変換
-
片方のテーブルに無いデータを...
-
日付型項目のNULLについて(Pos...
-
データ突合のよい方法を教えて...
-
プロシージャがみつかりません...
-
参照渡しをする時は、渡される...
-
オークションでパソコンを売る場合
-
SQL文について
-
Access 2000 サブクエリとJOIN
-
こういう使い方はありですか?
-
MS SQL Serverでのクエリ文
-
DELETEについて(結合による)
-
UPDATEについて(結合による)
-
InputBoxについて
-
VBA 100億になると#が自動...
-
【SQL】指定期間の合計、MAX...
-
sql express内部結合して重複行...
-
差し込み後、元データを変更し...
-
フィルターかけた後、重複を除...
おすすめ情報
なるほど。
----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の他のテキストボックスなどでも使えるのでしょうか?
度々申し訳ございません。