Excel 2010 VBA удаляет диаграмму

#excel #vba #charts

#excel #vba #Диаграммы

Вопрос:

Я поддерживаю приложение Excel VBA в свободное время. Я инженер-технолог, а не профессиональный разработчик.

Графические части приложения работали без проблем в Excel 2007. Моя компания обновляется до Excel 2010, и у того же приложения теперь есть проблемы с взаимодействием с диаграммами на рабочих листах.

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

         'select the histogram chart
        Sheets(sChartSheet).Select
        ActiveSheet.ChartObjects("Chart 15").Activate

        Call PBarCaption("Delete Existing Histogram Series")
        'remove any existing series
        For i = 1 To ActiveChart.SeriesCollection.Count
            ActiveChart.SeriesCollection(1).Delete
        Next i
 

затем создает новые ряды, поскольку новые данные для построения диаграммы импортируются из внешнего файла данных:

     'add series for histogram
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.SeriesCollection(1).Values = "=HistogramData!$B$5:$B$29"
    ActiveChart.SeriesCollection(1).XValues = "=HistogramData!$A$5:$A$29"
    ActiveChart.SeriesCollection(1).charttype = xlColumnClustered
 

Проблема с 2010 заключается в том, что иногда при запуске кода VBA вся гистограмма «теряется» (удаляется), а не диаграмма присутствует без каких-либо определенных рядов.

«Потерянная» диаграмма, по-видимому, возникает, когда последовательное выполнение базового кода выполняется с помощью другого раздела кода VBA, который автоматически создает серию диаграмм и копирует их в PowerPoint.

Когда последовательность диаграмм выполняется вручную, она работает без проблем. При автоматическом запуске, при создании второй последовательности обмена сообщениями, диаграмма удаляется.

Я надеюсь, что кто-то знаком с изменениями в построении графиков с версии Excel 2007 по 2010 и сможет помочь.

Спасибо,

Len

Комментарии:

1. Можете ли вы подтвердить, что диаграммы действительно удаляются, или возможно, что диаграмма просто становится невидимой? Действительно ли уменьшается длина коллекции ChartObjects для текущего листа? Когда мы обновили существующие книги, содержащие код для работы с диаграммами, с Excel 2003 до Excel 2007, мы обнаружили, что наш код иногда приводил к исчезновению диаграмм из поля зрения, но они все еще были там в фоновом режиме. Если они все еще там, это может показаться странным, но если вы перейдете на панель управления и остановите, а затем запустите службу под названием «Диспетчер очереди печати», они могут появиться снова.

2. Мы обнаружили, что лучшим решением этой проблемы было написать код, который удалял и воссоздавал все диаграммы с нуля как свежие диаграммы 2010 года, чтобы удалить любое скрытое «повреждение» из версии Excel 2003.

3. Майкл, спасибо. Надеюсь, на следующей неделе у меня будет время вернуться к этому. Поскольку объект построения диаграммы отображается во время записи макросов с 2010, я могу сделать именно это и удалить всю диаграмму и каждый раз создавать заново с нуля, чтобы иметь возможность иметь полный контроль. Я изначально хотел сделать это при переходе на версию 2007, но объект построения графиков изменился, и поскольку объектная модель не отображалась при записи макросов, это было слишком много, чтобы откусить. Я опубликую обновление, когда доберусь до чего-нибудь с этим.

Ответ №1:

Это может помочь переработать ваш код, чтобы вы не активировали / не выбирали, а затем в зависимости от того, что «активный» объект не меняется: это может сломаться, если какой-то другой код активирует какой-то другой объект, когда вы этого не ожидаете…

 Dim cht As Chart

Set cht = ActiveWorkbook.Sheets(sChartSheet).ChartObjects("Chart 15").Chart
Do While cht.SeriesCollection.Count > 0
    cht.SeriesCollection(1).Delete
Loop

With cht.SeriesCollection
    .NewSeries
    With .Item(1)
        .Values = "=HistogramData!$B$5:$B$29"
        .XValues = "=HistogramData!$A$5:$A$29"
        .ChartType = xlColumnClustered
    End With
End With
 

Комментарии:

1. Это, безусловно, лучший дизайн, например, выбор диаграмм на скрытых листах вызовет исключение во время выполнения, поэтому лучше никогда не выбирать объекты рабочего листа. Кроме того, не отключая обновление экрана, это поможет вам избежать слишком сильного мерцания экрана. Однако это не сильно поможет решить вашу проблему.

2. Хорошая лучшая практика. Я сделаю это. Я пытаюсь свести к минимуму прямую работу с выбранными объектами, но она работала, обновление экрана было отключено, поэтому перешел к другим задачам!

Ответ №2:

Я переформатировал все взаимодействия с диаграммой, чтобы использовать «с», а не выбирать. Это лучшее программирование.

К сожалению, это не решило проблему.

Комментарии, касающиеся диспетчера очереди печати, были полезны, и, похоже, проблема связана с взаимодействием с отображением диаграмм на экране и принтере.

Ссылка

Поскольку у многих других пользователей в моей организации разные принтеры, и при использовании драйверов печати MS Office по умолчанию это не улучшило результаты, необходимо было найти другое решение.

Проблема возникла при использовании кода VBA для копирования элементов рабочего листа в PowerPoint. Копировался как принтер, bitmat с использованием:

 rSlideArea.CopyPicture (2)  
 

Изменен на копирование в виде растрового изображения экрана с помощью:

 rSlideArea.CopyPicture Appearance:=xlScreen, Format:=xlBitmap
 

Интересно, что полученные файлы PowerPoint с растровым форматированием были проще в работе и были меньше.

В результате изображения в PowerPoint не такие «красивые» при форматировании экрана, но приложение теперь работает в Excel v2010, что было первоочередной задачей.

Спасибо всем, кто помог.