使用IF和OLEObjects的问题

时间:2017-03-06 10:14:35

标签: excel vba excel-vba if-statement

If ActiveSheet.OLEObjects("CBClutch").TextFrame.Characters.Text = "Q1" - 自行正常工作。

If ActiveSheet.Shapes("CMDFilter").TextFrame.Characters.Text = "Filter" - 也可以自行正常工作。

当我运行下面的If语句时,我得到一个Run-time error '438'。我做错了什么?

If ActiveSheet.OLEObjects("CBClutch").TextFrame.Characters.Text = "Q1" And ActiveSheet.Shapes("CMDFilter").TextFrame.Characters.Text = "Filter" Then
    Range("B1608:L1609").Select
    Selection.AutoFilter
    ActiveSheet.Range("$B$1608:$L$1714").AutoFilter Field:=8, Criteria1:="<>"
    ActiveSheet.Shapes("CMDFilter").TextFrame.Characters.Text = "Un-Filter"
    Range("A1604").Select
Else
    Range("B1608:L1609").Select
    Selection.AutoFilter
    Range("A1604").Select
    ActiveSheet.Shapes("CMDFilter").TextFrame.Characters.Text = "Filter"
End If

2 个答案:

答案 0 :(得分:2)

编码时,尝试将变量分配给您打算稍后修改或测试的每种ShapeObject类型。它将帮助您编写“更干净”的代码,并找出可以修改的属性。

在下图中,我定义了Dim obj As OLEObject,之后我将其设为Set obj = ActiveSheet.OLEObjects("CBClutch")

所以稍后,当我有With obj语句时,我可以看到当我点击.此对象具有哪些属性时。从屏幕截图中可以看出,它没有TextFrame - 因此在稍后使用If进行检查时会返回错误。

enter image description here

答案 1 :(得分:0)

如果您可以找到工作表CodeName,则可以直接访问ActiveX控件:

If Sheet1.CBClutch = "Q1" And Sheet1.CMDFilter.Caption = "Filter" Then
    Sheet1.Range("B1608:L1714").AutoFilter 8, "<>"
    Sheet1.CMDFilter.Caption = "Un-Filter"
Else
    Sheet1.AutoFilterMode = False
    Sheet1.CMDFilter.Caption = "Filter"
End If