Выражения высказывания в VBA
Недавно я пытался написать макрос Excel, и мне нужно было определить, существует ли конкретный лист. Моим оружием выбора для написания скриптов является 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
Это работало отлично, пока я не попытался устранить заявление на печать. Я изменил первую строку на:
MyWorkbook.Worksheets(TabName).Name
И вдруг я начал получать сообщения "Объект не поддерживает это свойство или метод". Как программист на Python это удивило меня, я все время делаю подобные вещи на Python.
Мне было любопытно, поэтому я немного почитал. Мне удалось найти документацию по выражениям, подобным приведенным выше, в Python, но не в VBA. Выражения выражения просто не разрешены в VBA? Если так, есть ли причина, почему они не? Кто-нибудь знает, где я могу прочитать об этом?
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
.) Таким образом, сообщение об ошибке, которое имеет больше смысла теперь, когда вы знаете, что происходит.
Что касается чтения об этом, вы можете увидеть здесь:
/questions/29623068/resurs-dokumentatsii-dlya-razrabotchikov-office-vba/29623082#29623082
Там есть ссылка на спецификацию языка VBA, которая, по-видимому, более точно описывает подобные вещи, хотя я не проверял:
http://msdn.microsoft.com/en-us/library/dd361851%28PROT.10%29.aspx
В 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