【问题标题】:Copy a chart from one sheet to another using the target sheet data for the chart in Excel使用 Excel 中图表的目标工作表数据将图表从一个工作表复制到另一个工作表
【发布时间】:2012-09-13 04:33:18
【问题描述】:

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

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

【问题讨论】:

  • perhaps a macro ... 当然可以有一个宏。如果您需要帮助,请发布您尝试过的代码,我们可以更有效地提供帮助。但是,我建议除非您要复制大量的工作表,或者需要一遍又一遍地复制,否则按照您找到的方式复制可能是最好的。
  • 您可以使用图表的.SetSourceData 更改来源。试一试,如果您遇到困难,请发布您尝试过的代码,我们将在那里采取形式:)
  • 感谢您的帮助。我确实有大量的表格要复制,我必须一遍又一遍地修改我的数据和图表,并且必须多次重复所有内容,因此自动化至关重要。

标签: excel vba


【解决方案1】:

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

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

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

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 请查看常见问题解答。你应该用解决方案来回答。提供链接是不够的。请编辑您的帖子以提供解决方案的主要概念。
      猜你喜欢
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      相关资源
      最近更新 更多