2012-04-18 128 views
2

我最近试图编写一个Excel宏,而且我需要确定一个特定的工作表是否存在。我选择脚本的武器是Python,而我的VBA技能肯定很差。因此,在良好的Python的风格,我拿了更容易请求原谅比许可办法,并写了这样的事情:VBA中的表达式语句

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

我认为这是比较容易请求原谅:)。 – 2012-04-18 03:48:17

+0

如果您将工作表名称分配给一个变量,这是否解决您的问题? – Marc 2012-04-18 04:02:43

+0

@Doug格兰西哈哈,很好的电话。错字! – Emma 2012-07-13 20:59:37

回答

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

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