2022/07/27

横スクロールバーを出さないリスト(コンボボックス編)

フォームでコンボボックスコントロールを使うことは多く、またそのリストを複数列表示にすることも良くあります。
しかし、ComboBoxのWidhtプロパティとColumnWidthsプロパティの値をうまく設定しないと、図1の左側Aのように「横スクロールバー」が現れてしまい、リストの項目を見るのに「スクロールバーを動かす」という手間が増えてしまいます。見栄えも悪いと感じるかもしれません。
複数列のコンボボックス(横スクロールバー有無)
図1


今回は、コンボボックスのリストに横スクロールバーが出ない条件を説明します。但しPCの環境やExcelのバージョンによっては値が異なる可能性もありますが、恐らく近い値だと思うのでトライ&エラーで導き出して下さい。

1.ColumnWidthsを設定しない場合

ColumnWidthsを設定せず、且つ「単列」の場合は、図2のように「横スクロールバーは現れない」ようです。
単列のコンボボックス(列幅指定無し)
図2


ComboBoxの幅(Widthプロパティ値)を変化させて見ると、以下の様なことが分かります。
 ・Widthが小さい(例えば図2の右側)場合は、ある程度の広さのリストが現れる。
 ・徐々にWidthを広げると、72(単位:ポイント)あたりでリストと同じくらいの幅になる(図2の中央)。
 ・もっとWidthを広げると、リストの幅も一緒に広がる(図2の右側)。

次に「ColumnWidthsの設定無し+複数列」の場合です。2列の場合と3列の場合を図3に示します。
複数列のコンボボックス(列幅指定無し)
図3


ComboBoxの幅(Widthプロパティ値)を変化させて見ると、2列では「145.5(ポイント)」で横スクロールバーが消え、3列では「217.5」で消えました。
この結果を連立方程式で解いてみると、以下のような関係式になります。

ComboBoxのWidth値 ≧ 列数 × 72 + 1.5」(ColumnWidthsの設定無し)

式内の「72」という値は図2の中央図の値と同じなので、何か繋がりがあるようにも見えます。

2.ColumnWidthsを設定する場合

単列のコンボボックスで「ColumnWidthsを設定」した場合、コンボボックスの幅(Width値)が小さい場合は「ColumnWidthsを72以内」に押さえないと横スクロールバーが現れてしまいます(図4の左側2個)。

単列のコンボボックス(列幅指定有り)
図4


そこから横スクロールバーが現れない限界をたどっていくと、Width値が73.5まではColumnWidths値が72で、それ以上は
ComboBoxのWidth値 - 1.5 ≧ ColumnWidths値
が「横スクロールバーが出ない条件」のようです。

複数列も調べると図5のように、Width値と「ColumnWidthsの合計値」との間に同様の関係が得られることが分かりました。

複数列のコンボボックス(列幅指定有り)
図5


これらをグラフにしてみると、図6のようになります。
WidthとColumnWidthsの関係(列幅指定有り)
図6


今回の「1.5」という値も、もちろんキッチリと0.5ポイント単位になっているわけではなく「1.45197・・・」という切りの悪い数値のようですし、「72」も「72.0283・・・」という値のようです。
また「先入先出の入出庫管理システム」では、WidthとColumnWidthsの差は「2」と説明しました。今回確認をし直した中で「約1.5」と分かりましたが、実用上は小数点を使わずに「2」で計算する方が間違いが少ないかと思います。

アプリ実例

先入先出の入出庫管理システム