2015-04-16 3 views
0

I модифицируют значения из SeriesCollection каждые 1s следующим образом:Утечка памяти при обновлении Excel Chart Каждый 1s

Sheets("Charts").ChartObjects(1).Chart.SeriesCollection(1).Values = "={0}" 

Это приводит к моей памяти постоянно увеличиваться, что заставляет меня думать, есть утечка. Зачем?

настоящее время я использую Excel 2007.

+0

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

+0

Привет, Брайан, приведенный выше код - это всего лишь проведенный тест, который понимает, почему у моего фактического макроса была утечка памяти. В моем фактическом макросе я периодически читаю из файла журнала и обновляю диаграммы excel в соответствии с извлеченными точками данных. Это с интервалом 1 с. Я заметил, что использование памяти достигает 900 МБ через 12 часов. –

+0

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

ответ

0

Мой опыт с обновлениями SeriesCollection в том, что они очень неэффективно. В типичных случаях использования это несущественно, однако, когда между рабочей книгой открываются/закрываются чрезмерные/быстрые обновления, вы не только увидите инфляцию памяти, но и отставание обновления экрана.

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

Он будет запускать 30 000 циклов в течение двух секунд на моей машине, при использовании менее 1 Мбайт дополнительной памяти против нескольких минут и 50 МБ всего за 1000 циклов с использованием SeriesCollection. Это чуть более 8 непрерывных часов при 1 обновление/секунду (при обновлении экрана ON), поэтому я надеюсь, что это сработает для вас.

Dim arrTableVals() As Integer 
Dim iUbound As Integer 
Dim iArrCount As Integer 

iUbound = 20 
'Resize your array with iUbound derived from elsewhere in your sub 
ReDim arrTableVals(iUbound, 0) As Integer 
'Populate the array where sheets/charts do not update 
For iArrCount = 0 To iUbound 
    arrTableVals(iArrCount, 0) = iArrCount + 1 
Next 
'Assign the array to the chart source range 
ActiveWorkbook.Sheets("Charts").Range("A2:A" & iUbound + 2).Value = arrTableVals 

Excel имеет очень простой способ обработки памяти во время выполнения VBA, когда он взаимодействует с данными рабочего листа. Он очищает всю историю во время выполнения и не начинает запоминать снова до завершения (именно поэтому Undo исчезает). Я подозреваю, что SeriesCollections освобождены от этого, так как они могут быть обновлены отдельно от таблицы.

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