2

我最近试图编写一个 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

在我试图消除打印语句之前,这很有效。我将第一行更改为:

MyWorkbook.Worksheets(TabName).Name

突然我开始收到“对象不支持此属性或方法”错误。作为一名 Python 程序员,这让我感到惊讶,我一直在 Python 中做类似的事情。

我很好奇,所以我做了一点阅读。我能够在 Python 中找到关于上述表达式语句的文档,但在 VBA 中找不到。VBA中根本不允许表达式语句吗?如果是这样,他们不这样做有什么原因吗?有谁知道我在哪里可以读到这个?

4

2 回答 2

2

最简洁的答案是不”。VBA 一直势在必行。通常,表达式不是合法的独立语句。您会注意到许多表达式甚至不会“编译”:

'Won't "compile"
(42+99)

在您的具体示例中,还有一些事情要做。VBAMyWorkbook.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

于 2012-04-18T12:26:29.637 回答
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
于 2012-04-18T22:10:48.637 回答