ExcelVBAマクロ ListBoxの文字幅調整についての備忘録
①はじめに
今回は、ExcelVBA(以下VBA)のListBoxのプロパティ設定について記載します。
筆者が業務効率化のため、自身で使うマクロを作成した際に調べた内容のまとめです。
VBAでファイル名や、ファイルパスを指定したくなる場面は多々あると思われます。
その際に、ListBoxのWidthやColumnWidthsを気にせずlistBox.AddItem XXXといった具合に文字列を追加すると下記画像のように、文字が見切れる場合があると思います。
文字が見切れていると、誤ったファイルを指定していても気が付けないことが懸念されます。
例としてWidthが200、ColumnWidthsがNothingのlistBox(図1)を用意しました。
図1のlistBoxへ文字列
「C:\work\15_doc\90_other\90_oisBlog\20190614\target\テキスト.txt」
を追加すると、文字が見切れてしまうことがわかります。 (図2)
②静的にColumnWidthsの値を指定する
そこで、図1,2のlistBoxのColumnWidthsを400ptに調整してみると(図3)、スクロールバーが表示されてWidthで指定した幅以上の文字も表示可能になります。(図4)
しかし静的に値を指定するだけでは、文字数が多く文字列を表示しきれないケース(図4)や不要な余白が表示されるケース(図5)が想定されます。
③動的にColumnWidthsの値を指定する
そのため、スクロールバーの長さがちょうどよくなるように、listBoxに追加された文字列の最大文字数に合わせてlistBox.ColumnWidthsを動的に調整する処理(図6)を実装しました。
内容は単純で、listBoxの文字を「MSゴシック 9pt」固定として文字列長を算出し,計算した値をlistBox.ColumnWidthsに割り当てているだけです。
単純な実装なだけあって実行速度を計測したところサブルーチン全体で0.000026秒と高速であり、複数の文字列を投入する際もストレスなく動作してくれそうです。
文字列長はGraphicクラスを利用することでフォントやサイズを問わず動的に取得できるそうですが、今回は割愛します。
結果として、図7のように程よい幅におさまってくれました。
④プロポーショナルフォントと等幅フォントについて
図6で述したソースコードでは文字を「MSゴシック 9pt」固定としていますが、等幅フォント(モノスペース)であれば同じ動作が期待できます。(図8)
※等幅フォント(モノスペース):文字の幅がすべて均一なフォント ex)MSゴシック
プロポーショナルフォントを指定している場合は、文字ごとに幅が異なるため図6のソースコードでは文字があふれる場合があります。(図9)
※プロポーショナルフォント:文字によって文字幅が異なるフォント ex)Calibri
⑤まとめ
使用できるフォントは限られますが、listBoxのColumnWidthsを調整する方法についてまとめました。
フォントに言及した記事が見当たらなかったため、備忘録としてまとめました。
また機会があれば、Graphicクラスを利用したプロポーショナルフォントでのColumnWidthsの調整について記載したいと思います。