检查VBA中是否存在趋势线

4
我有一张表格里面有一个图表。我需要插入一个按钮来切换趋势线的开关。所以,首先需要检查是否存在趋势线。听起来很简单,但这让我非常头疼!!!
下面是我用来创建和格式化趋势线的代码:
Sub Trending() 

Sheets("Sheet1").ChartObjects(1).Activate
    ActiveChart.SeriesCollection(1).Trendlines.Add
    ActiveChart.SeriesCollection(1).Trendlines(1).Select
    With Selection
        .Type = xlPolynomial
        .Order = 3
        .Border.ColorIndex = 3
        .Border.Weight = xlMedium

    End With

End Sub

为了检查趋势线是否存在,我尝试了以下方法:

If Sheets("Sheet 1").ChartObjects(1).SeriesCollections(1).Trendlines(1).Count = 1 Then
    [Statement]
End If

但测试失败了。

我做错了什么?有没有一种不会出错的方法?

谢谢, Al


你尝试过使用 Trendlines.Count 而不是尝试使用 Trendlines(1) 进行索引吗? - Alex P
从VBA帮助中:使用Trendlines方法返回Trendlines集合。以下示例显示Chart1中第一系列的趋势线数量。 MsgBox Charts(1).SeriesCollection(1).Trendlines.Count - Alex P
我已经尝试过这个Remnant,但它显示“下标超出范围”,尽管我在工作表上确实有一个图表,并且其中有一条趋势线处于活动状态。真的很令人沮丧。 - Alaa Elwany
1
小问题,但是你的代码在SeriesCollection末尾有一个s,我想知道这是否是影响你的代码的拼写错误? - Alex P
1个回答

6
你的 If 语句有三个问题。如果你将语句分解为更小的部分并单独测试每个部分,你会发现:
  1. 应该是 Sheet1 而不是 Sheet 1。没有空格。这导致了 "下标超出范围" 错误。
  2. SeriesCollection 属性适用于 Chart 对象,而不是 ChartObject 对象。是的,我知道这个愚蠢的 Excel 术语很令人困惑。总之,你需要使用 ChartObjects(1).Chart.SeriesCollection(1) 而不是 ChartObjects(1).SeriesCollection(1)
  3. Trendlines(1) 返回一个 Trendline 对象,它不可计数。你要计算趋势线集合中的项目数,即 Trendlines.Count 而不是 Trendlines(1).Count

总之,写法如下:

If Sheets("Sheet1").ChartObjects(1).Chart _
    .SeriesCollection(1).Trendlines.Count > 1 Then
    MsgBox "there is exactly one trendline"
End If

注意:仅当趋势线计数恰好为一时才有效。如果可能有多个,请考虑使用>=替换=

Jean-Francois,你的评论非常有用,对于解决这个问题和我的VBA初学者知识总体来说都很有帮助。非常感谢! - Alaa Elwany
抱歉Jean-Francois,我是Stackoverflow的新手。您所说的upvoting是指将左侧的数字设置为“2”,而不是“1”(这是一种得分吗?)。如果是这样,我刚刚做到了:-)请告诉我这是否是您所指的。您解释得很好,应该得到upvote。 - Alaa Elwany

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接