セルの幅と高さをVBAで指定する

Visual Basic for Applications (VBA)

VBAで読み込んだ画像のサイズにセルのサイズを合わせようとした時に、画像と同じ値に設定しているのにセルサイズが全然合わないのはなぜ??というのを調べてまとめました。
単純に列幅と行高を50にセットすると大きさが合わない

原因は、「高さ」と「幅」の値のサイズが違うからでした。関連するRangeオブジェクトのプロパティ値の単位は下記の表のようになります。

Rangeオブジェクトのプロパティ 単位 値に対して
Width ポイント 取得のみ
ColumnWidth 文字数 取得と設定
Height ポイント 取得のみ
RowHeight ポイント 取得と設定

ちなみにセルの高さはRowHeightプロパティ、幅はColumnWidthプロパティでしか変更することができません。HeightプロパティとHeightプロパティは値の取得だけしかできません。

そのため幅を設定するためには「列の幅」ColumnWidthプロパティを使わないといけないのですが、このプロパティ値の単位が文字数のためにおかしなことになってしまいます。
値の単位は、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ポイントを文字数に変換した値をセットしています。
行高を50ポイント、列幅を50ポイント相当の文字数でセットするとほぼ正方形になる

なおRowHeightプロパティを50にした場合、Heightプロパティが49.5という風に同一値にならない場合があります。「高さ」でこういったズレが生じているので「幅」でも同様のことが発生していると思われますので、厳密に合わせる場合は補正が必要です。