選択した内容をユーザーフォームに表示したい(備忘録)
とある事情で、選択したセルの内容をユーザーフォームに表示したくなった。
挑戦してみよう。
今回は、↓ の三つの果物から一つを選択する。
ユーザーフォームは適当に、こんな感じで。
兎に角選んだものを表示するだけなら、これだけでいい。
※以下は全て、シートモジュールに記載。
Private Sub Worksheet_SelectionChange(ByVal Target As Range) UserForm1.Show UserForm1.Label1 = Target.Value End Sub
しかし今回は、選択しつつ、シート上で作業もしたい。
モードレスで開くことにしよう。
Private Sub Worksheet_SelectionChange(ByVal Target As Range) UserForm1.Show vbModeless UserForm1.Label1 = Target.Value End Sub
しかしこのままだと、関係ないところを選んでも更新される。
また、複数セルを選択するとエラーになる。改善しよう。
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
一見すると希望どおりの出来かなと思う。しかし、作業中にフォームの位置を
ずらしても、選択するたびに最初の位置に表示されてしまう。
仕方ない、初回だけ表示させて、それ以外は都度開き直さないように(つまり
開きっぱに)しよう。
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する分だけ、ポコポコと増えている。
仕方ない、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
今度こそ成功か?
と思いきや、ユーザーフォームを「×」で閉じた後にもう一度実行すると、
↓こんなエラーが出てしまった。
ぐぬぬぬ、何でや・・・。試行錯誤を繰り返すうち、ユーザーフォームを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
ここまであっさり書いているが、至るまでに、ここ数日かなり苦労した。
忘れないよう、備忘録としてここに記しておこう。
参考まで。