我尝试将日志趋势线从图表复制并粘贴到单元格中。样本方程如下:y = 0.0083ln(x)-0.0902。当我为不同的数据点运行回归时,方程式不断变化。因此,我希望将宏复制并粘贴到单元格中。当等式改变时,以下代码不起作用(即,它第一次发生,但之后,我得到一个错误)。代码如下:
ActiveChart.FullSeriesCollection(1).Trendlines(1).DataLabel.Select
Selection.Copy
Range("C35").Select
ActiveSheet.Paste
Excel显示错误在" ActiveSheet.Paste"。我真的很感激如何解决这个问题的一些指导。
答案 0 :(得分:0)
您可以使用.DataLabel.Formula
或.DataLabel.Text
使用VBA写出公式。我还提供了一个完整性的表单方法。
以下优点是向您展示如何开始检查您想要的趋势类型,并在必要时作为扩展循环到其他系列的基础。
更新 -
1)使用Worksheet_Change事件:
您可以将此绑定到目标为Y范围的Worksheet_Change
事件,但将其设置为每次更新时触发一次
2)你可以将宏的执行与控件联系起来。
E.g。窗体控件中的命令按钮最简单。功能区>开发者标签>控件> 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,否则返回其他1.然后你将原来的Y值乘以这个,这样就可以得到LINEST可以绘制的新的完全填充的Y系列。
使用@satesh中的模板,我获得了斜率和截距计算,并将整个事物插入到一个连接的字符串中,该字符串显示了单元格中的公式,如下所示:
相当简单但可以将相同的原则应用于您的数据吗?
答案 1 :(得分:0)
使用Text
对象
DataLabel
属性
Range("C35").Value = ActiveChart.FullSeriesCollection(1).Trendlines(1).DataLabel.Text