2012-04-18 4 views
2

Недавно я пытался написать макрос Excel, и мне нужно было определить, существует ли конкретная рабочая таблица. Моим оружием выбора для сценариев является Python, и мои навыки VBA, по общему признанию, бедны. Так, в хорошем вещий стиле, я взял Легче попросить прощения, чем Permission подход и написал что-то вроде этого:Выражения выражения в 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 

Это работало замечательно, пока я не попытался устранить оператор печати. Я изменил первую строку:

MyWorkbook.Worksheets(TabName).Name 

И вдруг я начал получать «Объект не поддерживает это свойство или метод» ошибка. Как программист на Python это меня удивило, я все время делаю подобные вещи на Python.

Мне было любопытно, поэтому я немного прочитал. Мне удалось найти документацию о выражениях, подобных приведенным выше в Python, но не в VBA. Операторы выражения просто не разрешены в VBA? Если да, то есть причина, почему это не так? Кто-нибудь знает, где я могу это прочитать?

+2

Я думал, что это было легче просить прощения :). –

+0

Если вы присвоите имя рабочего листа переменной, решит ли это вашу проблему? – Marc

+0

@DougGlancy Ха-ха, хороший звонок. Опечатка! – Emma

ответ

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

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 
Смежные вопросы