プチIT化

【Excel VBA】リストボックスのリストの枠線をなくすには

こんにちは、わたあめです。今日はExcelのVBAのユーザフォームのリストボックスについての記事です。セル範囲からリストボックスを作成して表示したところ、リストの項目すべてに枠線がついた状態で表示される事象に出会いました。

わたあめ
わたあめ
枠線なしにしたいな…!(汗)

枠線がついていても処理に問題はないのですが、見た目ない方が個人的には綺麗な感じがするので、枠線を表示しない方法を考えていきます。それでは、いってみましょう!

事象詳細

事象の詳細です。

  • ユーザフォームで作成したリストボックスの項目ひとつひとつが枠線に囲われてしまう
  • リストは複数選択できるようになっている
    UserForm1.ListBox1.MultiSelect = 1
  • 枠線は一度選択して解除すると消える
  • VBAのマクロ処理を妨げるものではない

処理上は問題ない物の、やはり見た目上気になるので今回は対策を練る事としました。

対処:他のパーツにフォーカスすれば枠線は消える

対処方法としては、他のボタンなどのリストボックスではない他パーツにフォーカスさせれば枠線は消えるようです。自身のリストボックス以外にフォーカスを持っていけば、リストボックスの枠線は解除されました。

フォーカスは、基本的には以下の構文を使います。

オブジェクト.SetFocus

例えば、テキストボックスにフォーカス(入力できる状態)にするならば、「TextBox1.SetFocus」という書き方をします。作成しているユーザフォームの中に、他のパーツにフォーカスさせれば良いです。

今回はリストボックスの全解除ボタンを付けた

今回は、ボタンを新たに作成し、そこにフォーカスさせるようにしました。

「全解除」ボタンがCummandButton1だとして、リストボックスをShowした後にボタンにフォーカスするマクロを入れています。

CommandButton1.SetFocus

ボタン側のマクロは、リストボックスのリストを選択した後、選択を全解除するというVBAが動くマクロを追加しています。全解除マクロサンプルは以下です。

Private Sub CommandButton1_Click()
 '全解除
  Dim i As Integer
  With UserForm1.ListBox1
   For i = 0 To .ListCount - 1
    .Selected(i) = False
   Next i
  End With
End Sub
わたあめ
わたあめ
これで無事にひとつひとつに付いていた謎の枠線が消えました!

SetFocusでフォーカスできる・できないパーツがあるので注意

フォーカスできるパーツとできないパーツがあるので注意です。以下表にまとめました。

フォーカスできるテキストボックス、コンボボックス、リストボックス(※)、チェックボックス、リストボックス、オプションボタン、トグルボタン、フレーム、タブ、スクロールバー、マルチページ、スピンボタン、RefEdit
フォーカスできないラベル、画像

ラベルと画像(イメージ)にはフォーカスが合わせられない、SetFocusメソッドが使えないので注意です。※またリストボックスはフォーカス可ですが、自分自身にフォーカスしてもひとつひとつの枠線は消えなかったです。

ちなみに、SetFocusに対応していない場合は、以下のエラーが出ました。

実行時エラー 2110
コントロールが表示されていない、利用できない、またはフォーカスを持てないため、そのコントロールにフォーカスを移すことはできません。

さいごに

いかがだったでしょうか。同じような事象に出会った方の参考になれば幸いです。それでは、また!

20代向けITエンジニア特化型就職サポート【ウズキャリIT】