[[20200607100518]] 『ユーザーフォーム イベントの共通化について』(かずま) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザーフォーム イベントの共通化について』(かずま)

こんにちは。

ユーザーフォームについて質問をさせてください。

まず、今回作成しているファイルでは、Sheet1を開いた際に、UserForm1
が起動する様になっております。

UserForm1には、Label1〜Label20まで設定されております。

やりたい事としては、例えばLabel1をクリックした際にUserForm2が立ち上がり、UserForm2に設定されている2つのTextBox内に、Sheet2.Range("F2")、Sheet2.Range("G2")の内容が表示される様になっているのですが、それを
Label1をクリックした場合→Sheet2.Range("F2")、Sheet2.Range("G2")
Label2をクリックした場合→Sheet2.Range("F3")、Sheet2.Range("G3")
Label3をクリックした場合→Sheet2.Range("F4")、Sheet2.Range("G4")



とクリックしたLabelによって、上記のルールでUserForm2内のTextBoxの内容を変化させれないかと考えています。1つずつイベントを作ってUserFormを作れば出来ると思うのですが、共通化させる事は出来ないでしょうか?

現状、UserForm1と2の記述は以下の様になっております。

UserForm1

*********************************

Private Sub Label1_Click()

UserForm2.Show vbModeless

End Sub

UserForm2

*********************************

Private Sub UserForm_Initialize()

Me.TextBox1.Value = Sheet2.Range("F2")
Me.TextBox2.Value = Sheet2.Range("G2")

どうぞ、よろしくお願い致します。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


https://tonari-it.com/excel-vba-class-constructor/
もしかしたらこのあたりが役に立つかもしれません。
(虎ノ門ヒルズ) 2020/06/07(日) 10:36

とりあえず簡単に書いてみたので、細かいところは微調整してください。

クラスモジュール(Class1)を作成し、以下のように記述してください。

 Private WithEvents lbl As Msforms.label
 Private text1 As Variant
 Private text2 As Variant

 Public Sub lbl_Click()		'※1ラベルをクリックしたときの動作
    With UserForm2
        .TextBox1.Value = text1 '下で登録するtext1とtext2をテキストボックスに表示させる
        .TextBox2.Value = text2
        .Show vbModaless	'UserForm2を表示
    End With
 End Sub

 Public Sub Setup(ByVal mLabel As Msforms.label, ByVal Arg1 As Variant, ByVal Arg2 As Variant) '※2ラベルに情報を登録する命令を決める
    Set lbl = mLabel	'変数lblにラベルオブジェクトを登録
    text1 = Arg1	'変数text1とtext2に値を登録
    text2 = Arg2
 End Sub

また、UserForm1にはこれを書いてください。

 Dim cls() As Class1		'クラス名をモジュール変数で宣言

 Private Sub UserForm_Initialize()
    Dim i As Long
    ReDim cls(1 To 20)
    For i = LBound(cls) To UBound(cls)
        Set cls(i) = New Class1	'変数clsにクラスを新規登録
        cls(i).Setup Controls("Label" & i), Sheet2.Range("F" & i + 1).Value, Sheet2.Range("G" & i + 1).Value	'※2の命令で各ラベルに情報を登録する
    Next i
 End Sub

※1 個々のラベルをクリックしたときの命令です。UserForm1のコードではなくクラスモジュール側に書きます。
(虎ノ門ヒルズ) 2020/06/07(日) 17:23


コードまで書いて頂きありがとうございます。頂いたコードで目的の動きになりました。

参考に頂いたページからクラスモジュールについて色々調べては見たのですが、今の時点では理解が及びませんでした。
今回、書いて頂いたコードも理解出来ていない部分はありますが、参考に勉強させて頂きたいと思います。ありがとうございました。
(かずま) 2020/06/07(日) 17:57


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.