Текст метки данных Excel VBA Trendline пуст - PullRequest
0 голосов
/ 17 сентября 2018

Я сделал этот код год или около того назад, и он работает нормально. Однако в последнее время это сломалось. Я предполагаю, что было обновление Windows, которое изменило способ работы макросов Excel с диаграммами. Соответствующие разделы моего кода выполняют следующее:

  1. Создание диаграммы рассеяния XY на «подготовительном» листе
  2. Создание линии тренда для каждого ряда данных на XY Scatter
  3. Анализирует каждый текст линии тренда для наклона и R ^ 2, копируя их как текст на другой «сводный» рабочий лист

Я обнаружил, что шаги 1 и 2 работают нормально, но когда я пытаюсь проанализировать текст линии тренда (ожидая что-то вроде y = 0.0289x + 143), я получаю пустую строку (см. Закомментированный MsgBox, ниже). Что еще более странно, так это то, что когда макрос завершает работу (или не работает), диаграмма обновляется и текст отображается нормально.

' Create the graph for the linear part of the data set
Worksheets(PrepSheetName).Activate
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlXYScatterSmooth
ActiveChart.SetSourceData Source:=Range("$B$19:$G$38")
' ActiveChart.Name = "Linear"
'MsgBox "Past linear creation"

' Add each data set to the chart individually
ActiveChart.PlotArea.Select
For i = 1 To 5

    ' Construct a string like ='Data'!$C$19:$C$38
    YValues = "='" & PrepSheetName & "'!$" & DSMeasCol(i) & "$"
    YValues = YValues & CStr(PrepDataStart) & ":$" & DSMeasCol(i) & "$"
    YValues = YValues & CStr(PrepDataEnd(i))

    ' Construct a string like ='Data'!$C$19:$C$38
    XValues = "='" & PrepSheetName & "'!$" & DSCmdCol(i) & "$"
    XValues = XValues & CStr(PrepDataStart) & ":$" & DSCmdCol(i) & "$"
    XValues = XValues & CStr(PrepDataEnd(i))

    ' Give the chart values
    ActiveChart.SeriesCollection(i).Values = YValues
    ActiveChart.SeriesCollection(i).XValues = XValues

    ' Create a trendline for the chart
    Dim TL As Trendline
    Set TL = ActiveChart.SeriesCollection(i).Trendlines.Add(Type:=xlLinear, Forward:=0, _
        Backward:=0, DisplayEquation:=1, DisplayRSquared:=0, _
        Name:="LC" & CStr(i) & " Trend")
    TL.DisplayEquation = True
    TL.DisplayRSquared = False

    ' Exract the trendline formula
    Dim Eqn As String
    TL.Select
    'MsgBox "Trendline Text: " + TL.DataLabel.Text

    Eqn = Split(TL.DataLabel.Text, "=")(1)
    ' ... and place it on the coversheet ...
    CoverSheet.Cells(CSResults(i), CSFitSlope).Value = Split(Eqn, "x")(0)
    CoverSheet.Cells(CSResults(i), CSFitOffset).Value = Split(Eqn, "x")(1)

    'Find the RSquared of the Trendline
    TL.DisplayEquation = False
    TL.DisplayRSquared = True
    TL.Select
    Eqn = TL.DataLabel.Text
    Eqn = Split(TL.DataLabel.Text, "=")(1)

    ' ... and place it on the coversheet ...
    'CoverSheet.Cells(CSResults(i), CSFitCorr).Value = Eqn

Next i

Если я попытаюсь запустить диагностический код для анализа текста метки dredline после первого запуска макроса, он увидит текст. Однако при выполнении диагностического кода я не могу изменить тип отображаемых данных линии тренда. Например, я ожидаю, что если я запущу:

 TL.DisplayEquation = True
 TL.DisplayRSquared = False
 MsgBox "Should show Equation."
 TL.DisplayEquation = False
 TL.DisplayRSquared = True
 MsgBox "Should show R^2."

... что я должен видеть, что метка данных линии тренда показывает уравнение только тогда, когда появляется первое окно сообщения, а второе окно сообщения должно заморозить экран, так что отображается только R ^ 2. Однако, когда я запускаю такой код, я обнаруживаю, что мое предположение неверно: метка данных остается замороженной до завершения макроса, даже с ScreenUpdating = True Кажется, что мои диаграммы не обновляются при запуске макроса, а обновляются только при конец.

Я пытался поместить DoEvents и Application.Recalculate после создания линии тренда, но это только приводит к сбою моего Excel. Добавление Application.ScreenUpdating = True или False, похоже, не помогает, либо ...

Есть идеи? Я в полной растерянности ...

Пожалуйста, дайте мне знать, если я не предоставил достаточно информации или что-то неясно.

Спасибо!

1 Ответ

0 голосов
/ 18 сентября 2018

Я закончил, используя предложение Чиллина, и использовал LinEst.Кажется, что это ошибка в том, как Excel обрабатывает метки данных Chart во время выполнения макроса, согласно этой теме .Подводя итог, мой код почти такой же, как указано выше, но со следующим изменением с использованием LinEst вместо анализа DataLabel Trenline:

' Create a trendline for the chart
Dim TL As Trendline
Set TL = ActiveChart.SeriesCollection(i).Trendlines.Add(Type:=xlLinear, Forward:=0, _
Backward:=0, DisplayEquation:=1, DisplayRSquared:=0, _
Name:="LC" & CStr(i) & " Trend")      

' Generate the trendline constants and place them on the summary sheet
CoverSheet.Cells(CSResults(i), CSFitSlope).Value = "=INDEX(LINEST(" & YValues & "," & XValues & ",TRUE, TRUE), 1)"
CoverSheet.Cells(CSResults(i), CSFitOffset).Value = "=INDEX(LINEST(" & YValues & "," & XValues & ",TRUE, TRUE), 1,2)"
CoverSheet.Cells(CSResults(i), CSFitCorr).Value = "=INDEX(LINEST(" & YValues & "," & XValues & ",TRUE, TRUE), 3)"
...