Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Excel中图表的目标工作表数据将图表从一张工作表复制到另一张工作表_Excel_Vba - Fatal编程技术网

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

使用Excel中图表的目标工作表数据将图表从一张工作表复制到另一张工作表,excel,vba,Excel,Vba,我有几个工作表,它们有不同的数据,但组织方式相同(列数和行数相同)。我在sheet1中创建了几个图表,我想复制到sheet2。正常的复制/粘贴操作会将图表复制到sheet2,但图表仍然引用sheet1中的数据,而不是sheet2中的数据。如何在复制后自动使他们使用sheet2数据而不是sheet 作为一种解决方法,我尝试复制sheet1并将其命名为sheet2(它复制所有数据和图表),然后将真实的sheet2数据复制并粘贴到这个新的工作表中。这是可行的,但我希望有一种更快的方法,也许有一个宏可以

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


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

这样的方法对我来说很有效。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

Pelter对如何使用宏编辑绘图方程以引用当前工作表中的数据进行了很好的讨论。在

上看到的文章我用了很多Jon Peltier(实际上是在Ge猜中提供的页面中间链接)。 这是一个可以获得的附加模块

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

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

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

一种繁琐的方法是更改所有图表系列公式中的所有图纸参考,例如,将以下公式中的图纸1的所有实例更改为图纸2: =系列(活页1!$B$1,活页1!$A$2:$A$4,活页1!$B$2:$B$4,1)


正如@sancho.s所指出的,您也可以使用我的教程中发布的代码使用VBA实现这一点。这些算法内置在我的商业Excel加载项软件中。

可能是一个宏…
确定可能有一个宏。如果您想获得帮助,请发布您尝试过的代码,我们可以更有效地提供帮助。但是,我想说的是,除非您有大量的工作表要复制,或者需要反复复制,否则按照您发现的方式进行复制可能是最好的。您可以使用图表的
.SetSourceData
来更改源代码。试一试,如果你被卡住了,那么把你试过的代码贴出来,我们会从那里取出来:)谢谢你的有用评论。我确实有大量的工作表要复制,我必须一遍又一遍地修改数据和图表,并且必须重复多次,因此自动化至关重要。请查看常见问题解答。你应该用答案回答。提供链接是不够的。请编辑您的帖子,给出解决方案的主要概念。我有两个教程介绍这个问题:和全新的。