PR

Excel VBAで全描画オブジェクトをシートに書き出して確認する-その2

Excel VBA Tips
この記事は約29分で読めます。

「Excel VBA Tips」ではExcel VBAを使用していて気付いたことを取り上げて行きます。

前回「すべての描画オブジェクトをExcel VBAでActiveSheetに書き出し、その書き出された描画オブジェクトの種類を確認するコーディング事例-その1」として「グラフ以外」をご紹介しましたが、今回はその2として「グラフ」をご紹介いたします。

グラフ以外ではTypeName関数の他にShapeオブジェクトのTypeプロパティとAutoShapeTypeプロパティを共通出力項目にしていましたが、グラフの場合は単独選択ではこれらのプロパティを取得できず複数グラフを選択した状態にしないといけません。

そのために少し面倒くさいコーディングをしています。(ただし、このような努力をしても両者のプロパティから得られる結果は全グラフですべて同じになるので、本当はやらなくても良いのですが…)
これは「グラフ以外」と出力項目を合わせるためにわざとやっていますのでお含み置きいただければ幸いです。

なお「VBA ShapesオブジェクトとItemメソッド・Rangeプロパティ」や「Excel VBAのSelectionプロパティを描画オブジェクトで使うためには」でご説明した内容を引用する箇所がありますので、合わせてご確認いただければ幸いです。

※動作は32bit版Excel 2016と64bit版Excel 2021の バージョン2210(ビルド 15726.20202)を使用して検証しています。

スポンサーリンク

グラフの種類

XlChartType 列挙 (Excel)を見ると74種類の値が設定されている事がわかります。
※上記のリンク先はMicrosoft Officeドキュメントの該当ページになります。

「集合縦棒:xlColumnClustered(=51)」から「3-D ピラミッド型縦棒:xlPyramidCol(=112)」までの62種類は値が連続しているのですが、残りの12種類は飛び飛びです。

12種類を値で昇順に並べると下記のようになります。

No名前説明No名前説明
1xlXYScatter-4169散布図7xl3DArea-40983-D 面
2xlRadar-4151レーダー8xlArea1分野
3xlDoughnut-4120ドーナツ9xlLine4折れ線
4xl3DPie-41023-D 円10xlPie5
5xl3DLine-41013-D 折れ線11xlBubble15バブル
6xl3DColumn-41003-D 縦棒12xlRegionMap140マップ グラフ
※名前はコーディング事例で使用しています。

コーディングする際、連番の箇所はShapesオブジェクトのAddChart2メソッドで「グラフの種類」に値をセットする時にFor文を使って回せば良いのですが、飛び飛びのところは一度配列に値をセットしてから回すようにしています。

グラフにセットするデータ値

グラフを描画する際は、あらかじめセットするソースデータの値の範囲を選択しておくか、ChartオブジェクトのSetSourceDataメソッドでソースデータの値の範囲を設定します。

この時に注意しなければならないグラフの種類があります。

  1. 空白セルに対して範囲だけ指定して描画できるものと、実際にデータが無いと描画できないものとがある。
    • 言い変えると、ソースデータがグラフで処理できるような内容になってないとエラーになるものになります。
  2. ソースデータの範囲が描画するグラフの位置から離れていても良いものと、ソースデータがグラフの左上の位置から決められた範囲内に無いと描画できないものがある。
    • 「決められた範囲内」はソースデータの項目数やボリュームによっても変わってくるので、一概には言えませんが「こう言うパターンになる」という傾向については紹介したいと思います。

ただし上記の2つはほぼほぼ同じ種類のグラフになりますので複雑にはなっていません。これらを順を追ってご説明いたします。

1.実際にデータが無いと描画できないグラフの種類

下記のグラフの種類は実際に意味のあるソースデータが指定されていないと「Err.Number 1004-アプリケーション定義またはオブジェクト定義のエラーです。」のエラーになります。

No名前説明
1xlSurface833-D 表面
2xlSurfaceWireframe843-D 表面 (ワイヤーフレーム)
3xlSurfaceTopView85表面 (トップ ビュー)
4xlSurfaceTopViewWireframe86表面 (トップ ビュー – ワイヤーフレーム)
5xlStockHLC88高値 – 安値 – 終値
6xlStockOHLC89始値 – 高値 – 安値 – 終値
7xlStockVHLC90出来高 – 高値 – 安値 – 終値
8xlStockVOHLC91出来高 – 始値 – 高値 – 安値 – 終値
※名前はコーディング事例で使用しています。

「なぜエラーになるのか?」の理由はドキュメントに書かれていないので分かりませんが、これらの8種類のグラフは「データ項目が特定の規則性を満たしてないとグラフとして描画する事が難しいためではないか?」と推察されます。

2.ソースデータがグラフの左上の位置から決められた範囲内に無いとエラー

前章の8種類のグラフは意味のあるソースデータが指定されていたとしても、グラフを描画する位置から決められた範囲内にソースデータが存在しないと、前章と同じ「エラー番号 1004-アプリケーション定義またはオブジェクト定義のエラーです。」のエラーになります。

ソースデータの項目数やボリューム、セル形状は要件によってまちまちなので「一概にこうです」とは言い難いのですが、今回確認をした事例に基づきご説明いたします。

No名前説明
10xlRegionMap140マップ グラフ
※名前はコーディング事例で使用しています。

なお本章の始めでご説明したように1.と2.は殆ど一緒のグラフの種類になりますが、唯一の違いとしては左記の「マップ グラフ」に関しては2.のみに該当します。

なぜグラフを配置する左上角のセルからの位置が決められているのか?理由はまったくわかりませんが、実際に試して見るとエラーになるので致し方無いところです。

以上の10種類のグラフは「すべて同じ傾向なのか?」と言うと実は3つに分類されますので一つづつ見て行きます。

値83~86のSurfaceグラフ

検証には6行×6列のデータソースを使用しています。

この場合、xlSurfaceからxlSurfaceTopViewWireframeまでの4種類のグラフに関しては下図赤外枠線の付いているG7セルにグラフを配置した時に、背景色の付いているエリアにソースデータが配置されていれば正しく描画できます。

  1. もっとも左上はソースデータエリアの右下が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の左上角に対して点で接している。
  2. もっとも右上はソースデータエリアの左下が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の右上角に対して点で接している。
  3. もっとも左下はソースデータエリアの右上が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の左下角に対して点で接している。
  1. もっとも右下は2箇所となり、ソースデータエリアの左上が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の(背景黄色の配置)、又は(背景の配置)に接している。
    • 右下角に対して点で接した状態ではエラーになる。

値88~91のStockグラフ

xlStockHLCからxlStockVOHLCまでの4種類のグラフはデータ項目数(列)がそれぞれ決まっているので、今回検証にはxlStockHLCは6行×4列、xlStockOHLCとxlStockVHLCは6行×5列、xlStockVOHLCは6行×6列のデータソースを使用しています。

xlStockVOHLCに関しては下図赤外枠線の付いているG7セルにグラフを配置した時に、背景色の付いているエリアにソースデータが配置されていれば正しく描画できます。

  1. もっとも左上はソースデータエリアの右下が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の左上角に対して点で接している。
  2. もっとも右上はソースデータエリアの左下が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の右上角に対して点で接している。
  3. もっとも左下はソースデータエリアの右上が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の左下角に対して点で接している。
  1. 「背景色黄色」が示すように、もっとも右下はソースデータエリアの右上が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の右下角に対して点で接している。

値140のRegionMapグラフ

検証には6行×2列のデータソースを使用しています。データ内容としては1列目は国名、2列目は人口(千単位)になります。

この場合、下図赤外枠線の付いているB6セルにxlRegionMapグラフを配置した時に、背景色の付いているエリア内にソースデータが配置されていれば正しく描画できます。

  1. もっとも左上はソースデータエリアの右下のセルが「グラフを配置するセル範囲の左上のセル(赤外枠線)」と重なっている。
  2. もっとも右上はソースデータエリアの左下が「グラフを配置するセル範囲の左上のセル(赤外枠線)」のに接している。
  3. もっとも左下はソースデータエリアの右上が「グラフを配置するセル範囲の左上のセル(赤外枠線)」のに接している。
  1. 「背景色黄色」が示しているように、もっとも右下はソースデータエリアの右上が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の右下角に対して点で接している。
xlRegionMapグラフでソースデータを設定する際の注意点

グラフを描画する際は、あらかじめセットするソースデータの範囲を選択しておくか、ChartオブジェクトのSetSourceDataメソッドでソースデータの範囲を設定しますが、xlRegionMapグラフ(マップ グラフ)に関してはSetSourceDataメソッドでソースデータの範囲を設定しようとすると「エラー番号 445-オブジェクトはこの動作をサポートしていません。」のエラーになります。

ただしグラフは描画されているのでOn Error文でエラーを無視する事もできますが、同じソースデータのセル範囲を選択しておくとエラーにはならないので、こちらを使用した方が無難です。

描画したオブジェクトに対して調べる項目

一部を除いて前回と同じ内容になりますので、今回はAddChart2メソッド特有の処理の仕方についてご説明いたします。

何が特有か?と言うと、冒頭でも記載しましたがグラフの場合は単独選択ではShapeオブジェクトのプロパティを取得できず、取得するためには複数グラフを選択しなくてはなりません。

そのためにグラフをひとつ適当に「グラフ Fix」という名前で描画しておいて、個々の種類のグラフと「グラフ Fix」との両方をShapes.Rangeプロパティで配列を使って選択状態にした上でSelection.Shaperange(Index)で個々の種類のグラフに対して調べる項目を確認します。

なおこれも冒頭で記載しましたが、このような無理をしてSelection.Shaperange(Index)のTypeプロパティやAutoShapeTypeプロパティを調べてもすべてのグラフで結果は同じになります。

プロパティ説明プロパティ説明
TypemsoChart(3)グラフAutoShapeTypemsoShapeMixed(-2)その他の状態の組み合わせ

結果が分かってしまうと「やらなくても良いのでは?」と思うのですが、「すべての描画オブジェクト」と明記してスタートしているのでやらざるを得ないところです。

コーディング事例

すべてのグラフの描画オブジェクトを作成するためのコーディング事例をご紹介いたします。

プログラムの構造は今回はメインサブルーチンから、データを書出しするサブルーチンと、描画メソッドを呼び出すファンクションと、そのファンクションから呼ばれる共通出力のための子サブルーチンの計4個になります。

ワークシート上への出力方法とその仕様

前回とほとんど同じですので、今回は違うところをご説明いたします。

ワークシートに出力するデータ項目の並びは前回と合わせています。

12345678910
No種類NameTypeTypeNameAutoShapeType判定プロパティ比較数式 描画図形
  1. Name
    • ActiveChart.Nameの戻り値にはシート名が付与されているのですが、Shapes.Rangeプロパティで配列で選択する際にはシート名があると選択できません。
      そのためにActiveSheet.Nameにスペースを加えた文字列をActiveChart.Nameの戻り値から除去しています。
      更にSelection.ShapeRange(2)のNameプロパティの戻り値を”/”の後に続けて出力しています。
    • なお配列で「グラフ Fix」は先にしているので、添え字は2になります。(以下同じ)
  2. Type 及び 6.AutoShapeType
    • Selection.ShapeRange(2)のType及びAutoShapeTypeプロパティをそれぞれにセット
  3. TypeName
    • 単独選択の時の戻り値と複数選択の時の戻り値を”/”の後に続けて出力しています。
  1. 判定プロパティ
    • ActiveChartのchartTypeプロパティをセット

実際のコーディング事例

データを書出しするサブルーチンは少し長くなるのですが実行する時に必要になるのでコーディング事例の中に含めていますのでお含み置きください。

なおRegionMapグラフのデータに関しては下記ELEMINISTの2022年最新世界人口ランキングよりトップ20のデータをグラフで取り込めるように加工して使用しています。
※人口は千単位に、国名はなるべく短くしながらも認識されるように一部変更しています。

メイン処理

  • グラフデータ書出しサブルーチンをコールする。
  • ヘッダー行と各メソッドのタイトル行のセットと行送りの値のセット
  • 各メソッドごとの判定プロパティのセット
  • 画面更新の制御と列幅自動調整

※コーディング行が横幅に入り切れていないのでマウスのドラックかキーボードの矢印ボタンでスクロールしてください。

Sub setSheet()
Dim lid As Long, lrow As Long, cnt As Long, iSkip As Integer
Dim v_chartType As Variant, i As Integer
    Application.ScreenUpdating = False  '画面固定
    Call setGraphData
'グラフ Fix作図
    ActiveSheet.Cells(1, 11).Select  'セルを選択する
    With ActiveSheet.Shapes.AddChart2(-1, xlColumnStacked, ActiveCell.Left, ActiveCell.Top, 200, 90, True)
        .Name = "グラフ Fix"
        .Select  'Activeにするため
    End With
    With ActiveChart
        .SetSourceData Source:=ActiveSheet.Range("A1:H2")   'データソースを設定
        .HasTitle = True
        .ChartTitle.Text = "グラフ Fix"
    End With
'ヘッダー行
    Cells(4, 1).Value = "No": Cells(4, 2).Value = "種類": Cells(4, 3).Value = "Name": Cells(4, 4).Value = "Type"
    Cells(4, 5).Value = "TypeName": Cells(4, 6).Value = "AutoSha" & vbCrLf & "peType": Cells(4, 7).Value = "判定プロパティ"
    Cells(4, 8).Value = "比較数式": Cells(4, 9).Value = " ": Cells(4, 10).Value = "描画図形": Range("A4:J4").Font.Bold = True
'初期値セット
    lrow = 6  '1~2行はデータ行、4行はヘッダーなので6行目から
    cnt = 0  '連番カウンター
'AddChart2
    Cells(lrow, 3).Value = "AddChart2": Cells(lrow, 3).Font.Bold = True: lrow = lrow + 1  '項目見出し
    v_chartType = Array(xlXYScatter, xlRadar, xlDoughnut, xl3DPie, xl3DLine, xl3DColumn, xl3DArea, xlArea, xlLine, xlPie, xlBubble)
    For lid = 0 To UBound(v_chartType)
        If drawChart(cnt, lrow, v_chartType(lid)) Then iSkip = 6 Else iSkip = 1
        lrow = lrow + iSkip
    Next
    For lid = xlColumnClustered To xlPyramidCol
        If drawChart(cnt, lrow, lid) Then iSkip = 6 Else iSkip = 1
        lrow = lrow + iSkip
    Next
    If drawChart(cnt, lrow, xlRegionMap) Then iSkip = 20 Else iSkip = 1
    lrow = lrow + iSkip
'後処理
    Application.ScreenUpdating = True  '固定解除
    Cells.Select: Cells.EntireColumn.AutoFit '列幅自動調整
    ActiveSheet.Cells(1, 1).Select  'A1セルを選択する
End Sub

グラフデータ書出し

  • それぞれのデータをActiveSheet上のセル範囲にセットして背景色を付けています。
Sub setGraphData()
'共通グラフデータ
    Cells(1, 1).Value = 1: Cells(1, 2).Value = 3: Cells(1, 3).Value = 7: Cells(1, 4).Value = 8
    Cells(1, 5).Value = 9: Cells(1, 6).Value = 2: Cells(1, 7).Value = 7: Cells(1, 8).Value = 3
    Cells(2, 1).Value = 6: Cells(2, 2).Value = 9: Cells(2, 3).Value = 2: Cells(2, 4).Value = 8
    Cells(2, 5).Value = 3: Cells(2, 6).Value = 7: Cells(2, 7).Value = 5: Cells(2, 8).Value = 6
    Range("A1:H2").Interior.Color = RGB(127, 191, 255)  '背景色
'Surfaceグラフデータ
    Cells(1, 16).Value = "": Cells(1, 17).Value = -10: Cells(1, 18).Value = -5: Cells(1, 19).Value = 0: Cells(1, 20).Value = 5: Cells(1, 21).Value = 10
    Cells(2, 16).Value = -10: Cells(2, 17).Value = 4: Cells(2, 18).Value = 5: Cells(2, 19).Value = 6: Cells(2, 20).Value = 7: Cells(2, 21).Value = 8
    Cells(3, 16).Value = -5: Cells(3, 17).Value = 3: Cells(3, 18).Value = 4: Cells(3, 19).Value = 2: Cells(3, 20).Value = 5: Cells(3, 21).Value = 6
    Cells(4, 16).Value = 0: Cells(4, 17).Value = 7: Cells(4, 18).Value = 8: Cells(4, 19).Value = 1: Cells(4, 20).Value = 2: Cells(4, 21).Value = 3
    Cells(5, 16).Value = 5: Cells(5, 17).Value = 4: Cells(5, 18).Value = 5: Cells(5, 19).Value = 9: Cells(5, 20).Value = 7: Cells(5, 21).Value = 2
    Cells(6, 16).Value = 10: Cells(6, 17).Value = 1: Cells(6, 18).Value = 4: Cells(6, 19).Value = 7: Cells(6, 20).Value = 8: Cells(6, 21).Value = 3
    Range("P1:U6").Interior.Color = RGB(127, 255, 191)  '背景色
'Stockグラフ
    Cells(7, 16).Value = "日付": Cells(7, 17).Value = "出来高": Cells(7, 18).Value = "始値": Cells(7, 19).Value = "高値": Cells(7, 20).Value = "安値": Cells(7, 21).Value = "終値"
    Cells(8, 16).Value = CDate("2022/11/14"): Cells(8, 17).Value = 110000: Cells(8, 18).Value = 103: Cells(8, 19).Value = 120: Cells(8, 20).Value = 100: Cells(8, 21).Value = 108
    Cells(9, 16).Value = CDate("2022/11/15"): Cells(9, 17).Value = 85450: Cells(9, 18).Value = 110: Cells(9, 19).Value = 125: Cells(9, 20).Value = 105: Cells(9, 21).Value = 110
    Cells(10, 16).Value = CDate("2022/11/16"): Cells(10, 17).Value = 60120: Cells(10, 18).Value = 108: Cells(10, 19).Value = 118: Cells(10, 20).Value = 99: Cells(10, 21).Value = 107
    Cells(11, 16).Value = CDate("2022/11/17"): Cells(11, 17).Value = 50500: Cells(11, 18).Value = 105: Cells(11, 19).Value = 115: Cells(11, 20).Value = 95: Cells(11, 21).Value = 100
    Cells(12, 16).Value = CDate("2022/11/18"): Cells(12, 17).Value = 120450: Cells(12, 18).Value = 98: Cells(12, 19).Value = 125: Cells(12, 20).Value = 92: Cells(12, 21).Value = 120
    Range("P7:U12").Interior.Color = RGB(191, 255, 127)  '背景色
'RegionMapグラフ
    Cells(13, 16).Value = "中華人民共和国": Cells(13, 17).Value = 1448500
    Cells(14, 16).Value = "インド": Cells(14, 17).Value = 1406600
    Cells(15, 16).Value = "アメリカ合衆国": Cells(15, 17).Value = 334800
    Cells(16, 16).Value = "インドネシア": Cells(16, 17).Value = 279100
    Cells(17, 16).Value = "パキスタン": Cells(17, 17).Value = 229500
    Cells(19, 16).Value = "ナイジェリア": Cells(19, 17).Value = 216700
    Cells(18, 16).Value = "ブラジル": Cells(18, 17).Value = 215400
    Cells(20, 16).Value = "バングラデシュ": Cells(20, 17).Value = 167900
    Cells(21, 16).Value = "ロシア": Cells(21, 17).Value = 145800
    Cells(22, 16).Value = "メキシコ": Cells(22, 17).Value = 131600
    Cells(23, 16).Value = "日本": Cells(23, 17).Value = 125600
    Cells(24, 16).Value = "エチオピア": Cells(24, 17).Value = 120800
    Cells(25, 16).Value = "フィリピン": Cells(25, 17).Value = 112500
    Cells(26, 16).Value = "エジプト": Cells(26, 17).Value = 106000
    Cells(27, 16).Value = "ベトナム": Cells(27, 17).Value = 99000
    Cells(28, 16).Value = "コンゴ": Cells(28, 17).Value = 95200
    Cells(29, 16).Value = "イラン": Cells(29, 17).Value = 86000
    Cells(30, 16).Value = "トルコ": Cells(30, 17).Value = 85600
    Cells(31, 16).Value = "ドイツ": Cells(31, 17).Value = 83900
    Cells(32, 16).Value = "タイ": Cells(32, 17).Value = 70100
    Range("P13:Q32").Interior.Color = RGB(255, 255, 127)  '背景色
End Sub

描画処理

  • ソースデータがグラフの左上の位置から決められた範囲内に無いとエラーになる種類のグラフは、ActiveSheetにセットされているデータをセル範囲でコピーして、グラフを描画するセル位置に貼り付けて、マップグラフは先にデータ範囲を選択する。
  • AddChart2メソッドを指定したセルで実行
  • 比較数式をセット(背景色を付ける)
  • データソースを設定して判定プロパティを出力する。
  • Shapes.Rangeの配列で「グラフ Fix」と描画したグラフを選択し、共通出力処理をコールする。
  • On Errorステートメントの処理
Function drawChart(ByRef cnt As Long, lrow As Long, vType As Variant) As Boolean
On Error GoTo Err_Handle
Dim sp As Shape, st_targetNme As String
    drawChart = True
'データを描画エリアにコピー
    If (CLng(vType) >= xlSurface And CLng(vType) <= xlSurfaceTopViewWireframe) Then
        ActiveSheet.Range("P1:U6").Copy Destination:=ActiveSheet.Range(Cells(lrow, 10).Address)
    ElseIf CLng(vType) = xlStockHLC Then
        ActiveSheet.Range("P7:P12").Copy Destination:=ActiveSheet.Range(Cells(lrow, 10).Address)
        ActiveSheet.Range("S7:U12").Copy Destination:=ActiveSheet.Range(Cells(lrow, 11).Address)
    ElseIf CLng(vType) = xlStockOHLC Then
        ActiveSheet.Range("P7:P12").Copy Destination:=ActiveSheet.Range(Cells(lrow, 10).Address)
        ActiveSheet.Range("R7:U12").Copy Destination:=ActiveSheet.Range(Cells(lrow, 11).Address)
    ElseIf CLng(vType) = xlStockVHLC Then
        ActiveSheet.Range("P7:Q12").Copy Destination:=ActiveSheet.Range(Cells(lrow, 10).Address)
        ActiveSheet.Range("S7:U12").Copy Destination:=ActiveSheet.Range(Cells(lrow, 12).Address)
    ElseIf CLng(vType) = xlStockVOHLC Then
        ActiveSheet.Range("P7:U12").Copy Destination:=ActiveSheet.Range(Cells(lrow, 10).Address)
    ElseIf CLng(vType) = xlRegionMap Then
        ActiveSheet.Range("P13:Q32").Copy Destination:=ActiveSheet.Range(Cells(lrow, 10).Address)
        ActiveSheet.Range(Cells(lrow, 10), Cells(lrow + 19, 11)).Select  'マップグラフは先にデータ範囲を選択
    End If
    ActiveSheet.Cells(lrow, 10).Select  'セルを選択する
    'グラフ描画
    Set sp = ActiveSheet.Shapes.AddChart2(-1, CLng(vType), ActiveCell.Left + 10, ActiveCell.Top, 260, 110, True)
    sp.Select
    Set sp = Nothing
    Cells(lrow, 8).FormulaR1C1 = "=IF(RC[-1]<>RC[-6],""X"","""")"  '比較数式セット
    Cells(lrow, 8).Interior.Color = RGB(234, 234, 234)  '背景色
    With ActiveChart
        If (CLng(vType) >= xlSurface And CLng(vType) <= xlSurfaceTopViewWireframe) Or (CLng(vType) >= xlStockHLC And CLng(vType) <= xlStockVOHLC) Then
            .SetSourceData Source:=ActiveSheet.Range(Cells(lrow, 10), Cells(lrow + 5, 15))  'データソースを設定
        ElseIf CLng(vType) = xlRegionMap Then  '既に設定済み
            'nop マップグラフはSetSourceDataだと描画できない
        Else
            .SetSourceData Source:=ActiveSheet.Range("A1:H2")  'データソースを設定
        End If
        st_targetNme = Replace(.Name, ActiveSheet.Name & " ", "")  'Nameからシート名を除去
        Cells(lrow, 3).Value = st_targetNme
        Cells(lrow, 5).Value = TypeName(Selection)
        Cells(lrow, 7).Value = .chartType  '判定プロパティ
    End With
    ActiveSheet.Shapes.Range(Array("グラフ Fix", st_targetNme)).Select  'グラフを2つ選択(1つはグラフFix)
    Call commonOutPut(cnt, lrow, vType)
    Exit Function '<<<<<<<<
Err_Handle:
    Cells(lrow, 2).Value = vType:    Cells(lrow, 3).Value = Err.Number & "-" & Err.Description
    Cells(lrow, 8).Clear  '数式削除
    drawChart = False: Err.Clear: On Error GoTo 0
End Function

共通出力処理

  • 連番、種類(列挙パラメータ等)、Name、Type、TypeName、AutoShapeTypeの出力
Sub commonOutPut(ByRef cnt As Long, lrow As Long, vType As Variant)
    Cells(lrow, 2).Value = vType  '列挙パラメータ等
    With Selection.ShapeRange(2)
        Cells(lrow, 3).Value = Cells(lrow, 3).Value & "/" & .Name
        Cells(lrow, 4).Value = .Type
        Cells(lrow, 5).Value = Cells(lrow, 5).Value & "/" & TypeName(Selection)
        Cells(lrow, 6).Value = .AutoShapeType
    End With
    cnt = cnt + 1: Cells(lrow, 1).Value = cnt  '連番出力
End Sub

実行結果のまとめ

弊社環境で実行すると一部のグラフが完全に描画されない状態になる場合があります。ただしそのグラフを選択して上か下に完全に隠れるまでスクロールして戻すと再描画されますので問題無い認識です。

  • 確認した74種類のグラフでエラーの発生はありません。
  • 「種類で指定した値」と「判定プロパティが返す戻り値」に不一致はありません。
  • Type・TypeName・AutoShapeTypeの戻り値はすべて同じになります。
    • Type 戻り値 3
    • TypeName 戻り値 ChartArea/DrawingObjects
    • AutoShapeType 戻り値 -2

実行結果のキャプチャー(一部分)

実行結果の一部を画面キャプチャーでご紹介いたします。

最後に

今回は描画図形をVBAを使って「グラフのすべての描画オブジェクトをActiveSheetに書き出して、書き出された描画オブジェクトの種類を確認するためのコーディング事例」をご紹介いたしました。

グラフは単独選択ではSlection.ShapeRange(1)が使えない事は、ソースデータがグラフの左上の位置から決められた範囲内に無いとエラーになるグラフの種類がある事以外は特に例外事項はないので目新しい情報はなかったかもしれません。

これまで2回に渡り「すべての描画オブジェクトをActiveSheetに書き出して、書き出された描画オブジェクトの種類を確認する」ご説明をしてきましたが、「すべての描画オブジェクト」に対してもう一つご紹介したい属性がございます。

それは描画オブジェクトに対してコメクターを接続する際の結合点です。実はこれがなかなかの曲者で「描画オブジェクト全体でどうなっているのか?」を把握して置いた方が後からコーディングを修正する事態を避けられる事と思います。

そこで次回は「すべての描画オブジェクトの結合点について」をご説明したく存じます。

以上最後までご一読いただき誠にありがとうございました。