[[20160614133144]] 『グラフシート上のグラフを変数に入れたい』(くろたろう) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『グラフシート上のグラフを変数に入れたい』(くろたろう)

 下記について教えていただけないでしょうか。
 ・最終的にやりたい事
 → グラフの軸の最小値・最大値を変更したい
 ・シート構成
 元データシート+複数のグラフシート
 ・躓いているところ
 → 関数に渡す為にグラフを変数に入れたいがエラーになる。

 下記掲載コードは、質問用にだいぶ端折っています。
 躓いている部分はコードの
     Set tgtchartObj = ActiveWorkbook.Charts(i).ChartObjects(1)
     Set chart1 = tgtchartObj.Chart

 で、エラー
 「実行時エラー1004
 アプリケーション定義またはオブジェクト定義のエラーです。」
 と出ます。

 データシート上のグラフは
     Set chartObj = Worksheets(1).ChartObjects(1)
     Set chart1 = chartObj.Chart
 といった書き方で入れられるようですが…

 グラフシート上のグラフを変数に入れる場合
 どういった記述になるでしょうか。

 どうぞ、よろしくお願い致します。

Sub test()
Dim i As Long
Dim tgtchartObj As ChartObject
Dim chart1 As Chart
Dim tmpCnt As Long
Dim tmpAvg As Double

tmpCnt = 1
For i = 1 To ActiveWorkbook.Charts.Count

    Set tgtchartObj = ActiveWorkbook.Charts(i).ChartObjects(1)
    Set chart1 = tgtchartObj.Chart

        tmpAvg = myMINMAX(chart1, "Average", tmpCnt)
'略

Next i

End Sub

Function myMINMAX(tgtchart As Chart, mytgt As String, tgtNum As Long) As Variant
'略
End Function

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 Sub test()
    Dim i As Long

    For i = 1 To ActiveWorkbook.Charts.Count
        With ActiveWorkbook.Charts(i)
             .Axes(xlValue).MinimumScale = 100
             .Axes(xlValue).MaximumScale = 1000
        End With
    Next i
 End Sub
(???) 2016/06/14(火) 14:22

目盛りを変えたいだけならオブジェクトの変数代入は不要なのですが、どうしても間接的に処理したい場合、
グラフの名前のChartObjectsをActiveにして、後はActiveChartに対して処理することになるかと思います。

マクロの自動生成機能が、なんでもかんでもSelectしまくるのに似ていて、要らない処理と思いますが。

または、どうしてもサブプロシジャにしたいならば、呼び方を以下のようにするとか。

 Call myMINMAX(ActiveWorkbook.Charts(i), "Average", tmpCnt)
(???) 2016/06/14(火) 14:39

 ???さん、ご返信ありがとうございます。

 グラフの外れ値を外してのmin・maxを探す為に
 同じ事を何回かまわすためにサブプロシジャ化しました。

 全体の作業でグラフを対象にする事が何回か登場する為
 変数に入れてしまいたかったんですが
 呼び方をご提示頂いた方式に変更する事にします。

 ちなみになんですが、「グラフシートのグラフは直接変数に入れることは出来ない」
 と考えて良いのですか?
(くろたろう) 2016/06/14(火) 15:11

変数に入れても良いのですが、元コーディングではオブジェクトが混ざっていたようですね。
1回しか使わないものを変数に入れるのは無駄に思えますが、元のままでも、こんな感じで。

    For i = 1 To ActiveWorkbook.Charts.Count
        Set chart1 = ActiveWorkbook.Charts(i)
        tmpAvg = myMINMAX(chart1, "Average", tmpCnt)
    Next i
(???) 2016/06/14(火) 17:23

ついでに、tgtchartObj の方を利用する書き方だと、こう?
1行で済むものを、2行3行に分けているだけですが…。

    For i = 1 To ActiveSheet.ChartObjects.Count
        Set tgtchartObj = ActiveSheet.ChartObjects(i)
        Set chart1 = tgtchartObj.Chart
        tmpAvg = myMINMAX(chart1, "Average", tmpCnt)
    Next i
(???) 2016/06/14(火) 17:40

 ???さん、ありがとうございます。

 どうやらそもそもの勘違いで、
 ブック - グラフシート - グラフ
 という構造だと思っていたんですが、そこが(も?)違ったわけですね。

「ChartObject オブジェクトに含まれている埋め込みグラフか、
独立したグラフシートのどちらかのグラフです。」
https://msdn.microsoft.com/ja-jp/library/office/ff194426.aspx

 略した部分で何度も使うため
 変数に入れられて可読性があがります。
 ありがとうございました。
(くろたろう) 2016/06/14(火) 17:53

解決後ですが、こんな書き方でも

 Sub test()
    Dim cht As Chart

    For Each cht In ActiveWorkbook.Charts
       MsgBox cht.Name
    '略
    Next

 End Sub

(マナ) 2016/06/14(火) 20:08


 マナさん
 お返事が遅れすみません。ありがとうございます!

 ワークシートのループと同じようにチャートでも扱えるんですね。

 別の業務をやっつけ次第
 グラフシート・ワークシート上のグラフの扱い等を確認したいと思います!

(くろたろう) 2016/06/16(木) 10:50


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.