アトム電器 三軒家店(有限会社 おかもとでんか)のホームページ。大阪市大正区にある町の電気屋さん。家電製品の販売、エアコン、電気工事、パソコンからリフォーム、オール電化など電気のことならなんでもお任せ下さい!アトム電器三軒家店

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

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という風に同一値にならない場合があります。「高さ」でこういったズレが生じているので「幅」でも同様のことが発生していると思われますので、厳密に合わせる場合は補正が必要です。