ExcelVBAマクロ ListBoxの文字幅調整についての備忘録

①はじめに

今回は、ExcelVBA(以下VBA)のListBoxのプロパティ設定について記載します。

筆者が業務効率化のため、自身で使うマクロを作成した際に調べた内容のまとめです。

ExcelVBAマクロ ListBoxの文字幅調整についての備忘録

VBAでファイル名や、ファイルパスを指定したくなる場面は多々あると思われます。

その際に、ListBoxのWidthやColumnWidthsを気にせずlistBox.AddItem XXXといった具合に文字列を追加すると下記画像のように、文字が見切れる場合があると思います。

 

文字が見切れていると、誤ったファイルを指定していても気が付けないことが懸念されます。

 

例としてWidthが200、ColumnWidthsがNothingのlistBox(図1)を用意しました。

図1.listBox(Width:200, ColumnWidths:Nothing)

図1.listBox(Width:200, ColumnWidths:Nothing)

図1のlistBoxへ文字列
「C:\work\15_doc\90_other\90_oisBlog\20190614\target\テキスト.txt」
を追加すると、文字が見切れてしまうことがわかります。 (図2)

図2.listBoxへ文字列を追加した際の表示

図2.listBoxへ文字列を追加した際の表示

 

②静的にColumnWidthsの値を指定する

そこで、図1,2のlistBoxのColumnWidthsを400ptに調整してみると(図3)、スクロールバーが表示されてWidthで指定した幅以上の文字も表示可能になります。(図4)

図3.listBoxのColumnWidthsを400へ変更

図3.listBoxのColumnWidthsを400へ変更

図4. ColumnWidths変更後の表示

図4. ColumnWidths変更後の表示

しかし静的に値を指定するだけでは、文字数が多く文字列を表示しきれないケース(図4)や不要な余白が表示されるケース(図5)が想定されます。

図5.余白が多すぎる場合の表示

図5.余白が多すぎる場合の表示

 

③動的にColumnWidthsの値を指定する

そのため、スクロールバーの長さがちょうどよくなるように、listBoxに追加された文字列の最大文字数に合わせてlistBox.ColumnWidthsを動的に調整する処理(図6)を実装しました。

図6. listBox.ColumnWidthsを動的に調整する処理

図6. listBox.ColumnWidthsを動的に調整する処理

内容は単純で、listBoxの文字を「MSゴシック 9pt」固定として文字列長を算出し,計算した値をlistBox.ColumnWidthsに割り当てているだけです。

単純な実装なだけあって実行速度を計測したところサブルーチン全体で0.000026秒と高速であり、複数の文字列を投入する際もストレスなく動作してくれそうです。

文字列長はGraphicクラスを利用することでフォントやサイズを問わず動的に取得できるそうですが、今回は割愛します。

結果として、図7のように程よい幅におさまってくれました。

図7. ColumnWidths動的調整後のlistBox

図7. ColumnWidths動的調整後のlistBox

 

④プロポーショナルフォントと等幅フォントについて

図6で述したソースコードでは文字を「MSゴシック 9pt」固定としていますが、等幅フォント(モノスペース)であれば同じ動作が期待できます。(図8)

図8.listBoxに等幅フォントを指定

図8.listBoxに等幅フォントを指定

※等幅フォント(モノスペース):文字の幅がすべて均一なフォント ex)MSゴシック

 

プロポーショナルフォントを指定している場合は、文字ごとに幅が異なるため図6のソースコードでは文字があふれる場合があります。(図9)

図9.listBoxにプロポーショナルフォントを指定

図9.listBoxにプロポーショナルフォントを指定

※プロポーショナルフォント:文字によって文字幅が異なるフォント ex)Calibri

 

⑤まとめ

使用できるフォントは限られますが、listBoxのColumnWidthsを調整する方法についてまとめました。

フォントに言及した記事が見当たらなかったため、備忘録としてまとめました。

 

また機会があれば、Graphicクラスを利用したプロポーショナルフォントでのColumnWidthsの調整について記載したいと思います。