「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 | 名前 | 値 | 説明 |
---|---|---|---|---|---|---|---|
1 | xlXYScatter | -4169 | 散布図 | 7 | xl3DArea | -4098 | 3-D 面 |
2 | xlRadar | -4151 | レーダー | 8 | xlArea | 1 | 分野 |
3 | xlDoughnut | -4120 | ドーナツ | 9 | xlLine | 4 | 折れ線 |
4 | xl3DPie | -4102 | 3-D 円 | 10 | xlPie | 5 | 円 |
5 | xl3DLine | -4101 | 3-D 折れ線 | 11 | xlBubble | 15 | バブル |
6 | xl3DColumn | -4100 | 3-D 縦棒 | 12 | xlRegionMap | 140 | マップ グラフ |
コーディングする際、連番の箇所はShapesオブジェクトのAddChart2メソッドで「グラフの種類」に値をセットする時にFor文を使って回せば良いのですが、飛び飛びのところは一度配列に値をセットしてから回すようにしています。
グラフにセットするデータ値
グラフを描画する際は、あらかじめセットするソースデータの値の範囲を選択しておくか、ChartオブジェクトのSetSourceDataメソッドでソースデータの値の範囲を設定します。
この時に注意しなければならないグラフの種類があります。
- 空白セルに対して範囲だけ指定して描画できるものと、実際にデータが無いと描画できないものとがある。
- 言い変えると、ソースデータがグラフで処理できるような内容になってないとエラーになるものになります。
- ソースデータの範囲が描画するグラフの位置から離れていても良いものと、ソースデータがグラフの左上の位置から決められた範囲内に無いと描画できないものがある。
- 「決められた範囲内」はソースデータの項目数やボリュームによっても変わってくるので、一概には言えませんが「こう言うパターンになる」という傾向については紹介したいと思います。
ただし上記の2つはほぼほぼ同じ種類のグラフになりますので複雑にはなっていません。これらを順を追ってご説明いたします。
1.実際にデータが無いと描画できないグラフの種類
下記のグラフの種類は実際に意味のあるソースデータが指定されていないと「Err.Number 1004-アプリケーション定義またはオブジェクト定義のエラーです。」のエラーになります。
No | 名前 | 値 | 説明 |
---|---|---|---|
1 | xlSurface | 83 | 3-D 表面 |
2 | xlSurfaceWireframe | 84 | 3-D 表面 (ワイヤーフレーム) |
3 | xlSurfaceTopView | 85 | 表面 (トップ ビュー) |
4 | xlSurfaceTopViewWireframe | 86 | 表面 (トップ ビュー – ワイヤーフレーム) |
5 | xlStockHLC | 88 | 高値 – 安値 – 終値 |
6 | xlStockOHLC | 89 | 始値 – 高値 – 安値 – 終値 |
7 | xlStockVHLC | 90 | 出来高 – 高値 – 安値 – 終値 |
8 | xlStockVOHLC | 91 | 出来高 – 始値 – 高値 – 安値 – 終値 |
「なぜエラーになるのか?」の理由はドキュメントに書かれていないので分かりませんが、これらの8種類のグラフは「データ項目が特定の規則性を満たしてないとグラフとして描画する事が難しいためではないか?」と推察されます。
2.ソースデータがグラフの左上の位置から決められた範囲内に無いとエラー
前章の8種類のグラフは意味のあるソースデータが指定されていたとしても、グラフを描画する位置から決められた範囲内にソースデータが存在しないと、前章と同じ「エラー番号 1004-アプリケーション定義またはオブジェクト定義のエラーです。」のエラーになります。
ソースデータの項目数やボリューム、セル形状は要件によってまちまちなので「一概にこうです」とは言い難いのですが、今回確認をした事例に基づきご説明いたします。
No | 名前 | 値 | 説明 |
---|---|---|---|
10 | xlRegionMap | 140 | マップ グラフ |
なお本章の始めでご説明したように1.と2.は殆ど一緒のグラフの種類になりますが、唯一の違いとしては左記の「マップ グラフ」に関しては2.のみに該当します。
なぜグラフを配置する左上角のセルからの位置が決められているのか?理由はまったくわかりませんが、実際に試して見るとエラーになるので致し方無いところです。
以上の10種類のグラフは「すべて同じ傾向なのか?」と言うと実は3つに分類されますので一つづつ見て行きます。
値83~86のSurfaceグラフ
検証には6行×6列のデータソースを使用しています。
この場合、xlSurfaceからxlSurfaceTopViewWireframeまでの4種類のグラフに関しては下図赤外枠線の付いているG7セルにグラフを配置した時に、背景色の付いているエリア内にソースデータが配置されていれば正しく描画できます。
- もっとも左上はソースデータエリアの右下が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の左上角に対して点で接している。
- もっとも右上はソースデータエリアの左下が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の右上角に対して点で接している。
- もっとも左下はソースデータエリアの右上が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の左下角に対して点で接している。
- もっとも右下は2箇所となり、ソースデータエリアの左上が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の右(背景黄色の配置)、又は下(背景緑の配置)に接している。
- 右下角に対して点で接した状態ではエラーになる。
値88~91のStockグラフ
xlStockHLCからxlStockVOHLCまでの4種類のグラフはデータ項目数(列)がそれぞれ決まっているので、今回検証にはxlStockHLCは6行×4列、xlStockOHLCとxlStockVHLCは6行×5列、xlStockVOHLCは6行×6列のデータソースを使用しています。
xlStockVOHLCに関しては下図赤外枠線の付いているG7セルにグラフを配置した時に、背景色の付いているエリア内にソースデータが配置されていれば正しく描画できます。
- もっとも左上はソースデータエリアの右下が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の左上角に対して点で接している。
- もっとも右上はソースデータエリアの左下が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の右上角に対して点で接している。
- もっとも左下はソースデータエリアの右上が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の左下角に対して点で接している。
- 「背景色黄色」が示すように、もっとも右下はソースデータエリアの右上が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の右下角に対して点で接している。
値140のRegionMapグラフ
検証には6行×2列のデータソースを使用しています。データ内容としては1列目は国名、2列目は人口(千単位)になります。
この場合、下図赤外枠線の付いているB6セルにxlRegionMapグラフを配置した時に、背景色の付いているエリア内にソースデータが配置されていれば正しく描画できます。
- もっとも左上はソースデータエリアの右下のセルが「グラフを配置するセル範囲の左上のセル(赤外枠線)」と重なっている。
- もっとも右上はソースデータエリアの左下が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の右に接している。
- もっとも左下はソースデータエリアの右上が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の下に接している。
- 「背景色黄色」が示しているように、もっとも右下はソースデータエリアの右上が「グラフを配置するセル範囲の左上のセル(赤外枠線)」の右下角に対して点で接している。
xlRegionMapグラフでソースデータを設定する際の注意点
グラフを描画する際は、あらかじめセットするソースデータの範囲を選択しておくか、ChartオブジェクトのSetSourceDataメソッドでソースデータの範囲を設定しますが、xlRegionMapグラフ(マップ グラフ)に関してはSetSourceDataメソッドでソースデータの範囲を設定しようとすると「エラー番号 445-オブジェクトはこの動作をサポートしていません。」のエラーになります。
ただしグラフは描画されているのでOn Error文でエラーを無視する事もできますが、同じソースデータのセル範囲を選択しておくとエラーにはならないので、こちらを使用した方が無難です。
描画したオブジェクトに対して調べる項目
一部を除いて前回と同じ内容になりますので、今回はAddChart2メソッド特有の処理の仕方についてご説明いたします。
何が特有か?と言うと、冒頭でも記載しましたがグラフの場合は単独選択ではShapeオブジェクトのプロパティを取得できず、取得するためには複数グラフを選択しなくてはなりません。
そのためにグラフをひとつ適当に「グラフ Fix」という名前で描画しておいて、個々の種類のグラフと「グラフ Fix」との両方をShapes.Rangeプロパティで配列を使って選択状態にした上でSelection.Shaperange(Index)で個々の種類のグラフに対して調べる項目を確認します。
なおこれも冒頭で記載しましたが、このような無理をしてSelection.Shaperange(Index)のTypeプロパティやAutoShapeTypeプロパティを調べてもすべてのグラフで結果は同じになります。
プロパティ | 値 | 説明 | プロパティ | 値 | 説明 |
---|---|---|---|---|---|
Type | msoChart(3) | グラフ | AutoShapeType | msoShapeMixed(-2) | その他の状態の組み合わせ |
結果が分かってしまうと「やらなくても良いのでは?」と思うのですが、「すべての描画オブジェクト」と明記してスタートしているのでやらざるを得ないところです。
コーディング事例
すべてのグラフの描画オブジェクトを作成するためのコーディング事例をご紹介いたします。
プログラムの構造は今回はメインサブルーチンから、データを書出しするサブルーチンと、描画メソッドを呼び出すファンクションと、そのファンクションから呼ばれる共通出力のための子サブルーチンの計4個になります。
ワークシート上への出力方法とその仕様
前回とほとんど同じですので、今回は違うところをご説明いたします。
ワークシートに出力するデータ項目の並びは前回と合わせています。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|
No | 種類 | Name | Type | TypeName | AutoShapeType | 判定プロパティ | 比較数式 | 描画図形 |
- Name
- ActiveChart.Nameの戻り値にはシート名が付与されているのですが、Shapes.Rangeプロパティで配列で選択する際にはシート名があると選択できません。
そのためにActiveSheet.Nameにスペースを加えた文字列をActiveChart.Nameの戻り値から除去しています。
更にSelection.ShapeRange(2)のNameプロパティの戻り値を”/”の後に続けて出力しています。 - なお配列で「グラフ Fix」は先にしているので、添え字は2になります。(以下同じ)
- ActiveChart.Nameの戻り値にはシート名が付与されているのですが、Shapes.Rangeプロパティで配列で選択する際にはシート名があると選択できません。
- Type 及び 6.AutoShapeType
- Selection.ShapeRange(2)のType及びAutoShapeTypeプロパティをそれぞれにセット
- TypeName
- 単独選択の時の戻り値と複数選択の時の戻り値を”/”の後に続けて出力しています。
- 判定プロパティ
- 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に書き出して、書き出された描画オブジェクトの種類を確認する」ご説明をしてきましたが、「すべての描画オブジェクト」に対してもう一つご紹介したい属性がございます。
それは描画オブジェクトに対してコメクターを接続する際の結合点です。実はこれがなかなかの曲者で「描画オブジェクト全体でどうなっているのか?」を把握して置いた方が後からコーディングを修正する事態を避けられる事と思います。
そこで次回は「すべての描画オブジェクトの結合点について」をご説明したく存じます。
以上最後までご一読いただき誠にありがとうございました。