首页 > 解决方案 > 将系列趋势线方程获取到形状文本框

问题描述

我试图从图表中的第一个系列中获取趋势线方程到放置在工作表其他位置的形状文本框 - 但是,当我逐行遍历代码时,我只能让文本框正确填充- 在运行时它没有效果:

For Each chtObj In ActiveSheet.ChartObjects

    Set cht = chtObj.Chart

    For Each srs In chtObj.Chart.SeriesCollection
        srs.Trendlines(1).DisplayEquation = True 'Display the labels to get the value
        ThisWorkbook.Worksheets("MyDataSheet").Shapes(slopetextboxes(k)).TextFrame.Characters.Text = srs.Trendlines(1).DataLabel.Text
        srs.Trendlines(1).DisplayEquation = False 'Turn it back off
        Exit For
    Next srs

    k = k + 1 ' for the slope textboxes

Next chtObj

请注意,这slopetextboxes是一个包含 ~6 个形状文本框名称的数组。

据我所知,没有办法在不停止显示的情况下获取趋势线数据标签。我试过先将它存储在一个字符串中DoEvents,然后Application.ScreenUpdating重新打开,一切都无济于事。我被难住了。

编辑:似乎通过放置DoEvents.DisplayEquation = True我能够正确填充我的一些形状,但不是全部。似乎仍然是某种运行时问题。

赏金编辑:我已经开始使用一个公式来抓取斜坡,并在数据本身中运行,但我仍然不明白为什么我无法.DataLabel.Text在运行时抓取图表。我可以在单步执行时抓住它,而不是在运行时。它似乎只是采用 PREVIOUS 系列斜率并将其放置在形状中(或单元格,甚至目的地在哪里都没有关系)。DoEvents放置在不同的位置会产生不同的结果,所以一定是发生了什么。

标签: vbaexcel

解决方案


更新以更好地理解错误。这适用于我在 excel 2016 中对源数据进行多次更改(因此斜率)

我试过 myChart.refresh - 没用。我尝试删除然后重新添加整个趋势线,也没有用。

这适用于除第一种情况之外的所有情况。第一种情况需要打两次。与 .select 相同

如果您尝试删除趋势线,即使在将其文本分配给文本框后,这也行不通

Option Explicit
Sub main()
Dim ws                                  As Worksheet
Dim txtbox                              As OLEObject
Dim chartObject                         As chartObject
Dim myChart                             As chart
Dim myChartSeriesCol                    As SeriesCollection
Dim myChartSeries                       As Series
Dim myChartTrendLines                   As Trendlines
Dim myTrendLine                         As Trendline

    Set ws = Sheets("MyDataSheet")
    Set txtbox = ws.OLEObjects("TextBox1")

    For Each chartObject In ws.ChartObjects
        Set myChart = chartObject.chart
        Set myChartSeriesCol = myChart.SeriesCollection
        Set myChartSeries = myChartSeriesCol(1)
        Set myChartTrendLines = myChartSeries.Trendlines

        With myChartTrendLines
            If .Count = 0 Then
                .Add
            End If
        End With

        Set myTrendLine = myChartTrendLines.Item(1)

        With myTrendLine
            .DisplayEquation = True
            txtbox.Object.Text = .DataLabel.Text
        End With
     Next chartObject
End Sub

在此处输入图像描述

在此处输入图像描述


推荐阅读