2014-10-22 6 views
46

У меня возникла проблема с приложением, которое было создано в 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 
+1

Он не работает после 209 итераций; Я не знаю почему. Однако, если я удаляю все ряды в начале каждой итерации (используя, например, 'For j = cht.Chart.SeriesCollection.Count To 1 Step -1: cht.Chart.SeriesCollection (j) .Delete: Next j'), то это работает отлично. –

+0

Привет, Жан-Франсуа, если вы измените число серий, это провалится при другом количестве итераций, чем больше число рядов, тем быстрее он сработает. Мне было просто интересно, почему один и тот же объект и тот же код дают разные результаты в разных версиях Office. Думаю, мне придется управлять ошибкой и продолжить удаление серии в Диаграмме с помощью кода и возобновить выполнение кода после удаления серии.Большое спасибо за вашу помощь. – Pocerus

+2

Механизм построения диаграмм Excel был полностью перестроен для Excel 2007, и этот был использован с тех пор. Было много изменений, самое хорошее, несколько плохое. Также много небольших поведений в VBA различны. Вы можете спросить, почему что-то есть, и никто не знает, кроме как привести обновленный механизм построения диаграмм. Если вы можете получить обходной путь по любой из ваших проблем, например, опубликованный Жан-Франсуа, запустите его. –

ответ

15

Это не касается причины возникновения ошибки. Это обходное решение.

Перед тем как позвонить SetSourceData, удалите всю существующую серию, находящуюся на графике, и код будет работать, как ожидалось.

For j = cht.Chart.SeriesCollection.Count To 1 Step -1 
    cht.Chart.SeriesCollection(j).Delete 
Next j 

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

+0

Спасибо за помощь Жан-Франсуа. К сожалению, я пока не нашел никакой информации об этой проблеме с Chart/Series. Я попытаюсь немного подробнее рассказать об этой проблеме и использовать ваше предлагаемое решение на данный момент. – Pocerus

0

Другая возможность - определить именованный диапазон для данных, которые определены с использованием формулы Offset и соответствующих опорных ячеек. Для этого требуется, чтобы данные были смежными, а не изменяли начальную строку &, в которой она начинается, и для вас нужно настроить по крайней мере одну ссылочную формулу (в столбце/строке, содержащей данные), которая может использоваться для установки высоты/ширины диапазона смещения.

В противном случае очень удобная небольшая работа, чтобы вывести это из макросов и поместить в логику рабочего листа.

Смежные вопросы