同じユーザーフォームを複数同時に表示させる
こんにちは。
派犬事務員のコロ子です。
前回「ユーザーフォームは作った瞬間にインスタンスが生成されてオブジェクトが使えるようになる」の記事を書いたら
「あえてインスタンスを生成することもできるよ」と教えていただいた。
ということは、同じユーザーフォームを複数同時に表示することもできるのか!?
さっそく試してみよう!
同じユーザーフォームを複数同時に表示させる
このユーザーフォームを2つ同時に表示する
Sub Test1() Dim uf1 As UserForm1 Dim uf2 As UserForm1 Set uf1 = New UserForm1 Set uf2 = New UserForm1 uf1.Show vbModeless uf1.TextBox1.Value = 100 ’←値の代入はフォーム表示の前でも後でも可 uf2.Show vbModeless uf2.TextBox1.Value = 200 uf2.Top = uf1.Top + 150 ’←フォームの位置設定はフォーム表示後に行う End Sub
おお!できた!
【解説】
UserForm1型の変数を宣言してNewでインスタンスを生成する
Sub Test1() Dim uf1 As UserForm1 Dim uf2 As UserForm1 Set uf1 = New UserForm1 Set uf2 = New UserForm1
ユーザーフォームはモードレス(vbModeless)で開く。
モードレスにしないとuf1を閉じてからでないとuf2が表示されない。
uf1.Show vbModeless
uf1とuf2が同じ位置に重ならないようにuf2を下にずらす。
uf.Show vbModeless uf.Top = FormTop
フォームの位置はフォームを表示してから設定しないとエラーになる。
TextBoxへの値の代入はフォーム表示の前でも後でも可。
ダブルクリックしたらどんどんフォームが開くのを作る
なんか楽しいのでダブルクリックしたらフォームが開くのを作ってみた。
クリックした数字をTextBox1に入れてどんどんフォームを開く。
シートモジュールに記載するコード
'2番目以降のフォームの位置。パブリック変数を用意する Public FormTop As Long 'ダブルクリックのイベント Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim uf As UserForm1 Set uf = New UserForm1 '前に作ったフォームと重ならないようにする FormTop = FormTop + 100 uf.TextBox1.Value = Target.Value uf.Show vbModeless uf.Top = FormTop End Sub
フォームモジュールに記載するコード
フォームを閉じるごとにフォームの開始位置を戻す
'ユーザーフォームを閉じるとき Private Sub UserForm_Terminate() Sheet1.FormTop = Sheet1.FormTop - 100 End Sub