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

时间:2018-03-16 11:39:43

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

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

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

每个工作表都会使用相同名称作为范围(marginvolume等通用财务字词),因此我将它们限制在工作表中他们被使用(而不是全球范围)。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

或循环并在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个动态系列。< / p>

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

数据:

Code run

参考文献: