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

时间:2012-09-20 18:43:08

标签: excel excel-vba vba

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

作为一种解决方法,我尝试复制sheet1并将其称为sheet2(复制所有数据和图表),然后将真实的sheet2数据复制并粘贴到此新工作表中。这是有效的,但我希望有一种更快的方法,也许是一个将所有图表从sheet1复制到sheet2并自动更新引用的宏。

4 个答案:

答案 0 :(得分:8)

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

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

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

正如@ sancho.s指出的那样,您也可以使用我Change Series Formula教程中发布的代码与VBA一起完成此操作。这些算法内置于我的商业Excel插件软件中。

答案 1 :(得分:2)

我经常使用Jon Peltier的Change Series Formula(它实际上是在GGuess的答案中提供的页面中间链接)。 它是一个可以获得的加载项here

它非常有用,它可能涵盖了大多数此类病例的需求。 它提供了一个方便的界面(UserForm)来搜索和替换图表系列公式中的字符串。它实际上比“更改源工作表”更通用,因为可以使用搜索和替换来同时更改许多系列的系列公式的其他部分。

答案 2 :(得分:1)

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

上的文章

答案 3 :(得分:0)

这样的事情对我有用。 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