Я сделал этот код год или около того назад, и он работает нормально. Однако в последнее время это сломалось. Я предполагаю, что было обновление Windows, которое изменило способ работы макросов Excel с диаграммами. Соответствующие разделы моего кода выполняют следующее:
- Создание диаграммы рассеяния XY на «подготовительном» листе
- Создание линии тренда для каждого ряда данных на XY Scatter
- Анализирует каждый текст линии тренда для наклона и 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, похоже, не помогает, либо ...
Есть идеи? Я в полной растерянности ...
Пожалуйста, дайте мне знать, если я не предоставил достаточно информации или что-то неясно.
Спасибо!