У меня возникла проблема с приложением, которое было создано в Excel 2003 в моей компании. Приложение извлекает данные из источника и обновляет диаграмму с использованием SetSourceData
в процедуре VBA, передавая диапазон, содержащий ячейки, в которых записаны соответствующие данные.Повторные вызовы Chart.SetSourceData дают ошибку 1004
Приложение работает только штрафом в Office 2003, но когда приложение выполняется в Office 2010 дает эту ошибку:
Run-time error '1004': Method 'SetSourceData' of object'_Chart' failed.
Я создал For
цикл в простой файл Excel в Office 2010 и в зависимости на число столбцов, переданных в диапазон на диаграмму, ошибка рано или поздно наступит. Чем больше столбцов передается в Range, тем скорее оно появится. Я предполагаю, что это должно быть связано с количеством серий в Диаграмме (больше столбцов больше серий).
Это какой-то механизм/буфер в объекте или серии диаграммы, реализованных в Office 2010, которых не было в Office 2003? Тот же цикл For
никогда не показывает проблему, когда он запущен в Office 2003, и я не знаю, как решить эту проблему.
До сих пор я удалял все серии, управляющие ошибкой, с помощью команды Goto, чтобы удалить все серии в серии SeriesCollection с помощью цикла For Each
, чтобы выбрать все объекты в наборе SeriesCollection диаграммы. Если я это сделаю и возобновляю выполнение приложения, когда я передаю диапазон снова, все данные будут правильно покрашены в объект диаграммы.
Пример воспроизведения ошибки. Следующий код должен быть помещен в модуль VBA в новой книге Excel 2010. Запустите Sub setDataChart
, и приложение запустится до появления сообщения об ошибке.
Sub setDataChart()
Call createAColValues
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlXYScatterSmoothNoMarkers
ActiveChart.SetSourceData Source:=Range("A1:FA6"), PlotBy:=xlColumns
ActiveSheet.ChartObjects(1).Activate
With ActiveChart.Parent
.Height = 325
.Width = 900
.Top = 120
.Left = 10
End With
Call updateValues
Call sendData
End Sub
Sub sendData()
Dim cht As ChartObject
Set cht = ActiveSheet.ChartObjects(1)
'On Error GoTo delSeries:
For i = 0 To 1000
cht.Chart.SetSourceData Source:=ActiveSheet.Range("A1:FA6"), PlotBy:=xlColumns
Next i
End Sub
Sub createAColValues()
Range("A1").Select
ActiveCell.FormulaR1C1 = "1"
Range("A2").Select
ActiveCell.FormulaR1C1 = "2"
Range("A1:A2").Select
Selection.AutoFill Destination:=Range("A1:A6"), Type:=xlFillDefault
Range("A1:A6").Select
End Sub
Sub updateValues()
Range("B1").Select
ActiveCell.FormulaR1C1 = "=RANDBETWEEN(0,10)"
Range("B1").Select
Selection.AutoFill Destination:=Range("B1:B6"), Type:=xlFillDefault
Range("B1:B6").Select
Selection.AutoFill Destination:=Range("B1:FA6"), Type:=xlFillDefault
Range("B1:FA6").Select
End Sub
Он не работает после 209 итераций; Я не знаю почему. Однако, если я удаляю все ряды в начале каждой итерации (используя, например, 'For j = cht.Chart.SeriesCollection.Count To 1 Step -1: cht.Chart.SeriesCollection (j) .Delete: Next j'), то это работает отлично. –
Привет, Жан-Франсуа, если вы измените число серий, это провалится при другом количестве итераций, чем больше число рядов, тем быстрее он сработает. Мне было просто интересно, почему один и тот же объект и тот же код дают разные результаты в разных версиях Office. Думаю, мне придется управлять ошибкой и продолжить удаление серии в Диаграмме с помощью кода и возобновить выполнение кода после удаления серии.Большое спасибо за вашу помощь. – Pocerus
Механизм построения диаграмм Excel был полностью перестроен для Excel 2007, и этот был использован с тех пор. Было много изменений, самое хорошее, несколько плохое. Также много небольших поведений в VBA различны. Вы можете спросить, почему что-то есть, и никто не знает, кроме как привести обновленный механизм построения диаграмм. Если вы можете получить обходной путь по любой из ваших проблем, например, опубликованный Жан-Франсуа, запустите его. –