- 締切済み
エクセルVBAでグラフのインデックスを取得したい
質問させていただきます。 同じようなグラフが埋め込まれたシートが15前後存在する ブックが多数あります。 グラフの色変更をマクロで一括実行していたのですが、 エラーで停止、原因はグラフのインデックスが一部違っているためでした。(ほとんどは”グラフ 2”ですが、2のほかに4や6、1028なんかもある) そこで、グラフのインデックスを参照するコードを追加したいのですが、ご教示いただけるでしょうか。 よろしくお願いします。
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- xls88
- ベストアンサー率56% (669/1189)
>いろいろやってみましたが、難しいですね。 どんな事をいろいろ試されたのか解りませんが、難しいことはないと思いますよ。 コードを提示して頂けないので推測ですが、Indexの使い方は理解されたと認識します。 あとは、回答番号:No.5 この回答へのお礼 で明らかになったような阻害要因を排除してやれば上手く回せると思います。 シート上には2個のグラフということですから Msgbox Activesheet.ChartObjects.Count で、答えが2以上ならグラフの残骸があるので、それを見つけて削除すれば良いわけです。 グラフをひとつ選択して、Tabキーを押せば次のグラフ(含む他の図形)が選択されます。 姿の見えないグラフも選択されるので、容易に見つけることが出来、削除できます。 余談ですが 回答番号:No.3 で、「お礼の欄を使って、レス出来ると思います。」とコメントしました。 これは、捕捉と合わせて、ひとつの回答に2回レス出来るという意味です。 あと、これ以上の応答を望まれないのなら、締め切り処理をよろしくお願いします。 継続をお望みなら、遠慮なく捕捉で質問してください。
- xls88
- ベストアンサー率56% (669/1189)
既に、これまでの回答で、Indexの取り方、使い方は書いています。 一意の名前の付け方 ActiveChart.Parent.Name = "ABC1" 手動でやるなら グラフを選択すれば「名前ボックス」にグラフ名が表示されます。 Excel2007以前なら、「名前ボックス」をクリックし、例えば ABC1 と打ち込み、Enter、で新しい名前になります。 Excel2007ではこの機能が使えなくなっています。
- xls88
- ベストアンサー率56% (669/1189)
>ただ、例えば、”グラフ 14”の場合、 >Msgbox Activesheet.ChartObjects.Count >は「2」になりましたが、 > >マクロの自動記録で、 >ActiveSheet.ChartObjects("グラフ 14").Activate >ActiveSheet.Shapes("Chart 14").Select >となります。 回答番号:No.5でもコメントしましたが 名前の通し番号と、ChartObjectのインデックスは別物です。 名前の通し番号には不確定要素があります。決め打ちで使う事は難しいと思います。 ChartObjectのIndexを使った方が良いと思います。 あるいは、一意の名前を付けて対処したほうが良いかもしれません。 >また、このシートだけをを新規ファイルにコピーして調べると、 >ActiveSheet.ChartObjects("グラフ 1").Activate >ActiveSheet.Shapes("Chart 1").Select >になります。 > >ブックに共存する他のシートが影響するのでしょうか。 シートその物をコピーすると、通し番号がリセットされます。 通し番号はそのシートに付随しているもので、他のシートの影響はありません。
お礼
>ChartObjectのIndexを使った方が良いと思います。 >あるいは、一意の名前を付けて対処したほうが良いかもしれません。 長時間お付き合いいただいて恐縮ですが、 この辺りのテクニックをもう少しアドバイスいただけるでしょうか。 ご指摘の通り、決め打ちができないので、 「グラフのインデックスを取得したい」と思ったのですが、 これまでの回答から、それは不可能なので、 代替手法を使うのだと思っていました。 よろしくお願いします。
- xls88
- ベストアンサー率56% (669/1189)
>”グラフ 4”の場合、 >ChartObjects(2)を >ChartObjects(4)にすると正常に動きます。 グラフ名の数字は、オートシェイプ等も含まれた数字になります。 例えば、同じシートで グラフ オートシェイプ オートシェイプ グラフ といった順で作成(コピーも含む)されると ("グラフ 1") ("オートシェイプ名 2") ("オートシェイプ名 3") ("グラフ 4") といったように、出現した順番になります。 在る時点で、どれかが削除されてもその数字がつかわれる事はありません。 ("グラフ 4") を削除して、新たにグラフを作成すれば ("グラフ 5") となります。 Shapesは、すべての図形が返されます。グラフオブジェクト、オートシェイプ、画像、その他、が含まれます。 ChartObjectsは、埋め込みグラフを返します。 ですから >ChartObjects(2)を >ChartObjects(4)にすると正常に動きます。 ということは、グラフオブジェクトが最低4つはそのシート上に在ることになります。 もしかすると、非表示状態でシート上に存在しているというようなことはないでしょうか。。 Msgbox Activesheet.ChartObjects.Count でグラフが何個あるか確認してください。
お礼
お蔭様で進展がありました。 ご指摘の通り、線のようになったグラフが 罫線に重なって隠れていたので、削除しました。 (作成当時、グラフを削除せずに列削除をしたと思われます。) ただ、例えば、”グラフ 14”の場合、 Msgbox Activesheet.ChartObjects.Count は「2」になりましたが、 マクロの自動記録で、 ActiveSheet.ChartObjects("グラフ 14").Activate ActiveSheet.Shapes("Chart 14").Select となります。 また、このシートだけをを新規ファイルにコピーして調べると、 ActiveSheet.ChartObjects("グラフ 1").Activate ActiveSheet.Shapes("Chart 1").Select になります。 ブックに共存する他のシートが影響するのでしょうか。
- xls88
- ベストアンサー率56% (669/1189)
>「邪魔そうな図」とは、加工したいグラフ以外に別のグラフがあります >(同一シート上にグラフが2つ、その他ラインが複数本ちらばっている)。 各シートにはグラフが2つ在るということですか? 必ず2つですか? 2つ以上は無いのですか? 「その他ラインが複数本」とはオートシェイプの直線があるという事ですか? たとえ、オートシェイプの直線が存在していても、無問題です。 回答番号:No.2 で示したコードは、全てのグラフの系列6に対して加工操作します。 加工したいグラフのインデックス(名前に付けられる番号ではありません)が、2(そのシート上で2番目に作成されたグラフというような意味です)とするなら Dim ws As Worksheet Dim cht As ChartObject For Each ws In ActiveWorkbook.Worksheets With ws.ChartObjects(2).Chart.SeriesCollection(6) .Border.ColorIndex = 14 End With Next ws とすれば、 全てのシートで、インデックスが 2 のグラフの、系列番号6 の折れ線の色が、ColorIndex値 14 の色に設定されます。
お礼
お世話になります。 ”グラフ 4”の場合、 ChartObjects(2)を ChartObjects(4)にすると正常に動きます。 グラフは必ず2つしかないのですが、 確認できたものとしては2、4、6、14、1028があります。 マクロの自動記録では、 普通に選択した場合の”グラフ 4”は、 ActiveSheet.ChartObjects("グラフ 4").Activate オートシェイプで選択した場合 ActiveSheet.Shapes("Chart 4").Select です。 1028個もグラフを作るはずはないので、 なぜ”グラフ 1028”が存在するかは不明です。 (加工しない方のグラフも5や15などがあり、一定ではありません。) (ラインはオートシェイプの直線です。)
- xls88
- ベストアンサー率56% (669/1189)
>前回、書き込みの途中で送信してしまい、修正もできず、 >失礼しました。 なんのことか解りませんが、お礼の欄を使って、レス出来ると思います。 >実行時エラー '1004': >'SeriesCollection' メソッドは失敗しました: '_Chart' オブジェクト こちらでは無問題なので解りかねます。 シートの保護とかは関係ないでしょうか? >元の図から系列7と8を削除したり、 >邪魔そうな図を削除したりしながら試しましたが 「元の図」とはグラフのことですか? 「邪魔そうな図」とはグラフに図形を描画しているという事ですか? いずれにしても。結果がでているように、無関係だと思います。
お礼
ありがとうございます。 特に保護はかけていません。 「元の図」とはグラフです。 「邪魔そうな図」とは、加工したいグラフ以外に別のグラフがあります(同一シート上にグラフが2つ、その他ラインが複数本ちらばっている)。 提示していただいたコードで、 ChartObjectがどういう状態ならエラーがでないか、 もう少し試して見ます。
- xls88
- ベストアンサー率56% (669/1189)
全グラフの、系列6、に対して操作すればよいのですか? 下記のようでどうでしょうか? Dim ws As Worksheet Dim cht As ChartObject For Each ws In ActiveWorkbook.Worksheets 'ws.Select For Each cht In ws.ChartObjects With cht.Chart.SeriesCollection(6).Border .ColorIndex = 14 .Weight = xlThin .LineStyle = xlContinuous End With Next Next ws
補足
引き続き回答いただきありがとうございます。 前回、書き込みの途中で送信してしまい、修正もできず、 失礼しました。 操作するのは系列6のほかに、7と8の三種あります。 アドバイスのコードを実行したところ、 With cht.Chart.SeriesCollection(6).Border の箇所で、 実行時エラー '1004': 'SeriesCollection' メソッドは失敗しました: '_Chart' オブジェクト が発生しました。 解決策がありそうなコードでしたので、 元の図から系列7と8を削除したり、 邪魔そうな図を削除したりしながら試しましたが、 うまくいきませんでした。 メッセージボックスの使用は避けたいので、 この方向で、もう少しアドバイスいただけるでしょうか。 よろしくお願いします。
- xls88
- ベストアンサー率56% (669/1189)
下記を試してください。 Dim cht As ChartObject Dim n As Integer Dim i As Integer n = ActiveSheet.ChartObjects.Count For Each cht In ActiveSheet.ChartObjects i = i + 1 MsgBox i & "/" & n & vbCrLf & cht.Index & vbCrLf & cht.Name Next >グラフの色変更をマクロで一括実行していたのですが そのコードを提示できないでしょうか。
補足
回答いただきありがとうございます。 実行しているのは、 Sub b_Chartライン太さ変え() For shtNo = 1 To Sheets.Count Sheets(shtNo).Select ActiveSheet.ChartObjects("グラフ 2").Activate ActiveChart.SeriesCollection(6).Select With Selection.Border .ColorIndex = 14 .Weight = xlThin .LineStyle = xlContinuous End With (中略) Next shtNo End Sub
お礼
いろいろやってみましたが、難しいですね。 タイムリミットなので、結局エラーだけ手動でやりました。 アドバイスいただきありがとうございました。