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

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

エクセルVBAで埋め込みグラフ(ChartObjects)のアクティブ

エクセルVBAで埋め込みグラフ(ChartObjects)のアクティブ化のエラー(1004)解消方法について。 予めWorkbook1のシートに6つの埋め込みグラフを用意してあります。 Workbook2のシート1に数値データがあり、シート2に先のWorkbook1のシートを コピペして、数値の参照先をWorkbook2のシート1に変更して利用したいと考えております。 以下の処理を用いて、グラフ内の文字サイズが変わってしまうので、文字サイズを再設定しなおそうと、 埋め込みグラフを1つずつ選択し、文字サイズ設定を行おうとしているのですが、 chart 3を選択したところで、chartobjectクラスのactivateメソッドが失敗 (エラー 1004) が出てしまいます。 ちなみに、Workbook1のシート上で、以下の処理を行ってもエラーは出ません。 Workbook2にコピペしたものに対して、chart 1、chart 2の処理が済み、 chart 3になった所でエラーが発生します。 解決方法のご教授をよろしくお願い致します。 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 '変更したいチャートをアクティブにする。 ActiveSheet.ChartObjects(crt_name).Activate ActiveChart.ChartArea.Select Selection.AutoScaleFont = True With Selection.Font .Size = 10 End With Next j

noname#133886
noname#133886

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

  • ベストアンサー
  • 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

  • Excel VBA グラフを任意sheetに移動させるには?

    アクティブになっているsheetのグラフを参照し、 それを『まとめ』sheetに移動して張り付ける。 現在 ★マークのところでエラーになっています。 オブジェクトは、このメソッドをサポートしていません…と、これは何のエラーになるのでしょうか? アドバイスお願い致します. Sub test() Dim str As String ★str = ActiveSheet.ChartObjects.Name 'strにグラフ名を代入 ←不具合中… Sheets("まとめ").Activate '---sheet 『まとめ』を アクティブにする ActiveSheet.ChartObjects(str).Activate ActiveChart.Paste End Sub

  • Excel VBA グラフチャート名で指定するには

    ExcelのVBAでグラフを作成した後 ActiveChartでアクティブなチャートを指定するのではなく ActiveChart.Nameなどで取得したチャート名で指定するには どのように記述すればよいでしょうか。 例えば、以下のtest()のコードの中の ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone) ActiveChart.PlotArea.Select ActiveChart.Parent.Copy の部分をActiveChartを使わずチャート名(chart_nameなど)で指定するには どのように記述すればよいでしょうか。 よろしくお願いします。(Windows7,Excel2016) --------------------------------------- Sub test()  Dim chart_name As String  ThisWorkbook.Worksheets("Sheet1").Select  ThisWorkbook.Worksheets("Sheet1").Range("A1") = "A"  ThisWorkbook.Worksheets("Sheet1").Range("A2") = "B"  ThisWorkbook.Worksheets("Sheet1").Range("B1") = "75"  ThisWorkbook.Worksheets("Sheet1").Range("B2") = "25"  ThisWorkbook.Worksheets("Sheet1").Range("A10").Select  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart2(297, xlBarStacked100).Select  ThisWorkbook.Worksheets("Sheet1").Select  ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows  chart_name = ActiveChart.Name  chart_name = Trim(Right(chart_name, Len(chart_name) - Len(ActiveSheet.Name)))  ThisWorkbook.Worksheets("Sheet1").ChartObjects(chart_name).Activate  ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone)  ActiveChart.PlotArea.Select  ActiveChart.Parent.Copy End Sub

  • VBAで各シートの表でグラフを作成したいのですが

    シートごとにレイアウトが同じ表がありまして、 VBAで各シートの表でグラフを作成したいのですが、 どうしても作成した時のシートのデータで出来てしまいます。 egシート1で表作成>シート2でVBA実行してもシート1でつくったグラフが複製されるだけ、、 どうすれば、選択中のシートのデータで表ができるのでしょうか?? 一度グラフをコピーした上でデータを変える方法も試したのですが、 Sub Macro7() ActiveSheet.ChartObjects("グラフ 1").Activate ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.SeriesCollection(1).Name = "=Sheet2!$B$29" ActiveChart.SeriesCollection(1).Values = "=Sheet2!$B$31:$B$128" 結局シート2でしか出来ず、、です 「Sheet2!~」のところがいけないのはわかるのですが、、 この方法以外でもどんな方法でもよいのでどなたかお力かしてください。

  • エクセルのグラフ

    グラフが貼り付けられているシートを見えない状態でグラフ描画したいのですがうまくいきません ちなみに、今のコードはこうです。 Sub 電力力率表示() ActiveSheet.ChartObjects("グラフ 3").Activate ActiveChart.SeriesCollection(2).Select ActiveChart.SetSourceData Source:=Sheets(s_NAME) _ .Range("A2:C146"), PlotBy:=xlColumns End Sub

  • Excel VBAグラフチャート名で指定するには再

    以前に質問しましたが解決していませんので再度質問します。 ActiveChartではなく、具体的なチャート名で 指定するにはどのように記述すればよいでしょうか。 具体的には、以下のtest()のコードの最後の1行 ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows をActiveChartを使わずに記述するには、 どのように記述すればよいでしょうか。 回答例のように具体的なコードを教えてください。 よろしくお願いします。(Windows10,Excel2016) --------------------------------------- Sub test()  ThisWorkbook.Worksheets("Sheet1").Select  ThisWorkbook.Worksheets("Sheet1").Range("A10").Select  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart2(297, xlBarStacked100).Select  ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows End Sub --------------------------------------- (注1)test()を実行する前にSheet1シートのセルA1,A2,B1,B2にA,B,75,25の値を入力してから実行してください。 (回答例) --------------------------------------- Sub test()  Dim chart_name As String  ThisWorkbook.Worksheets("Sheet1").Select  ThisWorkbook.Worksheets("Sheet1").Range("A10").Select  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart2(297, xlBarStacked100).Select  chart_name = ActiveChart.Name  chart_name = Trim(Right(chart_name, Len(chart_name) - Len(ActiveSheet.Name)))  ThisWorkbook.Worksheets("Sheet1").ChartObjects(chart_name).SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows End Sub --------------------------------------- (注2)ただし、このコードではエラーになります。 (注3)回答例のようにチャート名を取得するためにActiveChartを使用するのは可です。

  • 横軸ラベルの追加に関するエラー(VBA)

    マクロの記録にて、グラフに横軸ラベルの追加を記録したところ 以下のようなコードになりました。 ActiveSheet.ChartObjects("グラフ 30").Activate ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "μsec" これと同じことをVBAのコードから実行しようとしたのですが、  ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "μsec" の行にて"オブジェクトが必要です"というエラーがでました。 何のオブジェクトが足りないのでしょうか? ActiveSheet.ChartObjects("グラフ 30").Activate にて チャートオブジェクトは指定されているので、チャートオブジェクトでは無いと思うのですが・・

  • VBA グラフを複数作成する場合

    マクロにてグラフを複数作成しようと考えています しかし、ループを使用してグラフを作成すると 1つ以上の場合エラーになってしまい作成できません どのように作成したらよいのでしょうか? 2つ目以降のグラフObjectの名前が重なるからエラーになるとか、そういう部分での問題でしょうか? ------------------------------------- Sub Graph   For i = 1 To 2 'source_cnt   Call Make_Graph(引数)   Next End Sub ------------------------------------- Sub Make_Graph(引数) With ActiveSheet.ChartObjects.Add( _ Left:=Range(***).Left, _ Top:=Range(***).Top, _ Width:=Range(***).Width, _ Height:=Range(***).Height) .Chart.ChartType = xlRadar .Chart.SetSourceData Source:= Range(***), PlotBy:=xlColumns .Chart.Location Where:=xlLocationAsObject, Name:=WorkSheet.Name .Chart.HasLegend = False End With -------------------------------------

  • Excel VBA グラフオブジェクトの使用方法について

    Excel2003のVBAについて教えて下さい。 以下の(1)~(4)のコードを用いて セル"A1"に設定された値をグラフスケール(最大値)に設定しようとしています。 (1) scaleData = Worksheets("シート1").Range("A1").Value (2) Set chartObj = ActiveSheet.ChartObjects(1) (3) Set chart1 = chartObj.Chart (4) chart1.Axes(xlValue).MaximumScale = scaleData グラフオブジェクト単体(グループ化しない)時は問題なく、グラフスケールの設定が行えたのですが、グラフオブジェクトやラベル、ボタンなどを結合すると、(3)で、以下のエラーメッセージが出て、グラフスケールの設定が行えません。 「WorksheetクラスのChartObjectsプロパティを取得できません。」 グループ化することにより、グラフオブジェクトの指定方法が異なるのでしょうか? 解決方法をご存知の方、教えて下さい。宜しくお願い致します。

  • エクセル:マクロ:2つのグラフを1枚に印刷

    同一シート内にグラフが2つと数値データがあります。シート上に配置したボタンをクリックし、1ページ(横)に並列で2つのグラフのみを印刷させたいのですが、どのようなコードになりますでしょうか?見た目の大きさでは、2つを並列しても、A4横一枚に余裕で入ります。一つの時は、 ActiveSheet.ChartObjects("グラフ 12").Chart.PrintOut としていました。

  • Excelマクロによるグラフ作成時の元データの取得について

     Excelマクロでグラフを作成したいのですが、以下(1)のように書いたら、Grp1.Chart.SetSourceData・・・のところでエラーになってしまいました。そこで、Rangeのところを(2)の様に変更したら、うまくいきました。ただ、自分としては、(1)のようにRangeの中にCellsを使う書き方でやりたいのですが、そのようにはできないでしょうか。  なお、マクロ初心者なので、簡単な表現でお願いします。 (1) Sub グラフ挿入_Macro() Set Grp1 = Sheets("グラフ1").ChartObjects.Add(10, 10, 500, 200) Grp1.Chart.SetSourceData _ Source:=Sheets("データ").Range(Cells(3, 1), Cells(10, 2)), _ PlotBy:=xlColumns End Sub (2) Sub グラフ挿入_Macro() Set Grp1 = Sheets("グラフ1").ChartObjects.Add(10, 10, 500, 200) Grp1.Chart.SetSourceData _ Source:=Sheets("データ").Range("A3:B10"), _ PlotBy:=xlColumns End Sub

専門家に質問してみよう