[[20210306104916]] 『グラフにおける数式のコピー』(NEKO) ページの最後に飛ぶ

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

 

『グラフにおける数式のコピー』(NEKO)

グラフを作成する際、series関数内の引数に自分で定義した数式を使用しているのですが、この数式がシートをコピーした際に維持されず困っています。

具体的には、
=SERIES("sample1",sample1!time,sample1!temperature,1)
という関数が、シートをコピーすると
=SERIES("sample1 (2)",sample1 (2)!$A$2:$A$302,sample1 (2)!$B$2:$B$302,1)
のように範囲に置き換わってしまいます。

*timeとtemperatureはOFFSET関数を利用して定義した数式になります

シートをコピーしても範囲指定に置き換わらず数式を維持することは可能でしょうか。

宜しくお願い致します

< 使用 Excel:Excel2016、使用 OS:Windows10 >


コメント付かないのは余り適当な対策が無いということなんでしょうね。
 
確かにシートコピーでは、名前が実際のセル範囲に置き換わりますね。
これはFormulaプロパティ群のすべてがそうなりますね。
理屈から言えば、
・Formulaプロパティから「セル範囲アドレス」を示す文字列を取り出し、
・一方で、「名前」と「セル範囲アドレス」の対応関係を取り出し、
・それを使って、Formulaプロパティを書き換えることは、
可能は可能でしょう。
 
しかし手間がかかるので、元のシートのグラフをコピーペイストしてはどうですか?
名前は保存されるようです。そのほうが手っ取り早いでしょう。

(γ) 2021/03/06(土) 21:14


>元のシートのグラフをコピーペイストしてはどうですか?
それもダメでした。
コピー元のセル範囲を参照したグラフになってしまいました。
簡単な方法ではダメですね。
手で修正するのが手っ取早いのかな?

(γ) 2021/03/06(土) 21:34


ご回答ありがとうございます。
地道に手直しで進めていきます。
(NEKO) 2021/03/06(土) 23:09

 マクロを書いて見ました。
 (1)以下のマクロを、標準モジュールにコピーして下さい。
 (2)複製元のシートをアクティブな状態(選択する)にして下さい。
 (3)マクロ main を実行すると、
    ・シートが再右端に複製されます。
    ・元シートにあった名前定義もコピーされていて、
      グラフのデータ範囲が、その名前を使ったものになるはずです。

 【参考コード】
 Sub main()
     Dim ws0     As Worksheet
     Dim ws      As Worksheet
     Dim wsName0 As String
     Dim wsName  As String
     Dim chObj   As ChartObject
     Dim ch      As Chart
     Dim ch0     As Chart
     Dim seriesCol As SeriesCollection
     Dim sers    As Series
     Dim k       As Long
     Dim s0      As String
     Dim s       As String

     '元のシート(現在のActiveシート)をコピーして、最終位置へ
     Set ws0 = ActiveSheet
     ws0.Copy After:=Worksheets(Worksheets.Count)
     Set ws = ActiveSheet
     wsName0 = ws0.Name
     wsName = ws.Name

     '複製後の各グラフについて以下を実行
     For Each chObj In ws.ChartObjects
         Set ch = chObj.Chart

         '対応する元シートのChartを取得
         s0 = Replace(chObj.Name, wsName, wsName0)
         Set ch0 = ws0.ChartObjects(s0).Chart

         '各系列のFormulaプロパティを、対応する元のものを変換して再作成
         For k = 1 To ch.SeriesCollection.Count
             Set sers = ch.SeriesCollection(k)
             s = ch0.SeriesCollection(k).formula
             If InStr(wsName, " ") > 0 Then
                 sers.formula = Replace(s, wsName0, "'" & wsName & "'")
             Else
                 sers.formula = Replace(s, wsName0, wsName)
             End If
         Next
     Next
 End Sub

 ちなみに、元シートのシート名は、spaceを含まないものにしておいてください。
 十分精査していないので、ミスが混入している可能性は否定しません。(自信ありww)

(γ) 2021/03/07(日) 09:51


コメント返信:

[ 一覧(最新更新順) ]


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