Сохранение динамического именованного диапазона на диаграмме при копировании рабочего листа

Я пытаюсь автоматизировать диаграммы для электронной таблицы с большим количеством листов.

Я создаю все необходимые диаграммы / графики на листе шаблона и делаю их динамическими, используя именованные диапазоны (OFFSET + COUNT). После завершения этого шаблона я хотел бы иметь возможность копировать лист (сохраняя его в той же книге) и обновлять диаграммы, когда я добавляю новые данные на каждый новый лист.

На каждом листе будут использоваться одинаковые имена для диапазонов (общие финансовые слова, такие как margin и volume), поэтому я ограничил их листом, на котором они используются (а не глобальной областью видимости). ).

Когда я копирую рабочие листы, именованные диапазоны, указанные в диаграммах, заменяются статическими адресами ячеек, а не копируются вместе с диаграммой. Динамические именованные диапазоны копируются вместе с листом, и на них можно ссылаться только на новом листе (что я и хочу).

Есть ли способ сделать так, чтобы диаграммы поддерживали динамические именованные диапазоны?


person Peter    schedule 16.03.2018    source источник
comment
Новые листы имеют динамические диапазоны, связанные с листом, на котором вы сейчас находитесь. Вы хотите, чтобы они ссылались на исходный лист?   -  person QHarr    schedule 16.03.2018
comment
Нет, я хочу, чтобы они ссылались на новый лист. Если я смогу заставить это работать, я буду вставлять новые данные в таблицу на новом листе, которая может иметь другую длину (отсюда и динамические именованные диапазоны), и я бы хотел, чтобы диаграмма ссылалась на данные на том же листе, на котором он расположен.   -  person Peter    schedule 16.03.2018
comment
Я смущен. Прости. Судя по изображению, они указывают на скопированный лист (т. Е. На новый лист).   -  person QHarr    schedule 16.03.2018
comment
Да, они указывают на скопированный лист. Проблема в том, что диаграмма потеряла названные диапазоны при копировании листа. Если вы посмотрите на выделение на панели функций на втором изображении, диаграмма ссылается на статический диапазон, а не на поддержание именованных диапазонов, как на панели функций на первом изображении.   -  person Peter    schedule 16.03.2018


Ответы (1)


Вы можете просто повторно указать значения серии. Это очень простой случай с 1 коллекцией серии и 1 диаграммой, где вы копируете лист 1. Существует динамическая серия под названием DynRange, которая уже существует на листе 1. Подложка ниже просто устанавливает серию в скопированной диаграмме обратно в этот диапазон.

Вы можете разработать это, чтобы перебрать все диаграммы на скопированном листе. Возможно, вам потребуется уже зациклить исходные диаграммы и все их серии для хранения (в массиве?) Имен диаграмм, имен / номеров серий и связанных именованных диапазонов, чтобы вы могли правильно применить к новому диапазону.

Или сделайте цикл и установите диаграмму 1 на лист 2, серия 1 = диаграмма 1 на листе 2 серия 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

Основной код:

А вот грубая и готовая версия того, что я упомянул, чтобы перебрать все диаграммы и все серии, установив эквивалентные динамические диапазоны на листе 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

Данные:

Выполнение кода

Использованная литература:

person QHarr    schedule 16.03.2018
comment
Спасибо за составление кода. Когда я запустил макрос, появилось сообщение об ошибке, и отладчик выделил строку If nm.RefersToRange.Parent.Name = ActiveSheet.Name Then в разделе LoopNameRange. Можете ли вы назвать какие-либо причины, по которым это может вызвать проблемы? - person Peter; 16.03.2018
comment
Ошибка времени выполнения '1004': ошибка приложения или объекта - person Peter; 17.03.2018
comment
если, когда вы нажмете эту ошибку, вы откроете немедленное окно (я думаю, ctrl + G) и наберете? nm.RefersToRange.Parent.Name нажмите Enter, что вы получите? А еще? ActiveSheet.Name что вы получите? - person QHarr; 17.03.2018
comment
Для ?nm.RefersToRange.Parent.Name я получаю сообщение об ошибке, в котором говорится об ошибке времени выполнения «1004»: ошибка, определяемая приложением или объектом. Для ?ActiveSheet.Name я получаю Sheet1 (2). - person Peter; 17.03.2018
comment
В порядке. Меня сейчас нет, но я вернусь к вам - person QHarr; 17.03.2018
comment
Что произойдет, если вы закомментируете LoopNamedRanges ActiveSheet? - person QHarr; 17.03.2018
comment
Новый лист создан, и сообщение об ошибке отсутствует, но диаграмма ссылается на определенные ячейки, а не на именованные диапазоны. - person Peter; 17.03.2018
comment
странно ... как вы можете видеть в моей гифке, это работает. Я не уверен, что смогу продолжить отладку без файла :-( - person QHarr; 17.03.2018
comment
Кажется, что самый простой вариант - просто использовать обходной путь шаблона Excel, поскольку диаграммы останутся связанными с именованными диапазонами. Спасибо за помощь. - person Peter; 17.03.2018
comment
После попытки использовать метод шаблона я, кажется, столкнулся с другой проблемой. Когда я обновляю имя рабочего листа, некоторые диаграммы по-прежнему ссылаются на старое имя рабочего листа вместо того, чтобы изменять ссылку на динамический именованный диапазон на новое имя рабочего листа. Когда я вставляю новые данные, диаграммы не обновляются, потому что они все еще ссылаются на данные из старого имени рабочего листа (которого теперь не должно существовать). Есть идеи, почему это может происходить? - person Peter; 17.03.2018
comment
Я не исследовал это, но, возможно, попробую завтра. В противном случае может возникнуть хороший второй вопрос, хотя обязательно покажите, что вы пробовали, и объясните, что не работает с тем, что вы пробовали. - person QHarr; 17.03.2018