即効テクニック |
マルチページに追加するページ数が実行時にしか分からず、実行時に動的に追加する必要がある場合には・・・などが問題になります。 サンプルではワークシート数分のページをMultiPageに配置し、各ページにコマンドボタンを配置します。コマンドボタンのクリックイベント処理にはクラスを利用し、クリック時にはページの名称を取得し、ページ外のテキストボックスに転記します。 (前提) ・UserForm1, MultiPage1、TextBox1 ・クラスモジュール(Class1)
- ページの追加方法
- ページへのコントロールの追加方法
- 追加したコントロールのイベント処理
- ページ内外のコントロール間でのデータのやり取り
'=========フォームモジュール========= Dim Cls() As Class1 Private Sub UserForm_Initialize() Dim NumOfAdd As Integer Dim i As Integer, j As Integer Dim Ctrl As Control Dim P As Page With MultiPage1 'シート数 - デフォルトのページ数分だけページの追加 NumOfAdd = Worksheets.Count - .Pages.Count If NumOfAdd < 1 Then Exit Sub For i = 1 To NumOfAdd .Pages.Add Next i For Each P In .Pages '各ページにテキストボックスとコマンドボタンを配置 Set Ctrl = P.Controls.Add("Forms.CommandButton.1") With Ctrl .Top = 50: .Left = 100: .Width = 100 .Caption = Ctrl.Name End With 'ページごとに配置したコマンドボタンごとにクラスを生成 ReDim Preserve Cls(j) Set Cls(j) = New Class1 'クラス内部で宣言された変数にコマンドボタンを割り当てる Set Cls(j).Cmd = Ctrl j = j + 1 Next End With End Sub Private Sub UserForm_QueryClose _ (Cancel As Integer, CloseMode As Integer) Erase Cls End Sub
'=========クラスモジュール========= Public WithEvents Cmd As MSForms.CommandButton Private Sub Cmd_Click() '選択中ページのNameプロパティーを書き込む With UserForm1 .TextBox1.Value = .MultiPage1.SelectedItem.Name End With End Sub