Я использую Excel 365
У меня есть диаграмма, которая содержит много разбросанных данных XY - потенциально свыше 20000 значений. Однако некоторые выбросы в данных настолько далеко от нормы, что диапазон сжимается, и диаграмма становится менее значимой. Я хочу go просмотреть данные и очистить эти выбросы для визуальных целей, но на самом деле не изменить исходные данные. Извините, если это сбивает с толку звучание, но это настройка.
Проблема, с которой я столкнулся, заключается в том, что при запуске процедуры очистки я теряю тысячи значений. Например, у меня есть ряд в диаграмме с примерно 20 100 точками данных XY. Я пытаюсь создать фильтр верхних частот, чтобы обрезать все, что в 3 раза больше среднего - поэтому, если значение Y больше, чем в 3 раза больше среднего, я просто устанавливаю его в 3 раза выше среднего.
После Я запускаю код, значения моего начального ряда находятся в диапазоне от 1 до 39914 - по сути, я не думал, что мне понадобится больше 40K записей. Я хорошо провожу данные, очищаю «слишком высокие» значения, а затем изменяю исходные значения ряда ... и в итоге получаю диапазон от 1 до 16384. Кажется, что я достиг некоторого ограничения памяти, которое не не относится к исходному массиву / коллекции / что угодно, но относится к тому, как я делаю вещи. Вот полный код:
Sub ExportCharts() ' Iterate through all charts and output to PNG files:
Dim chartname As String
Dim thevalues As Variant
Dim objChrt As ChartObject
Dim myChart As Chart
Dim seriescount, i, stopper As Long
Dim highpass, thevalue As Double
Dim s1 As Series
Dim save1 As String
chartname = "XYZ"
Set objChrt = Sheets("1080p Med").ChartObjects("FrameTime_Chart")
Set myChart = objChrt.Chart
Set s1 = myChart.SeriesCollection(1)
save1 = s1.Formula ' So I can restore the original formula for the chart
i = 1
stopper = 0
highpass = (Worksheets("1080p Med").Range("C111").Value) * 3 'this is the high pass filter value
thevalues = s1.Values
Do Until stopper <> 0 Or i > UBound(thevalues)
If IsEmpty(thevalues(i)) Then
stopper = 1
Else
If i > 40000 Then 'ignore more than 40,000 items for now
stopper = 1
Else
If thevalues(i) > highpass Then
thevalues(i) = highpass
End If
End If
End If
i = i + 1
Loop
s1.Values = thevalues
' thevalues here has a range of 1 to 39914 and s1 also has a range of 1 to 39914.
' After the above line executes, s1 has a range of 1 to 16384. What's going on!?
myChart.Refresh 'Not sure this is working -- I want the chart to redraw with the new data
Call ExportChart(myChart, chartname & "_3_FrameTime") 'Write out a PNG file of the chart.
s1.Formula = save1 ' Restore the original data to the chart
End Sub
Было бы проще просто изменить массив s1.Values, но это явно не разрешено - или я делаю это неправильно. Который может быть частью той же самой причины, я не знаю. Любые люди Excel хотят взглянуть на это, я был бы признателен. : -)