セルの幅と高さをVBAで指定する
VBAで読み込んだ画像のサイズにセルのサイズを合わせようとした時に、画像と同じ値に設定しているのにセルサイズが全然合わないのはなぜ??というのを調べてまとめました。
原因は、「高さ」と「幅」の値のサイズが違うからでした。関連するRangeオブジェクトのプロパティ値の単位は下記の表のようになります。
Rangeオブジェクトのプロパティ | 単位 | 値に対して |
---|---|---|
Width | ポイント | 取得のみ |
ColumnWidth | 文字数 | 取得と設定 |
Height | ポイント | 取得のみ |
RowHeight | ポイント | 取得と設定 |
ちなみにセルの高さはRowHeightプロパティ、幅はColumnWidthプロパティでしか変更することができません。HeightプロパティとHeightプロパティは値の取得だけしかできません。
そのため幅を設定するためには「列の幅」ColumnWidthプロパティを使わないといけないのですが、このプロパティ値の単位が文字数のためにおかしなことになってしまいます。
画像(Shapeオブジェクトなど)のWidthプロパティやHeightプロパティも単位は「ポイント」ですし、セルの「幅」Widthプロパティも単位は「ポイント」なので、その値を単純に「列の幅」ColumnWidthプロパティにセットすることができません。
おかしくならないようにするには、ポイントを文字数に変換して、その変換した値を「列の幅」ColumnWidthプロパティにセットしないといけません。変換は下記のように1ポイントあたりの文字数を算出してそれを乗算することで可能です。
Dim mojisu As Single '変換後の文字数
Dim value As Single '変換したいポイント値
value = 50
mojisu = value * (Range("A2").ColumnWidth / Range("A2").Width)
Range("A2").RowHeight = value
Range("A2").ColumnWidth = mojisu
上記では、A2セルの高さ・幅ともに50ポイントにするために、「行の高さ」に50を、「列の幅」に50ポイントを文字数に変換した値をセットしています。
なおRowHeightプロパティを50にした場合、Heightプロパティが49.5という風に同一値にならない場合があります。「高さ」でこういったズレが生じているので「幅」でも同様のことが発生していると思われますので、厳密に合わせる場合は補正が必要です。
広告