2012-04-18 130 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