Макрос Excel VBA для копирования и вставки диаграмм иногда работает

Я написал макрос, который импортирует большой файл данных CSV, систематизирует данные и создает диаграммы. Графики созданы:

  • Копировать шаблон диаграммы
  • Вставить на другую вкладку
  • Переименовать диаграмму
  • Добавить ряд данных
  • Повторите для каждого столбца данных

Проблема, с которой я столкнулся, заключается в том, что когда я запускаю макрос в обычном режиме, он фактически не копирует диаграмму шаблона. Таким образом, когда он идет на вставку, в буфере обмена ничего нет, что вызывает ошибку. Вот фактический код:

wbGen.Sheets("Dashboard").ChartObjects("Chart 0").Activate
ActiveChart.ChartArea.Copy
wbGen.Sheets("Charts").Activate
ActiveSheet.Cells(iRotor * 16 - 31, iChartA * 7 - 6).Select
ActiveSheet.Paste 'Debug mode points to this line
ActiveSheet.ChartObjects("Chart 0").Activate
ActiveSheet.Shapes("Chart 0").Name = "Chart " & iChart

Вот в чем загвоздка: если я нажму Debug, верну курсор к первой строке выше и нажму «Продолжить», то код будет выполняться безупречно. Я не могу понять, почему он работает в режиме отладки, но не нормально. Я ценю любую помощь, которую вы можете оказать.

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


person Kes Perron    schedule 26.01.2016    source источник
comment
что вы пытаетесь сделать в строке над строкой ошибки?   -  person Kathara    schedule 26.01.2016
comment
Какое значение имеют iRotor и iChartA, когда код не работает?   -  person SierraOscar    schedule 26.01.2016
comment
Строка 4 определяет место вставки диаграммы. Например, первая итерация (когда код не работает) имеет iRotor = 2 и iChartA = 1. Это вызывает выделение ячейки (1,1) и вставку диаграммы. На следующей итерации iRotor = 2 и iChartA = 2, поэтому следующая диаграмма вставляется в ячейку (1, 8).   -  person Kes Perron    schedule 26.01.2016


Ответы (2)


Закройте редактор vbe при запуске этого кода ...

Sheets("Dashboard").ChartObjects("Chart 0").Copy
Sheets("Charts").Select
Sheets("Charts").Cells(iRotor * 16 - 31, iChartA * 7 - 6).Select
Sheets("Charts").PasteSpecial Format:="Microsoft Office Drawing Object", Link:=False, DisplayAsIcon:=False
person Herry Markowitz    schedule 26.01.2016

Попробуйте что-то вроде этого:

Dim chtTemplate As Chart
Set chtTemplate = wbGen.Sheets("Dashboard").ChartObjects("Chart 0").Chart
DoEvents
chtTemplate.ChartArea.Copy

or

Dim chtTemplate As ChartObject
Set chtTemplate = wbGen.Sheets("Dashboard").ChartObjects("Chart 0")
DoEvents
chtTemplate.Copy

затем продолжайте.

person Jon Peltier    schedule 30.01.2016