Excelでオートシェイプを表示、削除、画像を挿入する:VBA/マクロ便利Tips
業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、Shapesオブジェクトの基本操作としてAddShape/Deleteメソッドの使い方や、オートシェイプに画像を挿入するFillFormat.UserPictureメソッドの使い方などを解説。
今回は、「オートシェイプ」に関するTipsだ。「オートシェイプの種類を設定して表示する」方法と「オートシェイプに画像を挿入する」方法について解説していこう。
初めはオートシェイプを扱う基本として、「オートシェイプの種類を設定して表示する」方法について解説する。
オートシェイプの種類を設定して表示する
オートシェイプの種類を設定して表示するにはShapesオブジェクトのAddShapeメソッドを使う。
オートシェイプの種類を設定して表示するShapes.AddShapeメソッドの書式
Shapes.AddShape {Type},{Left},{Top},{Width},{Height}
{Type}には表1の値を指定する。{Left}にはオートシェイプの左端の位置、{Top}には上端の位置、{Width}には幅、{Height}には高さを指定する。
名前 | 値) | 説明 |
---|---|---|
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のようになっているとしよう。
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
まず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行目で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」の範囲に表示される。
「コンボボックス」からオートシェイプを選択するたびに、該当するオートシェイプが表示される。
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
前半の2〜6行目はリスト1と全く同じなので、解説はそちらを参照してほしい。ここでは、8〜10行目の画像を指定するところのみ解説する。
9行目では、アクティブシート上のインデックスが「2番目」の図形、つまりオートシェイプにUserPictureメソッドで、C:\VBAImage\般若.pngを指定する。今回8行目で、アクティブシート上のShapeオブジェクトに「2」を指定しているのは、「コンボボックス」がShapeオブジェクトの「1」に該当するからだ。
「オートシェイプに画像を挿入する」シート内の、「コンボボックス」にリスト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.