Этот вопрос предназначен для увеличения Скрытого вопроса о Функциях в Скрытых функциях VBA
Каковы самые большие, наиболее распространенные, или самые раздражающие ловушки VBA?
Перечислите что-либо, что могло бы быть описано как
Поскольку я некоторое время писал VB.net, для меня всегда было проблемой ставить префиксы строк назначения объектов с помощью Set
, например
Dim d as Object
Set D = CreateObject("SomethingUseful")
вместо просто
D = CreateObject("SomethingUseful")
, что IDE не будет жаловаться, но вы получите ошибку времени выполнения (ссылка на объект не установлена).
Но это в основном разница между VB.Net/VB6, а не особенно с VBA.
Весь язык?
Эх, я буду конкретен: тот факт, что:
x = f (y)
f (y)
fy
Call f (y)
Все они имеют слегка разную семантику, в зависимости от того, является ли f
функцией
или Sub
и является ли y
ByRef
или ByVal
.
То есть, если f
является функцией:
x = f (y)
делает то, что вы ожидаете f (y)
вызывает f
и отбросить возвращаемое значение, но если y
равно ByRef
, оно будет передано ByVal
как особый случай fy
- это синтаксическая ошибка Вызов f (y)
выполняется так же, как f (y)
выше, но без предупреждения ByVal
С другой стороны, если f
- это Sub
:
f (y)
- синтаксическая ошибка fy
верна Вызов f (y)
- это синтаксическая ошибка Ура!
Для любых вызовов API в 64-битной системе или в Office 2010 x64 вам придется переписать свой код. Вы все еще можете записать его в более ранних версиях VBA и для более ранних версий VBA, но вам необходимо использовать переменные условной компиляции VBA7 и / или Win64. Например:
#If VBA7 Then
Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#Else
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If
Вот статья об этом http://msdn.microsoft.com/en-us/library/ee691831 (office.14) .aspx