• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAで埋め込みグラフ(ChartObjects)のアクティブ)

エクセルVBAで埋め込みグラフのアクティブ化エラー解消方法

このQ&Aのポイント
  • エクセルVBAを使用してWorkbook1のシートにある埋め込みグラフをWorkbook2のシートにコピペしようとする際、文字サイズが変わってしまう問題が発生します。chart 3になった時点でエラーが出てしまうため、文字サイズの再設定を行うことができません。解決方法を教えてください。
  • エクセルVBAで埋め込みグラフのアクティブ化に関するエラー(1004)が発生します。具体的には、chart 3を選択した時にchartobjectクラスのactivateメソッドが失敗し、エラー 1004が表示されます。この問題を解消する方法を教えてください。
  • エクセルVBAで埋め込みグラフのアクティブ化時にエラー 1004が発生します。chart 3以降のグラフをアクティブにしようとするとエラーが出てしまいます。このエラーを解消する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

>→  For Each ch In ActiveSheet.ChartObjects ここで型不一致エラーが出るのも不可解ですが、とりあえず >実行時エラー'1004 Objectクラスの Activate メソッドが失敗しました >が発生する次第です。 >一体、何故なのでしょう?不可解です。 この原因について書きますと、 >ActiveChart.ChartArea.Select これが原因ですね。解消するには >crt_name = ThisWorkbook.ActiveSheet.ChartObjects(j).Name Windows(Workbooks(2).Name).Activate '※ >'変更したいチャートをアクティブにする。 >ActiveSheet.ChartObjects(crt_name).Activate ※を追加してください。 『単純に考えてchart 3の名前を持つChartObjectが無いから エラーになるのでしょう。』 なんて書きましたが、単純すぎました..orz グラフウィンドウがアクティブになったままなので、エラーになってるかと。 Windows(ActiveWorkbook.Name).Activate でもいいですので、WorkbookのWindowを明示的にActiveにしてあげる必要があります。 基本、ActivateやSelectを使わないコードにしたほうが良いです。

その他の回答 (1)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

Sub test()   Dim ch As ChartObject   For Each ch In ActiveSheet.ChartObjects     Debug.Print ch.Name     'With ch.Chart.ChartArea     '  .AutoScaleFont = True     '  .Font.Size = 10     'End With   Next End Sub こんな感じでChartObjectのNameをチェックしてみてください。 『chart xx』のxxは連番で自動付与されますから 単純に考えてchart 3の名前を持つChartObjectが無いから エラーになるのでしょう。 元シートのChartObjectsが連番ならば、 新規シートにコピーして試せばうまくいくのではないでしょうか。 ですが、基本、名前で指定したりActivateしなくても処理はできます。 (上記testでコメントアウトしている例) 、それよりも元シートのグラフを.AutoScaleFont = Falseにしておけば >グラフ内の文字サイズが変わってしまう.. という事態は避けられるのではないでしょうか。

noname#133886
質問者

お礼

end-u様  ご指摘ありがとうございます。お蔭様でエラーが解消できました。 コード上では、そこまで記載する必要はないと思っていても、 冗長なActivate宣言が必要なようですね。 マクロ内では、アプリ上位からの絶対的な宣言を確定させるべき?と 考えれば良いのでしょうか? ただ、これは難しい... >基本、ActivateやSelectを使わないコードにしたほうが良いです。 極力このようにしようと思いますが、 EXCELマクロでは、ActivateやSelectを使うのは常套手段では? ともあれ、問題解決にまでお付き合いいただきまして、 ありがとうございました。

noname#133886
質問者

補足

ご回答頂きまして、ありがとうございます。 >それよりも元シートのグラフを.AutoScaleFont = Falseにしておけば 仰るとおり、今後はこのようにさせていただきます。 しかし、今回の問題はまだよくわからない現状です。 教えていただいた処理を実行すると、次の所で、 『(実行時エラー’13) 型が一致しません』 となります。    Dim ch As ChartObject →  For Each ch In ActiveSheet.ChartObjects 従いまして、前回同様、次の処理を実行したところ、 grp_cnt = ActiveSheet.ChartObjects.Count For j = 1 To grp_cnt Workbooks(2).Worksheets(2).Activate 'シート上のチャート中より、指定した名前のチャートを探す。 Set obj = ThisWorkbook.ActiveSheet.ChartObjects(j) crt_name = ThisWorkbook.ActiveSheet.ChartObjects(j).Name Debug.Print crt_name Next j 結果は、 Chart 1 Chart 2 Chart 3 Chart 4 Chart 5 Chart 6 と出るのです。(前回エラーのChart 3含む)全てのObjectの名前がはっきり出るのに、 実行時エラー'1004 Objectクラスの Activate メソッドが失敗しました が発生する次第です。 一体、何故なのでしょう?不可解です。 更にご助言いただける方がありましたら、よろしくお願い致します。

関連するQ&A