- ベストアンサー
エクセルVBAで埋め込みグラフのアクティブ化エラー解消方法
- エクセルVBAを使用してWorkbook1のシートにある埋め込みグラフをWorkbook2のシートにコピペしようとする際、文字サイズが変わってしまう問題が発生します。chart 3になった時点でエラーが出てしまうため、文字サイズの再設定を行うことができません。解決方法を教えてください。
- エクセルVBAで埋め込みグラフのアクティブ化に関するエラー(1004)が発生します。具体的には、chart 3を選択した時にchartobjectクラスのactivateメソッドが失敗し、エラー 1004が表示されます。この問題を解消する方法を教えてください。
- エクセルVBAで埋め込みグラフのアクティブ化時にエラー 1004が発生します。chart 3以降のグラフをアクティブにしようとするとエラーが出てしまいます。このエラーを解消する方法を教えてください。
- みんなの回答 (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)
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にしておけば >グラフ内の文字サイズが変わってしまう.. という事態は避けられるのではないでしょうか。
お礼
end-u様 ご指摘ありがとうございます。お蔭様でエラーが解消できました。 コード上では、そこまで記載する必要はないと思っていても、 冗長なActivate宣言が必要なようですね。 マクロ内では、アプリ上位からの絶対的な宣言を確定させるべき?と 考えれば良いのでしょうか? ただ、これは難しい... >基本、ActivateやSelectを使わないコードにしたほうが良いです。 極力このようにしようと思いますが、 EXCELマクロでは、ActivateやSelectを使うのは常套手段では? ともあれ、問題解決にまでお付き合いいただきまして、 ありがとうございました。
補足
ご回答頂きまして、ありがとうございます。 >それよりも元シートのグラフを.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 メソッドが失敗しました が発生する次第です。 一体、何故なのでしょう?不可解です。 更にご助言いただける方がありましたら、よろしくお願い致します。