9

我有几个工作表,它们具有不同的数据,但以相同的方式组织(相同的列数和行数)。我在 sheet1 中创建了几个图表,我想将其复制到 sheet2。虽然正常复制/粘贴将图表复制到 sheet2,但图表仍然引用 sheet1 中的数据,而不是 sheet2 中的数据。如何在复制后自动让他们使用 sheet2 数据而不是 sheet?

作为一种解决方法,我尝试复制 sheet1 并将其命名为 sheet2(复制所有数据和图表),然后将真实的 sheet2 数据复制并粘贴到这个新工作表中。这可行,但我希望有一种更快的方法,也许还有一个宏可以将所有图表从 sheet1 复制到 sheet2 并自动更新参考。

4

4 回答 4

10

将图表复制到另一个工作表并让图表链接到新工作表上的数据的最简单方法不是复制图表。最简单的方法是复制包含图表的工作表,然后更改复制工作表上的数据。

第二种最简单的方法,如果图表的数据组织简单,是使用功能区或右键菜单中的选择数据,并更改对话框顶部的图表数据范围参考编辑中指示的范围。

一种繁琐的方法是更改​​所有图表系列公式中的所有工作表引用,例如,将以下公式中 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 回答