检查Excel对象是否不是主题

时间:2018-11-26 10:32:24

标签: excel vba

如果我从Excel FormatCondition中读取了边框的ThemeColor,它将给我一个错误

  

“应用程序定义的错误或对象定义的错误”

在监视列表中,或

  

运行时错误5:“无效的过程调用或参数”

在立即窗口中阅读时。有时它只是Null。当设置了有效边界时,似乎会出现该错误。

https://docs.microsoft.com/en-us/office/vba/api/excel.border.themecolor中我得到以下内容

  

尝试访问其颜色不是该颜色的对象的主题颜色   当前为主题将导致无效的请求运行时错误。

我正在检查的其他对象也有类似的问题,例如.Interior.ThemeColor

如何确定某个对象是否为主题-是否有官方的方法?我是否可以使用存在错误的事实来推断出该错误不是主题,还是可以由于其他原因而出现错误?

一些示例代码:

Dim WS As Worksheet
Dim fcs As FormatConditions
Dim cf1 As FormatCondition
Dim b1 As Border

Set WS = ActiveSheet
Set fcs = WS.Cells.FormatConditions
Set cf1 = fcs.item(1)
Set b1 = cf1.Borders.item(xlEdgeBottom)

Dim tc As Variant
tc = b1.ThemeColor            'error
tc = cf1.Interior.ThemeColor  'error

要重现,请使用条件格式规则创建Excel工作表。我使用的规则使用公式,例如= NOT(ISNUMBER(C9)),并在单元格的底部加上单元格填充颜色,有时还加边框,并覆盖了一系列单元格,例如$ C $ 8:$ C $ 39

1 个答案:

答案 0 :(得分:0)

不直接回答单元格是否为主题,而是直接在上下文中处理 Run-time error '5': Invalid procedure call or argument 以解决潜在的以典型的 error handling in VBA 方式呈现主题对象。所以而不是仅仅

something.ThemeColor   ' access any theme-property

你可以在你的 Sub 中遵循这个基本结构

Sub ThemeTest()
    Dim isThemed As Boolean: isThemed = True
    On Error GoTo notThemedError
    something.ThemeColor   ' access any theme-property; jumps to notThemedError on error
    On Error GoTo 0        ' reset error handling to normal
    If isThemed Then do_something Else do_other
    ... more code
    Exit Sub

notThemedError:
    ' Optionally re-raise the error if it's not Error 5
    If Not Err.Number = 5 Then Err.Raise Err.Number, Err.Source, Err.Description
    isThemed = False
    Resume Next  ' go on after where the error was raised
End Sub