概要
RotateShapeFitCellは、Excel VBAでShapeを90度回転し、指定したRangeの位置とサイズに合わせるための汎用関数です。
バーコード画像や矢印などの図形を、印刷用レイアウトのセル範囲にきれいに収めたいときに使えます。回転後の幅と高さをセルに合わせ、中心座標の差分を計算して図形を移動します。
使う場面
- 横向きに作成したバーコードを、印刷用紙に合わせて縦向きに配置したい
- 図形を90度回転したうえで、指定セル範囲の中央に合わせたい
Shape.LeftやShape.Topの直接指定だけでは位置合わせが崩れる処理を共通化したい- 帳票やラベル印刷用の図形配置を再利用できる形にしたい
処理イメージ図

使用例
下の例では、BarcodeShapeという名前の図形を取得し、B2セルの位置とサイズに合わせます。
Dim BarcodeShape As Shape
Set BarcodeShape = ActiveSheet.Shapes("BarcodeShape")
Set BarcodeShape = RotateShapeFitCell(BarcodeShape, ActiveSheet.Range("B2"))コピー可能な実装コード
' === Module: ModShape ===
Public Function RotateShapeFitCell(ByRef Shape As Shape, _
ByRef Cell As Range) _
As Shape
'Shapeを90度回転させてCellのサイズにあわせる
'20260122
'引数
'Shape・・・対象のShape
'Cell ・・・位置をあわせるCell
'一旦移動する(左上から遠くに置いておかないと変形に影響が出る)
Shape.Left = WorksheetFunction.Max(Shape.Width, Shape.Height) * 2
Shape.Top = WorksheetFunction.Max(Shape.Width, Shape.Height) * 2
'縦横比変更
Shape.Width = Cell.Height
Shape.Height = Cell.Width
'90度回転
Shape.Rotation = 90
'CellとShapeの中心座標計算
Dim ShapeCenterTop As Double: ShapeCenterTop = Shape.Top + Shape.Height / 2
Dim ShapeCenterLeft As Double: ShapeCenterLeft = Shape.Left + Shape.Width / 2
Dim CellCenterTop As Double: CellCenterTop = Cell.Top + Cell.Height / 2
Dim CellCenterLeft As Double: CellCenterLeft = Cell.Left + Cell.Width / 2
'移動量計算(中心座標の差分が移動量)
Dim MoveLeft As Double: MoveLeft = CellCenterLeft - ShapeCenterLeft
Dim MoveTop As Double: MoveTop = CellCenterTop - ShapeCenterTop
'Shape移動
Call Shape.IncrementLeft(MoveLeft)
Call Shape.IncrementTop(MoveTop)
'※ 「Shape.Left = ** 」の処理はマイナスを指定できない
'出力
Set RotateShapeFitCell = Shape
End Function初心者向けコード解説
ByRef Shape As Shapeは、回転・移動させたい図形を受け取る引数です。Excel上の図形、画像、バーコード画像などはShapeとして扱えます。
ByRef Cell As Rangeは、図形を合わせたいセル範囲です。単一セルだけでなく、結合セルや複数セル範囲を渡す設計にも応用できます。
最初にShape.LeftとShape.Topを大きめの位置へ一旦移動しています。これは、左上付近で回転やサイズ変更を行うと、図形の変形や位置計算に影響が出ることを避けるためです。
Shape.Width = Cell.Height、Shape.Height = Cell.Widthでは、90度回転する前提で幅と高さを入れ替えています。
Shape.Rotation = 90で図形を90度回転します。その後、図形とセルの中心座標をそれぞれ計算し、中心同士の差分をMoveLeftとMoveTopとして求めています。
最後にIncrementLeftとIncrementTopで図形を移動します。コメントにもある通り、Shape.Left = **だけでは扱いにくいケースがあるため、移動量で調整しています。
注意点
- 図形名は事前に把握しておく必要があります。
ActiveSheet.Shapes("BarcodeShape")のように取得します。 - 90度回転専用の関数です。180度や任意角度にはそのまま対応していません。
- セルの幅や高さが小さすぎる場合、図形も小さくなりすぎることがあります。
- 図形の種類や元画像の余白によっては、見た目上の中央と座標上の中央がずれて見える場合があります。
まとめ
RotateShapeFitCellを使うと、VBAで図形を90度回転してセル範囲に合わせる処理を共通化できます。
バーコード、矢印、印刷用画像など、図形を帳票レイアウトへ合わせる処理で再利用しやすい汎用プロシージャです。
