VBA中的表达式语句

时间:2012-04-18 03:35:45

标签: python vba language-theory

我最近尝试编写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中根本不允许使用表达式语句吗?如果是这样,他们有没有理由呢?有谁知道我在哪里可以读到这个?

2 个答案:

答案 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方法。 (NameWorksheet的属性。)因此出现错误消息,现在您知道发生了什么更有意义。

至于阅读更多相关信息,你可以在这里看到:

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