- ベストアンサー
EXCELマクロを用いてグラフの系列の参照元を置換
- エクセルでマクロを用いて、グラフの系列の参照元であるリンク数式を置換する方法を探しています。
- 現在、試している手法では実行時エラーが発生しており、原因は.XValuesや.Nameがリンク数式を評価した後の値を配列で保持しているためだと思われます。
- .XValuesや.Nameが保持しているデータが入っていたセルのアドレスを探すか、元のリンク数式を保持しているプロパティを探すことで文字列として置換できるのではないかと考えています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>>どうしても置換したいと言う場合ですが、調べた限りでは、元の情報は持っていないようです。(あるのかも知れませんが) >>これは、a=2の場合、a=1+1で指定したのか、a=4-2で指定したのかわからないようなものです。 >そうなのですか?となると元情報の置換は出来ないということになってしまうのでしょうか……。 と自分で書いておいて、ふと考えて、excelのシート上で変更できるんだから、どっかで情報保存してるはずじゃないかと、もう一度調べてみました。 で、 ActiveChart.SeriesCollection(n).Formula に格納されていました。 http://msdn2.microsoft.com/ja-jp/library/microsoft.office.interop.excel.series.formula(VS.80).aspx 「オブジェクトの数式を、A1 形式で設定します。値の取得および設定が可能です」 とありました。 nは、そのチャートのグラフ数(1からActiveChart.SeriesCollection.count)です。 ここをReplaceしてみてはどうでしょうか?
その他の回答 (1)
- fumufumu_2006
- ベストアンサー率66% (163/245)
まず、BeforeValue,AfterValueがどんな値かわからないのですが、 Replace(.Name, "BeforeValue", "AfterValue") は、BeforeValue,AfterValueの値に関係なく、"BeforeValue"と言う文字を "AfterValue"と言う文字に置換するだけです。 次に、エラーが出る.XValueの所で、 MsgBox VarType(.XValues) としてみてもらえば、8204を表示すると思います。 これは、8204=&h200Cで、配列 8192(&h2000)とVariant 12(&hC)で、variantの配列だとわかります。 と言う訳で、文字列変換の、Replace(.XValues, BeforeValue, AfterValue)と言う式はおかしい訳です。 ちなみに、VarType(.Name)=8(文字列)です。 話は戻って、XValues,Valuesは、Rangeオブジェクトか値の配列を設定してあげればいいので、 .XValues=Range("A2:A10") .Values = Range("B2:B10") とかしてあげればいいんじゃないかと思います。 Nameも.Name=Range("B1")とか、.Name="B列です"という風に設定すればいいだけだと思います。 と言う訳で、置換するのではなく、新たに設定してやればいいだけじゃないかと思います。 それと、For Each など使わずに、1つ目のグラフを変更するなら、 With ActiveChart.SeriesCollection(1) .XValues = Range("A2:A10") .Values = Range("B2:B10") .Name = Range("B1") End With としてあげればいいと思います。 どうしても置換したいと言う場合ですが、調べた限りでは、元の情報は持っていないようです。(あるのかも知れませんが) これは、a=2の場合、a=1+1で指定したのか、a=4-2で指定したのかわからないようなものです。
お礼
お礼が遅れて申し訳ありません。 BeforeValueは検索する文字列、AfterValueは置換後の文字列を格納する変数です。 仰るとおり、 .Name = Replace(.Name, "BeforeValue", "AfterValue") とすると変数としてではなく文字列として評価されてしまいますね。 途中で気付いて.XValuesと.Valuesの方は直したんですが.Nameの所だけ直し忘れていたようです。すいません。 For Eachを使ったのは、系列の数が一定でないので汎用性を持たせるためです。 こちらの環境で、.XValuesや.Valuesを新たに設定する方法ならどうやらうまく作動するみたいです。 ですが、グラフの数が多くて1つずつ修正するのが面倒なために置換プログラムを考えていたので、この方法だと結局グラフ毎にプログラムを書き直す必要があり、あまり意味がなくなってしまいます。 >どうしても置換したいと言う場合ですが、調べた限りでは、元の情報は持っていないようです。(あるのかも知れませんが) >これは、a=2の場合、a=1+1で指定したのか、a=4-2で指定したのかわからないようなものです。 そうなのですか?となると元情報の置換は出来ないということになってしまうのでしょうか……。
お礼
出来ました(^▽^)! 下の方法で系列名、Xの値、Yの値をまとめて置換できるのを確認しました! For Each Value In ActiveChart.SeriesCollection With Value If (InStr( .Formula, BeforeValue)) Then .Formula = Replace( .Formula, BeforeValue, AfterValue) End If End With Next Value やはりFor Eachにしてあるのは、必要十分なだけ系列にアクセスするようにです(系列番号が抜けている場合もありますので)。 置換元文字列が含まれている場合だけ処理するように、一応If文をはさんであります。 ただ、Formulaの中には =SERIES(系列名,Xの値,Yの値,系列番号) のように格納されているようですので、置換する際は少し注意が必要なようです(特に","を含んだ置換やXの値だけ置換したい場合)。 また、要素が1つも無い系列(参照先が空白セルだったり)がある場合はエラーになってしまうようです。 その辺り、まだ少し詰めなくてはならない部分もありますが、置換するだけならこのコードで十分出来ますので、この質問はここで締め切りとさせていただきます。 fumufumu_2006さん、ありがとうございました!