我正在尝试将日志趋势线从图表复制并粘贴到单元格中。样本方程如下:y = 0.0083ln(x)-0.0902。当我为不同的数据点运行回归时,方程式不断变化。因此,我希望宏将方程式复制并粘贴到单元格中。当等式改变时,以下代码不起作用(即,它第一次发生,但之后,我得到一个错误)。代码如下:
ActiveChart.FullSeriesCollection(1).Trendlines(1).DataLabel.Select
Selection.Copy
Range("C35").Select
ActiveSheet.Paste
Excel显示错误在“ActiveSheet.Paste”上。我真的很感激如何解决这个问题的一些指导。
您可以使用.DataLabel.Formula
或.DataLabel.Text
使用VBA写出公式。我还提供了一个完整性的表单方法。
下面的优点是向您展示如何开始检查趋势类型是您想要的趋势类型,并作为扩展以循环其他系列的基础(如果需要)。
更新 -
1)使用Worksheet_Change事件:
您可以将此绑定到Worksheet_Change
事件,其中目标是您的Y范围,但设置它只会在每次更新时触发一次
2)您可以将宏的执行与控件绑定。
例如。窗体控件中的命令按钮最简单。功能区>开发人员选项卡>控件> form controls。通常,比ActiveX对象问题少。然后将该命令按钮与宏GetTrendlineEquation
关联(右键单击按钮,关联应该这样做)。然后按下按钮将执行宏。
如果你真的想确定你得到正确的等式,或者得到多个,你可以迭代图表,图表系列和趋势线。
在主代码之后我包括一个检查目标序列趋势类型是对数的例子。
代码版本将方程式写出到工作表1的A列中的下一个可用行。
Public Sub GetTrendLineEquation()
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1") ' change as appropriate
Dim targetChart As Chart
Set targetChart = ws.ChartObjects("Chart 1").Chart ' change as required
Dim targetTrend As Trendline
Set targetTrend = targetChart.SeriesCollection(1).Trendlines(1) ' change as appropriate
Dim lastRow As Long
Dim nextRow As Long
lastRow = ws.Cells(ws.Rows.Count,"A").End(xlUP).Row
If lastRow = 1 Then
nextRow = 1
Else
nextRow = lastRow + 1
End If
ws.Range("A"& nextRow) = targetTrend.DataLabel.Formula
End Sub
检查趋势类型:
For Each targetTrend In myChart.SeriesCollection(1).TrendLines
If targetTrend.Type = -4133 Then Msgbox "Log"
' If Left$(targetTrend.Name,3) = "Log" Then Msgbox "Log"
Next targetTrend
趋势类型的枚举可以在here中找到,或者通过对象浏览器通过类XLTrendlineType
的成员找到。
循环多个系列得到趋势公式:
Dim currentSeries As Long
For currentSeries = 1 To myChartSeriesCollection.Count
For Each targetTrend In myChart.SeriesCollection(1).TrendLines
If targetTrend.Type = -4133 Then Debug.Print targetTrend.DataLabel.Text
Next targetTrend
Next currentSeries
表格中的公式:
在我看到Missing values in MS Excel LINEST, TREND, LOGEST and GROWTH functions之前,我已经使用了辅助列
我在辅助列中使用的公式是:
=IF(OR(ISNA(D10),ISBLANK(D10)),0,1)
这将查看您的Y值,如果#N / A或其他为空,则返回0.然后将原始Y值乘以此值,以便您有一个LINEST可以绘制的新的完全填充的Y系列。
使用来自@satesh的模板,我获得了斜率和截距计算,并将整个事物插入到一个连接的字符串中,该字符串在单元格中显示公式,如下所示:
相当简单但可以将相同的原则应用于您的数据?
使用Text
对象的DataLabel
属性
Range("C35").Value = ActiveChart.FullSeriesCollection(1).Trendlines(1).DataLabel.Text