Excel 将图表中的R平方提取到单元格中

Excel 将图表中的R平方提取到单元格中,excel,excel-2010,excel-2013,vba,Excel,Excel 2010,Excel 2013,Vba,我有一个Excel散点图,有趋势线和R2值 如何将趋势线的R平方值返回到变量 我想: x = ActiveChart.SeriesCollection(1).Trendlines(1).Datalabel.Value 但这不起作用 我知道我们可以使用RSQ和LINEST直接计算,但当截距取零值时,图表和通过LINEST计算的结果不一样。我想记录图表中的值。您可以尝试: x = Val (Split(ActiveChart.SeriesCollection(1).Trendlines(1).Da

我有一个Excel散点图,有趋势线和R2值

如何将趋势线的R平方值返回到变量

我想:

x = ActiveChart.SeriesCollection(1).Trendlines(1).Datalabel.Value
但这不起作用

我知道我们可以使用RSQ和LINEST直接计算,但当截距取零值时,图表和通过LINEST计算的结果不一样。我想记录图表中的值。

您可以尝试:

x = Val (Split(ActiveChart.SeriesCollection(1).Trendlines(1).DataLabel.Text, "=")(1))
如果公式也显示,则使用第三个元素(id 2)

要绝对确定该职位,您可以使用以下方法:

Public Function GetR2() As Single

    Dim sArray() As String

    sArray = Split(ActiveChart.SeriesCollection(1).Trendlines(1).DataLabel.Text, "=")

    GetR2 = CSng(sArray(UBound(sArray)))

End Function
如果您想坚持一条线,那么这在两种情况下都会起作用

x=Val(拆分(ActiveChart.SeriesCollection(1).趋势线(1).DataLabel.Text,“R²=”)(1))

此功能:

Dim iR2 As Long, iEqual As Long
Dim linearFitLabel As String
Dim strR2 As String
Dim r2 As Double

'Get the trendline label; may contain equation in addition to R²
linearFitLabel = ActiveChart.SeriesCollection(1).Trendlines(1).DataLabel.Text

iR2 = InStr(linearFitLabel, "R²") ' find string "R²"
iEqual = InStr(iR2, linearFitLabel, "=") ' find equal sign after that
r2 = CDbl(Trim(Mid(linearFitLabel, iEqual + 1))) ' convert everything after = into a number
MsgBox "R² displayed on chart: " & r2

但是,请注意,返回的值将取决于图表中显示的R²值的数字格式。所以你不会得到R²的实际值,只是为了显示的目的而四舍五入到某个精度


其他信息

为了更清楚,我可能想从头开始计算R²。可以写成Excel公式:

=1-SUMPRODUCT((B3:B10-(A3:A10*INDEX(LINEST(B3:B10,A3:A10,NOT($D$4)),1)+INDEX(LINEST(B3:B10,A3:A10,NOT($D$4)),2)))^2)/SUMPRODUCT((B3:B10-AVERAGE(B3:B10))^2)
无论线性拟合截距是否设置为零(单元格D4),此选项仍然有效:

或否:


只要稍加努力,这个Excel公式就可以重新编写为VBA

这是什么样的趋势线?只有线性趋势线这是一个很好的尝试,但应该指出这一点。我想我明白你的意思了。如果公式也显示出来,那么使用拆分后的第三个元素项,如下所示:
x=Val(拆分(ActiveChart.SeriesCollection(1).Trendlines(1).DataLabel.Text,“=”)(2))
我已将其添加到我的答案中。谢谢你的加入
=1-SUMPRODUCT((B3:B10-(A3:A10*INDEX(LINEST(B3:B10,A3:A10,NOT($D$4)),1)+INDEX(LINEST(B3:B10,A3:A10,NOT($D$4)),2)))^2)/SUMPRODUCT((B3:B10-AVERAGE(B3:B10))^2)