この記事では図形(オートシェイプ)の挿入方法を説明します。
また、指定したセル内に収まるようにサイズを調整してオートシェイプを挿入する方法も紹介します。
オートシェイプの挿入方法
まず、オートシェイプを挿入には、「Shapes」コレクションの「AddShape」メソッドを使用します。
AddShapeメソッドの基本構文
Shapes.AddShape Type, Left, Top, Width, Height
・Type ・・・オートシェイプの種類(MsoAutoShapeTypeの定数)
・Left ・・・オートシェイプの左端の位置
・Top ・・・オートシェイプの上端の位置
・Width ・・・オートシェイプの幅
・Height・・・オートシェイプの高さ
今回は例として「C5セル」を起点として「にこちゃんマーク(MsoAutoShapeSmileyFace)」を挿入するマクロについて説明します。
<マクロ実行結果のイメージ>
<コード紹介>
Sub SmilyFace挿入()
Dim R As Range
Set R = Range("C5")
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, R.Left, R.Top, 50, 50
End Sub
<コードの解説>
まず、「C5セル」を「Rangeオブジェクト」として取得します。
そして、Shapes.AddShapeの変数に挿入するオートシェイプの”タイプ”、”位置”、”サイズ”
を指定してマクロを実行すると、オートシェイプが挿入されます。
・Type ・・・オートシェイプの種類 =msoShapeSmileyFace
・Left ・・・オートシェイプの左端の位置 =Range(“C5”)の左端の位置
・Top ・・・オートシェイプの上端の位置 =Range(“C5”)の上端の位置
・Width ・・・オートシェイプの幅 =仮に50pt(ポイント)で設定
・Height・・・オートシェイプの高さ =仮に50pt(ポイント)で設定
この場合、コード内の「 Set R = Range(“C5”)」を「 Set R = Selection」と変更すると、
選択しているセルの一番左上のセルを起点としてオートシェイプが挿入できるようになります。
指定したセルの中心にオートシェイプを挿入する方法
先ほどの事例では、セルの左上端にオートシェイプを挿入しましたが、実際はセルの中心に挿入することが求められることが多いので、セルの中心にオートシェイプを挿入する方法を紹介します。
<マクロ実行後のイメージと要件>
- 挿入位置は一つのセル、もしくは複数セルの選択範囲内でも中心となるように挿入したい
- セルに合わせて余白を設けたい(見栄えと、フィルターでソートをした時の異常発生対策)
<コード紹介>
Sub SmilyFace()
Dim R As Range
Dim Shape_size As Single
'選択したセルの範囲のRangeオブジェクトを取得する
Set R = Selection
'選択したセルからオートシェイプがはみ出ないように、
'選択した範囲が縦長or横長の場合でオートシェイプのサイズをそれぞれ設定する
If R.Width > R.Height Then
Shape_size = R.Height
Else
Shape_size = R.Width
End If
'「SmileyFace」のオートシェイプを選択したセルの中央へ挿入する
'ただし、選択範囲ギリギリのサイズにならないように短辺側に20%の余白を設けることとする
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, _
R.Left + R.Width / 2 - Shape_size * 0.8 / 2, _
R.Top + R.Height / 2 - Shape_size * 0.8 / 2, _
Shape_size * 0.8, _
Shape_size * 0.8
End Sub
<コードの解説>
今回は例として(C5:E7セルの範囲)を選択した状態で、セル範囲内の中心にオートシェイプを挿入する方法を紹介します。
まず、オートシェイプを挿入するセル(C:5E7セルを選択した状態)をRangeオブジェクトとして取得します。
次に、Rangeオブジェクトの範囲からはみ出ないようにオートシェイプのサイズを指定します。
サイズの考え方について、Rangeオブジェクトの範囲が”縦長”か”横長”かによって、下図のように変化しますので、IF構文を使用して「Rangeオブジェクトの幅と高さ」によってサイズの考え方の分岐を入れます。
最後に、Shapes.AddShapeによって指定したセル範囲内にオートシェイプを挿入します。
今回は余白を20%設けていますが、位置とサイズの考え方は下図の通りです。
先ほど、Rangeオブジェクトが”縦長”か”横長”かでサイズの考え方をIF構文で分岐していると説明していますが、実際に色々なサイズでマクロを実行した結果を掲載しておきます。
※色塗りしたセルがそれぞれのRangeオブジェクト範囲です
このように、どの範囲指定でもはみ出ないようにオートシェイプを真ん中に挿入できました。
コメント