Серия диаграмм обновления Excel VBA

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

Это работает, но иногда диаграмма не обновляется полностью, как на прикрепленном изображении (отображает пустую диаграмму с названием серии как «серия1, серия2, ...»). Когда это происходит, щелкните правой кнопкой мыши диаграмму и щелкните «Выбрать данные», а затем просто выберите любую серию, кроме серии 1, чтобы обновить диаграмму. не обновлять или повторно назначать источник данных. просто выберите «series2» или другие в окнах выбора данных и нажмите «отмена», что, как я подозреваю, макрос не полностью выполнен...,

Я делаю что-то неправильно? или есть способ полностью обновить график?

Диаграмма 1

График 2

Sub chtupdate()

    Dim rng As Range
    Dim i As Integer
    Dim n As Integer

    Set rng = Range("G37").CurrentRegion

    ActiveSheet.ChartObjects("Chart1").Activate
    With ActiveChart
        .ChartArea.ClearContents
        .SetSourceData Source:=rng, PlotBy:=xlRows

        n = ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Count                
        For i = 1 To n - 1
            .SeriesCollection(i).ChartType = xlColumnStacked
        Next i    

        .SeriesCollection(n).ChartType = xlLineMarkers
    End With

End Sub

person Danny Yun    schedule 05.05.2017    source источник
comment
я подозреваю, что макрос выполняется не полностью -- Почему бы вам не проверить это, запустив отладчик? atm единственный совет, который я имею в виду, это 1) не Activate график (нет необходимости); 2) отключить обновление экрана во время макроса; 3) поскольку вы находитесь внутри With clause, замените n = ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Count на более простое n = .SeriesCollection.Count   -  person A.S.H    schedule 06.05.2017
comment
@Danny Yun попробуйте код в моем ответе ниже   -  person Shai Rado    schedule 06.05.2017
comment
Спасибо за ваш комментарий. Я избавился от диаграммы активации. У меня есть код для отключения и включения кода обновления экрана между приведенными ниже кодами. Я просто не добавил это здесь. В качестве вашей рекомендации я использовал "Step In" с отладчиком. проблема сохраняется. сначала работает, а во второй не работает. Я не уверен, почему это работает иногда и не работает. И спасибо за подсказку о '.SeriesCollection.Count'. да, чище. В любом случае, проблема сохраняется.   -  person Danny Yun    schedule 06.05.2017


Ответы (1)


Попробуйте код ниже, я добавил переменные объектов ChartObject и Series для более простого и "чистого" кода. Кроме того, чтобы избежать необходимости использования ActiveSheet и ActiveChart - метод, который будет ненадежным.

Код

Option Explicit

Sub chtupdate()

Dim MyCht       As ChartObject
Dim Ser         As Series

Dim Rng As Range
Dim i As Long
Dim n As Long

' fully qualify all your Ranges and Cells
With Worksheets("Sheet3") ' <-- replace "Sheet1| with your sheet's name
    Set Rng = .Range("G37").CurrentRegion

    ' set the chart object
    Set MyCht = .ChartObjects("Chart1")
End With

With MyCht
    .Chart.ChartArea.ClearContents
    .Chart.SetSourceData Source:=Rng, PlotBy:=xlRows

    For Each Ser In .Chart.SeriesCollection
        Ser.ChartType = xlColumnStacked
    Next Ser

    ' modify the last one
    Set Ser = .Chart.SeriesCollection(.Chart.SeriesCollection.Count)
    Ser.ChartType = xlLineMarkers
End With

End Sub
person Shai Rado    schedule 06.05.2017
comment
Спасибо. Но это все равно. У меня есть несколько листов с одной сводной таблицей, одной обычной таблицей (скопированной сводкой в ​​транспонированном представлении), одной диаграммой. Причина, по которой я копирую сводную таблицу в обычную таблицу, заключается в том, что сводная диаграмма не работает в Mac Excel. Поэтому я копирую сводную таблицу в выбранный диапазон и устанавливаю этот скопированный диапазон в качестве источника данных диаграммы. - person Danny Yun; 06.05.2017
comment
Каждый лист имеет одну или несколько раскрывающихся кнопок. выбирая эти раскрывающиеся кнопки, сводная таблица обновляется (удалить существующее поле строки и добавить выбранное поле в поле строки/удалить существующий элемент значения, добавить выбранный элемент значения в поле значения/удалить существующее поле столбца и добавить выбранное поле в поле столбца). - person Danny Yun; 06.05.2017
comment
Итак, у меня есть коды addRow(), addColumn() и addValue(). эти коды назначены кнопкам «Раскрывающийся список». затем после обновления сводной таблицы я вызываю коды copyPivotTable() и chtupdate() внутри события Worksheet_PivotTableUpdate. причина, по которой я использую это событие для запуска «chtupdate», — это слайсеры. Я использую слайсеры для фильтрации, но я не могу назначить макрос слайсерам, поэтому я использую событие обновления сводной таблицы. это одна из причин, по которой я использовал ActiveSheet вместо имени листа. (На Mac события рабочего листа не работают, поэтому я добавил еще одну кнопку для выполнения «копировать сводку» и «chtupdate»). - person Danny Yun; 06.05.2017
comment
Кстати, ваши коды для обновления диаграммы очень чистые. Спасибо за это. но он все еще делает то же самое. Это работает, когда я переключаю свой раскрывающийся список с одного на другой. но у него есть такая же проблема несколько раз. он полностью обновляет диаграмму и иногда показывает пустую диаграмму с «серией 1», «серией 2»...., и снова, если я открываю всплывающее окно выбора данных и выбираю серию, отличную от «серии 1», тогда диаграмма полностью обновляется. - person Danny Yun; 06.05.2017