選択した内容をユーザーフォームに表示したい(備忘録)

とある事情で、選択したセルの内容をユーザーフォームに表示したくなった。
挑戦してみよう。
f:id:Infoment:20201224224105p:plain

今回は、↓ の三つの果物から一つを選択する。
f:id:Infoment:20201224224221p:plain

ユーザーフォームは適当に、こんな感じで。
f:id:Infoment:20201224224256p:plain

兎に角選んだものを表示するだけなら、これだけでいい。
※以下は全て、シートモジュールに記載。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    UserForm1.Show
    UserForm1.Label1 = Target.Value
End Sub

f:id:Infoment:20201224224416p:plain

しかし今回は、選択しつつ、シート上で作業もしたい。
モードレスで開くことにしよう。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    UserForm1.Show vbModeless
    UserForm1.Label1 = Target.Value
End Sub

f:id:Infoment:20201224224648g:plain

しかしこのままだと、関係ないところを選んでも更新される。
また、複数セルを選択するとエラーになる。改善しよう。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Intersect(Target, Range("A1:A3")) Is Nothing Then Exit Sub
    
    UserForm1.Show vbModeless
    UserForm1.Label1 = Target.Value
End Sub

一見すると希望どおりの出来かなと思う。しかし、作業中にフォームの位置を
ずらしても、選択するたびに最初の位置に表示されてしまう。
f:id:Infoment:20201224225442g:plain

仕方ない、初回だけ表示させて、それ以外は都度開き直さないように(つまり
開きっぱに)しよう。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Intersect(Target, Range("A1:A3")) Is Nothing Then Exit Sub
    
    Dim UF As UserForm1
        If UF Is Nothing Then
            Set UF = New UserForm1
        End If
        If Not UF.Visible Then
            UF.Show vbModeless
        End If
        
        UF.Label1 = Target.Value
End Sub

出来たか?と思ったが失敗。考えてみれば、当たり前の話。
毎回Newする分だけ、ポコポコと増えている。
f:id:Infoment:20201224225941g:plain

仕方ない、UFはモジュールレベル変数にしよう。

Dim UF As UserForm1

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Intersect(Target, Range("A1:A3")) Is Nothing Then Exit Sub
    
    If UF Is Nothing Then
        Set UF = New UserForm1
    End If
    If Not UF.Visible Then
        UF.Show vbModeless
    End If
    
    UF.Label1 = Target.Value
End Sub

今度こそ成功か?
f:id:Infoment:20201224230251g:plain

と思いきや、ユーザーフォームを「×」で閉じた後にもう一度実行すると、
↓こんなエラーが出てしまった。
f:id:Infoment:20201224230409p:plain

ぐぬぬぬ、何でや・・・。試行錯誤を繰り返すうち、ユーザーフォームをUnload
することがNGらしい、ということに行き着いた。

そこでかなり強引かもしれないが、ユーザーフォーム側で「×」ボタンを押しても
閉じずに、非表示に留めるだけにした(Unloadしない)。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        Me.Hide
        Cancel = True
    End If
End Sub

f:id:Infoment:20201224230938g:plain

ここまであっさり書いているが、至るまでに、ここ数日かなり苦労した。
忘れないよう、備忘録としてここに記しておこう。

参考まで。