Excel VBA урезает мою серию диаграмм до 16384 значений после модификации - PullRequest
1 голос
/ 25 февраля 2020

Я использую 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 хотят взглянуть на это, я был бы признателен. : -)

...