我最近尝试编写Excel宏,我需要确定是否存在特定的工作表。我编写脚本的首选武器是Python,而我的VBA技能确实很差。因此,以良好的pythonic风格,我采用了更容易要求宽恕而不是权限的方法,并写了这样的东西:
Debug.Print MyWorkbook.Worksheets(TabName).Name ''Check for an index error
If Err.Number <> 0 Then
''Code to add the sheet to the workbook
这很有效,直到我试图消除print语句。我将第一行更改为:
MyWorkbook.Worksheets(TabName).Name
突然间我开始得到“对象不支持此属性或方法”错误。作为一名Python程序员,这令我感到惊讶,我一直在用Python做类似的事情。
我很好奇所以我做了一点阅读。我能够在Python中找到有关上述表达式语句的文档,但不能在VBA中找到。 VBA中根本不允许使用表达式语句吗?如果是这样,他们有没有理由呢?有谁知道我在哪里可以读到这个?
答案 0 :(得分:2)
简短的回答是“不”。 VBA一直都是必不可少的。通常,表达式不是合法的独立语句。您会注意到许多表达式甚至都不会“编译”:
'Won't "compile"
(42+99)
在您的具体示例中,还有更多内容。 VBA以您想要的方式看到此行上的MyWorkbook.Worksheets(TabName).Name
,作为返回值的表达式:
'Fine: gets value of `Name` property
Debug.Print MyWorkbook.Worksheets(TabName).Name
VBA在这一行看到相同的代码:
'Error: tries to call `Name` as method
MyWorkbook.Worksheets(TabName).Name
尝试在工作表对象上调用(不存在的)Name
方法。 (Name
是Worksheet
的属性。)因此出现错误消息,现在您知道发生了什么更有意义。
至于阅读更多相关信息,你可以在这里看到:
https://stackoverflow.com/a/1545024/58845
有一个VBA语言规范的链接,虽然我没有检查,但可能更准确地涵盖了这类事情:
http://msdn.microsoft.com/en-us/library/dd361851%28PROT.10%29.aspx
答案 1 :(得分:0)
在VBA中,如果没有实际使用它,你就无法写一行变量。就像@Marc说的那样,你只需要将名称分配给另一个变量。
此外,通常我使用以下功能来检查:
Public Function CheckWorksheetExists(wsNams As String) As Boolean
Dim ws As Worksheet
On Error Resume Next
Set ws = Thisworkbook.Worksheets(wsName)
CheckWorksheetExists = err.Number = 0
End Function