PR
図形(オートシェイプ)操作

【Excel VBA】図形(オートシェイプ)を指定したセルの範囲内に挿入する

この記事では図形(オートシェイプ)の挿入方法を説明します。

また、指定したセル内に収まるようにサイズを調整してオートシェイプを挿入する方法も紹介します。

オートシェイプの挿入方法

まず、オートシェイプを挿入には、「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オブジェクト範囲です

このように、どの範囲指定でもはみ出ないようにオートシェイプを真ん中に挿入できました。

コメント