9

データは異なるが同じ方法で整理されたワークシートがいくつかあります(列と行の数は同じです)。シート2にコピーしたいシート1にいくつかのチャートを作成しました。通常のコピー/貼り付けではチャートがシート 2 にコピーされますが、チャートはまだシート 2 ではなくシート 1 のデータを参照しています。コピー後にシートではなくシート2データを自動的に使用するにはどうすればよいですか?

回避策として、sheet1 をコピーし、それを sheet2 (すべてのデータとチャートをコピーする) と呼び、実際の sheet2 データをコピーしてこの新しいシートに貼り付けました。これは機能しますが、より高速な方法と、すべてのチャートをシート 1 からシート 2 にコピーして参照を自動的に更新するマクロがあることを期待していました。

4

4 に答える 4

10

グラフを別のシートにコピーし、グラフを新しいシートのデータにリンクさせる最も簡単な方法は、グラフをコピーすることではありません。最も簡単な方法は、チャートを含むシートをコピーし、コピーしたシートのデータを変更することです。

2 番目に簡単な方法は、チャートのデータが単純に整理されている場合、リボンまたは右クリック メニューから [データの選択] を使用し、ダイアログの上部にある [チャート データ範囲の参照編集] に示されている範囲を変更することです。

面倒な方法は、チャートのすべての系列数式のすべてのシート参照を変更することです。たとえば、次の数式の Sheet1 のすべてのインスタンスを Sheet2 に変更します: =SERIES(Sheet1!$B$1,Sheet1!$A$2:$ A$4,Sheet1!$B$2:$B$4,1)

@sancho.s が指摘しているように、Change Series Formulaチュートリアルに投稿されたコードを使用して、VBA でこれを行うこともできます。これらのアルゴリズムは、私の市販の Excel アドイン ソフトウェアに組み込まれています。

于 2015-06-29T14:52:07.173 に答える
4

私は Jon Peltier のChange Series Formulaをよく使用しました (実際には GGuess の回答で提供されたページの中央にリンクされています)。こちらから入手できるアドインです。

これは非常に便利で、おそらくこのタイプのほとんどのケースのニーズをカバーしています。チャート シリーズの数式の文字列を検索および置換するための便利なインターフェイス (ユーザー フォーム) を提供します。検索と置換を使用して、多くのシリーズのシリーズ式の他の部分を一度に変更できるため、実際には「ソースの変更ワークシート」よりも用途が広いです。

于 2013-12-10T13:24:53.323 に答える
1

だから、このようなものが私のために働いた. CopyCharts は、すべてのグラフをソース シートからターゲット シートにコピーします。次に、SetChartRef は、ターゲット内のチャートの参照を希望するものに設定します。この例では、どのチャート番号が何であるかを知っています。代わりにチャート名を使用するように改善できると思います。

また、何らかの理由で、コピーと貼り付けの間に遅延がない場合、実行時エラーが発生するため、待機機能が発生します。

    Sub DeleteEmbeddedCharts(target As String)

    Dim wsItem As Worksheet
    Dim chtObj As ChartObject
        For Each chtObj In ThisWorkbook.Worksheets(target).ChartObjects
            chtObj.Delete
        Next
End Sub

Sub SetChartRef(target As String)

    Dim cht As ChartObject
    Dim i As Integer

    'i specifies which chart to set its data references
    i = 0
    For Each cht In ThisWorkbook.Worksheets(target).ChartObjects
        If i = 0 Then
            cht.Chart.SeriesCollection(1).Values = "=" & target & "!$I$2:$I$12"
            cht.Chart.SeriesCollection(2).Values = "=" & target & "!$J$2:$J$12"
        ElseIf i = 1 Then
             cht.Chart.SeriesCollection(1).Values = "=" & target & "!$I$14:$I$25"
             cht.Chart.SeriesCollection(2).Values = "=" & target & "!$J$14:$J$25"
        ElseIf i = 2 Then
            cht.Chart.SeriesCollection(1).Values = "=" & target & "!$I$26:$I$37"
            cht.Chart.SeriesCollection(2).Values = "=" & target & "!$J$26:$J$37"
        ElseIf i = 3 Then
            cht.Chart.SeriesCollection(1).Values = "=(" & target & "!$H$2," & target & "!$H$14," & target & "!$H$26," & target & "!$H$38)"
            cht.Chart.SeriesCollection(1).XValues = "=(" & target & "!$E$2," & target & "!$E$14," & target & "!$E$26," & target & "!$E$38)"
         ElseIf i = 4 Then
            cht.Chart.SeriesCollection(1).Values = "=(" & target & "!$H$2," & target & "!$H$14," & target & "!$H$26," & target & "!$H$38)"
            cht.Chart.SeriesCollection(1).XValues = "=(" & target & "!$E$2," & target & "!$E$14," & target & "!$E$26," & target & "!$E$38)"
        ElseIf i = 5 Then
            cht.Chart.SeriesCollection(1).Values = "=" & target & "!$I$38:$I$49"
            cht.Chart.SeriesCollection(2).Values = "=" & target & "!$J$38:$J$49"
        End If
        i = i + 1
    Next


End Sub

Sub CopyCharts(source As String, target As String)

    Dim chtObj As ChartObject
    'First delete all charts from target sheet
    DeleteEmbeddedCharts (target)

    'Some delay
    Application.Wait Now + TimeSerial(0, 0, 1)

    For Each chtObj In ThisWorkbook.Worksheets(source).ChartObjects
        With ThisWorkbook.Worksheets(target)
            .Activate
            chtObj.Copy
            'Paste in row T1+i
            Range("T1").Offset(i).Select
            .Activate
            Application.Wait Now + TimeSerial(0, 0, 1)
            .Paste
            Application.Wait Now + TimeSerial(0, 0, 1)
            i = i + 10
            .Activate
        End With
    Next chtObj

    'Set the data references to target sheet
    SetChartRef (target)

End Sub
于 2012-09-21T17:05:32.237 に答える
1

Pelter は、マクロを使用してプロット方程式を編集し、現在のワークシートのデータを参照する方法について良い議論をしています。http://peltiertech.com/WordPress/make-a-copied-chart-link-to-new-data/の記事を参照してください。

于 2013-08-13T17:32:21.507 に答える