VBA コンボボックスにフォントリストを表示
フォームにフォントリストを表示するコンボボックスを作ってみました。
フォームにコンボボックスを追加し、クリックします。
Private Sub ComboBox1_Change()が作成されるので、右側のプロシージャープルダウンから、DropButtonClickを選択します。
すると、Private Sub ComboBox1_DropButtonClick()プロシージャーが作成されます。これは、ドロップボタンがクリックされたときに実行されます。
作成されたプロシージャーに次のように入力します。
コピペ用:
標準モジュールを追加して、次のようにフォームを表示するプロシージャーを作り、実行します。
次のようにフォームが表示され、ドロップボタンをクリックするとフォントリストが表示されます。
職場でWord上で実装した際には、クリックしてからリストが表示されるまでに、2、3秒かかりました。
自宅でExcel上で実行したところ、ほぼ瞬時でした。WordとExcelの違いか、マシンパワーの違いか、はたまたセキュリティ対策ソフトの違いか。
いずれにしろ、Word上では、フォームの初期化時にフォントリストを作成すると、フォームが表示されるのが遅かったので、とりあえずフォームを表示し、ドロップボタンをクリックされたときに作成されるようにしました。
参考
基本的な考え方はこちらに書かれています。
フォントの一覧を取得する Office TANAKA
IDを使ってコントロールを特定する方法がこちらです。
フォントファイルを検索して、それをリストするという方法もヒットしましたが、それだと並び順が良く使うフォント順にならないと思い、上記の方法を採用しました。
ただ、サイトによっては、このコマンドバーを使う方法はサポートされていないとも書かれているので、将来の互換性が怪しいかもしれません。
コード解説
一応コードの解説をしておこうと思います。
Private Sub ComboBox1_DropButtonClick()全体としては、Officeのメニューにあるフォントのコンボボックスから、ユーザーフォームのコンボボックスに、フォント名をコピーするというものです。
はじめの If ComboBox1.ListCount = 0 Then はフォントを二回以上読み込むのを防ぐためのものです。自宅環境ではほぼ瞬時ですが、職場のPCでは遅かったためです。
Set uCB = Application.CommandBars.FindControl(ID:=1728) は、ID 1728のコントロールをコマンドバーから探して、取得するというものです。ID 1728がフォントリストのコンボボックスに相当するようです。
コマンドバーは昔のOfficeのユーザーインターフェイスで、現在はリボンインターフェイスに置き換えられています。互換性のために今のところは使えるのではないかと思います。
For i = 1 To .ListCount は、コンボボックスのアイテム(フォント名)の数だけ、iをカウントアップしています。 .ListCountは コンボボックスのアイテム数を示しています。
ComboBox1.AddItem .List(i) は、カウントアップするiを使って、Listのアイテム(フォント名)を取得し、ユーザーフォームのコンボボックスに追加しています。
この部分、Listがリスト構造なら、 for each uItem in .List で高速化できるのではと思いました(リスト構造にインデックスを使ってアクセスすると遅い)。しかし、試してみるとエラーが発生し、 .List は指定できませんでした。
また、 List() の引数 Indexは必須のパラメーターでした。
CommandBarComboBox.List property (Office)
そして、デバッグのためローカルウィンドウで uCBの中身を見たところ、なんと List プロパティは表示されませんでした。
一応 uCB. と打つと List は表示され、インテリセンスは効いています。
CommandBarComboBoxのListは奇妙な実装です。
追記: パラメーター必須のプロパティはローカルウィンドウに表示されないそうです。
コメント
コメントを投稿