复制工作表时在图表中维护动态命名范围

Pet*_*ter 5 excel excel-formula named-ranges excel-charts excel-2016

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

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

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

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

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

QHa*_*arr 1

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

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

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

注意:您可以将工作表另存为官方 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
Run Code Online (Sandbox Code Playgroud)

主要代码:

这是我提到的一个粗略且现成的版本,用于将所有图表和所有系列设置循环到表 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
Run Code Online (Sandbox Code Playgroud)

数据:

代码运行

参考: