Скрытые подводные камни VBA - PullRequest
5 голосов
/ 22 марта 2010

Этот вопрос предназначен для дополнения вопроса о скрытых функциях на Скрытые функции VBA

Какие самые большие, самые распространенные или самые раздражающие подводные камни VBA?

Пожалуйста, перечислите все, что может быть описано как

  • программист, остерегайтесь
  • Поведение VBA, которое требует болезненных и постоянных обходных путей.
  • Вещи, которые постоянно делают ошибки легко производить.
  • Вещи, которые смущают программистов
  • Нетрадиционный синтаксис или поведение по сравнению с другими языками и т. Д.

Ответы [ 3 ]

4 голосов
/ 23 марта 2010

Весь язык?

Эх, я буду конкретен: факт:

  • x = f(y)
  • f(y)
  • f y
  • Call f(y)

Все они имеют слегка различную семантику, в зависимости от того, f является Function или Sub и yByRef или ByVal.

То есть, если f является функцией:

  • x = f(y) делает то, что вы ожидаете
  • f(y) вызывает f и сбрасывает возвращаемое значение, но если y равно ByRef, оно будет передано ByVal как особый случай
  • f y - синтаксическая ошибка
  • Call f(y) делает как f(y) выше, но без ByVal предостережения

С другой стороны, если f является Sub:

  • f(y) - это синтаксическая ошибка
  • f y - правильная
  • Call f(y) - синтаксическая ошибка

Huzzah!

3 голосов
/ 23 марта 2010

Для любых вызовов API в 64-битной системе или с Office 2010 x64 вы должны переписать свой код.Вы все еще можете записать его в и более ранних версиях 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

3 голосов
/ 22 марта 2010

Поскольку я некоторое время писал VB.net, для меня всегда проблема ставить префикс строки назначения объекта с Set, например

Dim d as Object
Set D = CreateObject("SomethingUseful")

вместо

D = CreateObject("SomethingUseful")

, на который IDE не будет жаловаться, но вы получите ошибку времени выполнения (ссылка на объект не установлена).

Но это в основном отличие VB.Net/VB6, особенно VBA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...