派遣事務員の迷走

派遣事務員コロ子。会社の犬。顔出しNG。常に迷走している。

同じユーザーフォームを複数同時に表示させる

こんにちは。
派犬事務員のコロ子です。

前回「ユーザーフォームは作った瞬間にインスタンスが生成されてオブジェクトが使えるようになる」の記事を書いたら
「あえてインスタンスを生成することもできるよ」と教えていただいた。
ということは、同じユーザーフォームを複数同時に表示することもできるのか!?
さっそく試してみよう!

同じユーザーフォームを複数同時に表示させる

このユーザーフォームを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