検索
連載

Excelでオートシェイプを表示、削除、画像を挿入するVBA/マクロ便利Tips

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、Shapesオブジェクトの基本操作としてAddShape/Deleteメソッドの使い方や、オートシェイプに画像を挿入するFillFormat.UserPictureメソッドの使い方などを解説。

Share
Tweet
LINE
Hatena
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 8.1 Enterprise(64ビット)+Excel 2013


 今回は、「オートシェイプ」に関するTipsだ。「オートシェイプの種類を設定して表示する」方法と「オートシェイプに画像を挿入する」方法について解説していこう。

 初めはオートシェイプを扱う基本として、「オートシェイプの種類を設定して表示する」方法について解説する。

オートシェイプの種類を設定して表示する

 オートシェイプの種類を設定して表示するにはShapesオブジェクトのAddShapeメソッドを使う。

オートシェイプの種類を設定して表示するShapes.AddShapeメソッドの書式

Shapes.AddShape {Type},{Left},{Top},{Width},{Height}


 {Type}には表1の値を指定する。{Left}にはオートシェイプの左端の位置、{Top}には上端の位置、{Width}には幅、{Height}には高さを指定する。

表1 オートシェイプの種類
名前 値) 説明
msoShape16pointStar 94 16角の星
msoShape24pointStar 95 24角の星
msoShape32pointStar 96 32角の星
msoShape4pointStar 91 4角の星
msoShape5pointStar 92 5角の星
msoShape8pointStar 93 8角の星
msoShapeActionButtonBackorPrevious 129 [戻る]または[前へ]ボタン
msoShapeActionButtonBeginning 131 [上旬]ボタン
msoShapeActionButtonCustom 125 既定の画像またはテキストのないボタン
msoShapeActionButtonDocument 134 [文書]ボタン
msoShapeActionButtonEnd 132 [終了]ボタン
msoShapeActionButtonForwardorNext 130 [進む]または[次へ]ボタン
msoShapeActionButtonHelp 127 [ヘルプ]ボタン
msoShapeActionButtonHome 126 [ホーム]ボタン
msoShapeActionButtonInformation 128 [情報]ボタン
msoShapeActionButtonMovie 136 [ビデオ]ボタン
msoShapeActionButtonReturn 133 [戻る]ボタン
msoShapeActionButtonSound 135 [サウンド]ボタン
msoShapeArc 25 円弧
msoShapeBalloon 137 吹き出し
msoShapeBentArrow 41 90度の曲線に続くブロック矢印
msoShapeBentUpArrow 44 90度の鋭角線に続くブロック矢印
msoShapeBevel 15 斜角
msoShapeBlockArc 20 アーチ
msoShapeCan 13 円柱
msoShapeChevron 52 山形
msoShapeCircularArrow 60 180度の曲線に続くブロック矢印
msoShapeCloudCallout 108 雲形吹き出し
msoShapeCross 11 十字形
msoShapeCube 14 直方体
msoShapeCurvedDownArrow 48 下カーブブロック矢印
msoShapeCurvedDownRibbon 100 下カーブリボン
msoShapeCurvedLeftArrow 46 左カーブブロック矢印
msoShapeCurvedRightArrow 45 右カーブブロック矢印
msoShapeCurvedUpArrow 47 上カーブブロック矢印
msoShapeCurvedUpRibbon 99 上カーブリボン
msoShapeDiamond 4 ひし形
msoShapeDonut 18 ドーナツ
msoShapeDoubleBrace 27 中かっこ
msoShapeDoubleBracket 26 大かっこ
msoShapeDoubleWave 104 小波
msoShapeDownArrow 36 下向きブロック矢印
msoShapeDownArrowCallout 56 下矢印の付いた吹き出し
msoShapeDownRibbon 98 リボンの端よりも下に中央面があるリボン
msoShapeExplosion1 89 爆発
msoShapeExplosion2 90 爆発
msoShapeFlowchartAlternateProcess 62 代替処理フローチャート記号
msoShapeFlowchartCard 75 カードフローチャート記号
msoShapeFlowchartCollate 79 照合フローチャート記号
msoShapeFlowchartConnector 73 結合子フローチャート記号
msoShapeFlowchartData 64 データフローチャート記号
msoShapeFlowchartDecision 63 判断フローチャート記号
msoShapeFlowchartDelay 84 論理積ゲートフローチャート記号
msoShapeFlowchartDirectAccessStorage 87 直接アクセス記憶フローチャート記号
msoShapeFlowchartDisplay 88 表示フローチャート記号
msoShapeFlowchartDocument 67 書類フローチャート記号
msoShapeFlowchartExtract 81 抜き出しフローチャート記号
msoShapeFlowchartInternalStorage 66 内部記憶フローチャート記号
msoShapeFlowchartMagneticDisk 86 磁気ディスクフローチャート記号
msoShapeFlowchartManualInput 71 手操作入力フローチャート記号
msoShapeFlowchartManualOperation 72 手作業フローチャート記号
msoShapeFlowchartMerge 82 組み合わせフローチャート記号
msoShapeFlowchartMultidocument 68 複数書類フローチャート記号
msoShapeFlowchartOffpageConnector 74 他ページ結合子フローチャート記号
msoShapeFlowchartOr 78 論理和フローチャート記号
msoShapeFlowchartPredefinedProcess 65 定義済み処理フローチャート記号
msoShapeFlowchartPreparation 70 準備フローチャート記号
msoShapeFlowchartProcess 61 処理フローチャート記号
msoShapeFlowchartPunchedTape 76 せん孔テープフローチャート記号
msoShapeFlowchartSequentialAccessStorage 85 順次アクセス記憶フローチャート記号
msoShapeFlowchartSort 80 分類フローチャート記号
msoShapeFlowchartStoredData 83 記憶データフローチャート記号
msoShapeFlowchartSummingJunction 77 和接合フローチャート記号
msoShapeFlowchartTerminator 69 端子フローチャート記号
msoShapeFoldedCorner 16 メモ
msoShapeHeart 21 ハート
msoShapeHexagon 10 六角形
msoShapeHorizontalScroll 102 横巻き
msoShapeIsoscelesTriangle 7 二等辺三角形
msoShapeLeftArrow 34 左向きブロック矢印
msoShapeLeftArrowCallout 54 左矢印の付いた吹き出し
msoShapeLeftBrace 31 左中かっこ
msoShapeLeftBracket 29 左大かっこ
msoShapeLeftRightArrow 37 左右ブロック矢印
msoShapeLeftRightArrowCallout 57 左右矢印の付いた吹き出し
msoShapeLeftRightUpArrow 40 左、右、および上の3方向ブロック矢印
msoShapeLeftUpArrow 43 左および上矢印の2方向ブロック矢印
msoShapeLightningBolt 22 稲妻
msoShapeLineCallout1 109 枠付きで、水平の吹き出し線の付いた吹き出し
msoShapeLineCallout1AccentBar 113 水平の強調線の付いた吹き出し
msoShapeLineCallout1BorderandAccentBar 121 枠付きで、水平の強調線の付いた吹き出し
msoShapeLineCallout1NoBorder 117 水平線の付いた吹き出し
msoShapeLineCallout2 110 斜めの直線の付いた吹き出し
msoShapeLineCallout2AccentBar 114 斜めの吹き出し線と強調線の付いた吹き出し
msoShapeLineCallout2BorderandAccentBar 122 枠、斜めの直線、および強調線の付いた吹き出し
msoShapeLineCallout2NoBorder 118 枠および斜めの吹き出し線のない吹き出し
msoShapeLineCallout3 111 折れ線の付いた吹き出し
msoShapeLineCallout3AccentBar 115 折れた吹き出し線と強調線の付いた吹き出し
msoShapeLineCallout3BorderandAccentBar 123 枠、折れた吹き出し線、強調線の付いた吹き出し
msoShapeLineCallout3NoBorder 119 枠および折れた吹き出し線のない吹き出し
msoShapeLineCallout4 112 U 字型の吹き出し線分の付いた吹き出し
msoShapeLineCallout4AccentBar 116 強調線およびU字型の吹き出し線分の付いた吹き出し
msoShapeLineCallout4BorderandAccentBar 124 枠線、強調線、およびU字型の吹き出し線分の付いた吹き出し
msoShapeLineCallout4NoBorder 120 枠線およびU字型の吹き出し線分のない呼び出し
msoShapeMixed -2 値のみを返す
msoShapeMoon 24
msoShapeNoSymbol 19 禁止
msoShapeNotchedRightArrow 50 右向きのV字型矢印
msoShapeNotPrimitive 138 サポートされていない
msoShapeOctagon 6 八角形
msoShapeOval 9 楕円
msoShapeOvalCallout 107 円形吹き出し
msoShapeParallelogram 2 平行四辺形
msoShapePentagon 51 ホームベース
msoShapePlaque 28 ブローチ
msoShapeQuadArrow 39 4方向ブロック矢印
msoShapeQuadArrowCallout 59 4方向矢印の付いた吹き出し
msoShapeRectangle 1 四角形
msoShapeRectangularCallout 105 四角形吹き出し
msoShapeRegularPentagon 12 ホームベース
msoShapeRightArrow 33 右向きブロック矢印
msoShapeRightArrowCallout 53 右矢印の付いた吹き出し
msoShapeRightBrace 32 右中かっこ
msoShapeRightBracket 30 右大かっこ
msoShapeRightTriangle 8 直角三角形
msoShapeRoundedRectangle 5 角丸四角形
msoShapeRoundedRectangularCallout 106 角丸四角形吹き出し
msoShapeSmileyFace 17 スマイル
msoShapeStripedRightArrow 49 先にストライプの付いた右向きのブロック矢印
msoShapeSun 23 太陽
msoShapeTrapezoid 3 台形
msoShapeUpArrow 35 上向きブロック矢印
msoShapeUpArrowCallout 55 上矢印の付いた吹き出し
msoShapeUpDownArrow 38 上下2方向ブロック矢印
msoShapeUpDownArrowCallout 58 上下のブロック矢印の付いた吹き出し
msoShapeUpRibbon 97 リボンの端よりも上に中央面があるリボン
msoShapeUTurnArrow 42 U字型のブロック矢印
msoShapeVerticalScroll 101 縦巻き
msoShapeWave 103 大波
参考:MsoAutoShapeType 列挙(Office)- MSDN

 サンプルマクロを実行するに当たり、図1のようになっているとしよう。


図1 「コンボボックス」を配置し、「コントロールの書式設定」を完了した

 Excelメニューの[開発]→[挿入]と選択して「コンボボックス」を配置する。

 次に表1の「名前」のみを、「O1:O139」に入力する。表1の「名前」の最初の値(ここでは「msoShape16pointStar」)にカーソルを合わせて、[Ctl]キーを押しながら下方向にマウスをドラッグすると一気に選択できるので、それをコピー&ペーストすれば簡単だ。

 配置した「コンボボックス」を選択して、マウスの右クリックで表示されるメニューから、[コントロールの書式設定]を選択する。表示される画面から[入力範囲]に「オートシェイプ」の「名前」を入力した「O1:O139」までを指定する。

 次に[リンクするセル]に、「N1」を指定しておく。ここには、「コンボボックス」から選択されたインデックス番号が表示される。また「P1:P139」には、表1には掲載されている「値」を入力しておく。これも先ほどのやり方で簡単にコピー&ペーストできる。

 サンプルマクロはリスト1のようになる。VBE(Visual Basic Editor)のメニューから、[挿入]→[標準モジュール]と選択する。プロジェクトにModule1が追加されるので、Module1をダブルクリックして、表示されるエディター画面内にリスト1のマクロを記述する。

Option Explicit
Sub オートシェイプの種類を表示()
  Dim 種類 As Integer
  Call オートシェイプの削除
  種類 = Cells(Range("N1").Value, 16)
  With Range("B2:G20")
    ActiveSheet.Shapes.AddShape 種類, .Left, .Top, .Width, .Height
  End With
End Sub
リスト1 オートシェイプを表示するマクロ

 まず3行目でInteger型の変数「種類」を宣言する。

 次に4行目でオートシェイプを削除する「オートシェイプの削除」プロシージャを呼び込む(リスト2)。このプロシージャは、次の「オートシェイプに画像を挿入する」でも使用するため、独立したプロシージャとして作成している。

 5行目では、「Cells({行番号},{列番号})」の書式にのっとって、セル「N1」に表示されたインデックス番号を{行番号}とし、「P列」の{列番号}「16」を指定して得た「値」を、変数「種類」に格納する。

 7行目では「B2:G20」の範囲に、指定した変数「種類」が格納するオートシェイプの種類を、「B2:G20」のLeft、Top、Width、Heightに表示する。

 次は、「オートシェイプの削除」プロシージャの解説だ

Sub オートシェイプの削除()
  Dim 範囲 As Range
  Dim myShape As Variant
  Set 範囲 = Range("B2:G20")
  For Each myShape In ActiveSheet.Shapes
    If Not Intersect(Range(myShape.TopLeftCell, myShape.BottomRightCell), 範囲) Is Nothing Then
      myShape.Delete
    End If
  Next
End Sub
リスト2 オートシェイプを削除するマクロ

 まず、2行目でRange型の変数「範囲」を、3行目でVariant型の変数「myShape」を宣言する。

 4行目で変数「範囲」に、オートシェイプを表示する「B2:G20」までの範囲を格納する。

 5〜10行目でアクティブシート上の全てのShapeオブジェクトに対して、変数「myShape」を使って繰り返し処理を行う。

 6行目では、Intersectメソッドを使って、オートシェイプが、あるセルの範囲内にあるかどうかを判定する。書式は下記のようになる。

セル範囲が重なる範囲を取得するIntersectメソッドの書式

Intersect({Arg1},{Arg2},……)


 {Arg1}と{Arg2}は必須で範囲を表す。交わる範囲で、少なくとも2つのRangeオブジェクトを指定する必要がある。

 ここでは、「Intersect(Range(myShape.TopLeftCell, myShape.BottomRightCell), 範囲)」と記述して、図形の配置されているセル範囲と、選択されているセル範囲(変数「範囲」)が重なっているかどうかを判断する。

 選択されているセル範囲が重なっている場合は、7行目でそのオートシェイプを削除する。「オートシェイプの種類」を選択するたびに、先に表示されているオートシェイプを削除してから、次のオートシェイプを表示する。そうしなければ、先に選択したオートシェイプと、次に選択していったオートシェイプが、次々と重複して表示される。

 「コンボボックス」を選択して、マウスの右クリックで表示されるメニューから「マクロの登録」を選択し、リスト1のマクロを関連付ける。

 実行すると、図2のように「コンボボックス」から選択されたオートシェイプが、「B2:G20」の範囲に表示される。


図2 「コンボボックス」から選択したオートシェイプが表示された

 「コンボボックス」からオートシェイプを選択するたびに、該当するオートシェイプが表示される。

FillFormat.UserPictureメソッドでオートシェイプに画像を挿入する

 「オートシェイプに画像を挿入する」という新しいシートを追加し、図1のデータを、位置を変えずに、そっくりそのままコピーして持ってくる。画面は、「オートシェイプの種類を設定して表示する」をそのまま利用している。

UserPictureメソッドの書式

{オブジェクト}.UserPicture {パス付き画像ファイル}


 {オブジェクト}には、FillFormatオブジェクトを指定する。FillFormatオブジェクトは、図形の塗りつぶしの書式設定を表すオブジェクトだ。

 UserPictureメソッドには、画像ファイルをパス付きで指定する。今回は「C:\VBAIImage」というフォルダーを作成して、その中に表示したい画像を配置しておく。この「C:\VBAImage」というフォルダーと、その中に画像が存在しない場合はエラーになるので、注意してほしい。

 先ほど追加したModule1内に、「オートシェイプに画像を挿入する」リスト3のマクロを記述する。

Sub オートシェイプに画像を挿入する()
  Dim 種類 As Integer
  Call オートシェイプの削除
  種類 = Cells(Range("N1").Value, 16)
  With Range("B2:G20")
    ActiveSheet.Shapes.AddShape 種類, .Left, .Top, .Width, .Height
  End With
 
  With ActiveSheet.Shapes(2).Fill
   .UserPicture "C:\VBAImage\般若.png"
  End With
End Sub
リスト3 「オートシェイプに画像を挿入する」マクロ

 前半の2〜6行目はリスト1と全く同じなので、解説はそちらを参照してほしい。ここでは、8〜10行目の画像を指定するところのみ解説する。

 9行目では、アクティブシート上のインデックスが「2番目」の図形、つまりオートシェイプにUserPictureメソッドで、C:\VBAImage\般若.pngを指定する。今回8行目で、アクティブシート上のShapeオブジェクトに「2」を指定しているのは、「コンボボックス」がShapeオブジェクトの「1」に該当するからだ。

「オートシェイプに画像を挿入する」シート内の、「コンボボックス」にリスト3のマクロを関連付ける。

 実行すると、図3のように選択したオートシェイプが「般若」の画像で塗りつぶされる。


図3 「コンボボックス」から選択したオートシェイプが、「般若」の画像で塗りつぶされた

まとめ

 今回は「オートシェイプの種類を設定して表示する」方法と、「オートシェイプに画像を挿入する」方法を紹介した。

 今回のTipsはどちらも、直接実務には役に立たないTipsのように思われるかもしれない。しかし、今後VBAをマスターして、いろいろなマクロを業務に取り入れていく際には、今回紹介したようなTipsの必要性が出てくるかもしれない。何でも、知らないよりは知っておいた方が、今後のために役に立つと思う。

著者プロフィール

薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所

薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。

1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。

1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。

2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。

Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。

Microsoft MVP for Development Platforms - Client App Dev(Oct 2003-Sep 2012)。

Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。

Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。


Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る