使用Excel中图表的目标图表数据将图表从一张图表复制到另一张图表

我有几个工作表有不同的数据,但以相同的方式组织(col和行相同的数量)。 我在sheet1中创build了多个图表,我想将其复制到sheet2。 而正常的复制/粘贴将图表复制到sheet2中,图表仍然是指sheet1中的数据,而不是sheet2中的数据。 如何在复制后自动使用sheet2数据而不是表格?

作为解决办法,我尝试复制sheet1并将其命名为sheet2(复制所有数据和图表),然后复制并粘贴真正的sheet2数据到这个新的表单中。 这工作,但我希望有一个更快的方法,也许是一个macros,将所有图表从Sheet1复制到Sheet2,并自动更新引用。

我已经使用了Jon Peltier的Change Series Formula (它实际上链接在GGuess的答案中提供的页面的中间)。 这是一个插件,可以在这里获得。

这是非常有用的,它可能涵盖了大多数这种types的案件的需要。 它提供了一个方便的界面(UserForm)来search和replace图表系列公式中的string。 它实际上比“更换源工作表”更通用,因为可以一次使用search和replace来更改许多系列公式的其他部分。

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

第二种最简单的方法是,如果图表的数据组织简单,则使用function区中的“select数据”或右键单击菜单,并更改对话框顶部“图表数据范围RefEdit”中指示的范围。

一个单调乏味的方法是更改​​所有图表系列公式中的所有工作表引用,例如,将以下公式中Sheet1的所有实例更改为Sheet2:= SERIES(Sheet1!$ B $ 1,Sheet1!$ A $ 2:$一个$ 4工作表Sheet1 $ B $ 2:$ B $ 4,1)

正如@ sancho.s所指出的那样,您也可以使用我的“ 更改系列公式”教程中发布的代码,通过VBA进行此操作。 这些algorithm被embedded到我的商业Excel插件软件中。

Pelter对如何使用macros编辑绘图方程来引用当前工作表中的数据有很好的讨论。 请参阅http://peltiertech.com/WordPress/make-a-copied-chart-link-to-new-data/上的文章

所以这样的事情为我工作。 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