【问题标题】:Maintaining a dynamic named range in a chart when copying a worksheet复制工作表时在图表中维护动态命名范围
【发布时间】:2018-03-16 11:39:43
【问题描述】:

我正在尝试为包含大量工作表的电子表格自动生成图表。

我正在模板工作表上构建我需要的所有图表/图形,并使用命名范围(OFFSET + COUNT) 使它们动态化。完成此模板后,我希望能够复制工作表(同时将其保存在同一个工作簿中),并在我在每个新工作表上添加新数据时更新图表。 p>

每个工作表都将使用相同的名称作为范围(通用财务词,例如 marginvolume),因此我将它们限制在它们所在的工作表中使用(而不是全局范围)。

当我复制工作表时,图表中引用的命名范围将替换为静态单元格地址,而不是与图表一起复制。动态命名范围与工作表一起复制,并且只能在新工作表上引用(这是我想要的)。

有没有办法让图表保持动态命名范围?

【问题讨论】:

  • 新工作表似乎具有与您现在所在的工作表相关联的动态范围。您希望它们参考原始工作表吗?
  • 不,我希望他们参考新工作表。如果我可以让它工作,我会将新数据粘贴到新工作表上的表格中,该表格可能具有不同的长度(因此是动态命名范围),并且我希望图表引用同一张工作表上的数据它位于。
  • 我很困惑。对不起。从图像上看,它们似乎指向复制的工作表(即新工作表)
  • 是的,它们指向复制的工作表。问题是图表在复制工作表时删除了命名范围。如果您查看第二张图像中功能栏中的突出显示,则图表引用静态范围,而不是像第一张图像中的功能栏中那样保持命名范围。

标签: excel excel-formula excel-2016 named-ranges excel-charts


【解决方案1】:

您可以简单地重新指向系列值。这是一个非常简单的案例,其中包含 1 个系列集合和 1 个图表,您可以在其中复制工作表 1。工作表 1 中已经存在一个名为 DynRange 的动态系列。下面的子代码只是将复制图表中的系列设置回此范围。

您可以开发它来循环复制工作表中的所有图表。您可能需要循环原始图表及其所有系列以存储(在数组中?)图表名称、系列名称/编号和关联的命名范围,以便您可以正确地应用于新范围。

或者循环并在 sheet2 上设置图表 1,系列 1 = 在 sheet2 系列 1 上设置图表 1 等。

注意:您可以将工作表保存为 official Excel 模板并使用它。

Option Explicit

    Sub ResetRange()

        Sheets("Sheet1").Select
        Sheets("Sheet1").Copy Before:=Sheets(1)
        ActiveSheet.ChartObjects("Chart 1").Activate
        ActiveChart.FullSeriesCollection(1).Values = "=Sheet1!DynRange"

    End Sub

主要代码:

这里是我提到的粗略和现成的版本,循环遍历所有图表和所有系列设置到表 1 中的等效动态范围。注意我只测试了 1 个图表和 2 个动态系列。

Option Explicit

Public Sub ResetRange()

    Dim wb As Workbook
    Dim sourceSheet As Worksheet

    Set wb = ThisWorkbook
    Set sourceSheet = wb.Sheets("Sheet1")
    sourceSheet.Copy Before:=Sheets(1)

    Dim currChart As Long
    Dim currSeries As Series
    Dim thisChart As Chart
    Dim thisSeries As Long

    With ActiveSheet

        For currChart = 1 To .ChartObjects.Count

            Set thisChart = .ChartObjects(currChart).Chart

            For thisSeries = 1 To thisChart.SeriesCollection.Count

                thisChart.SeriesCollection(thisSeries).Formula = sourceSheet.ChartObjects(currChart).Chart.SeriesCollection(thisSeries).Formula

            Next thisSeries

            Set thisChart = Nothing

        Next currChart

    End With

    LoopNamedRanges ActiveSheet

End Sub

Private Sub LoopNamedRanges(ByVal ActiveSheet As Worksheet)

    Dim nm As Name

    For Each nm In ActiveWorkbook.Names

        If nm.RefersToRange.Parent.Name = ActiveSheet.Name Then

            nm.Delete

        End If

    Next nm

End Sub

数据:

参考资料:

【讨论】:

  • 感谢您整理代码。当我运行宏时,出现了一条错误消息,并且调试器在 LoopNameRange 部分中突出显示了“If nm.RefersToRange.Parent.Name = ActiveSheet.Name Then”行。您能想到这会导致问题的任何原因吗?
  • 运行时错误“1004”:应用程序定义或对象定义错误
  • 如果当您遇到该错误时,您会打开即时窗口(我认为是 ctrl + G)并输入 ?nm.RefersToRange.Parent.Name 输入,您会得到什么?还有 ?ActiveSheet.Name 你得到了什么?
  • 对于?nm.RefersToRange.Parent.Name,我收到一条错误消息,上面写着“运行时错误'1004':应用程序定义的或对象定义的错误”。对于?ActiveSheet.Name,我得到“Sheet1 (2)”。
  • 好的。我目前不在,但会回复你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多