VBA. Вызов функций WinAPI в зависимости от версий Windows и MS Office.
В MS Office 2010 встроен VBA (VBA7), в отличие от ранних версий Excel, требуется предусмотреть в коде макросов различных варианты вызова API-функций Windows, чтобы они сохранили свою работоспособность при работе в любой версии MS Office.
Кроме того, в 64-битных Windows синтаксис вызова функций WinAPI отличается от 32-битных систем.
В общем случае, код, корректно работающий в 64-битной Windows, будет выглядеть так:
If VBA7 Then
Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA"_
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Else
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA"_
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
End If
Рекомендуется использовать операторы Declare с ключевым словом PtrSafe.(<Ключевое слово> PtrSafe) Для правильной работы операторов Declare с ключевым словом PtrSafe в среде разработки VBA7 на 32-разрядных и 64-разрядных платформах необходимо обновить все типы данных в операторе Declare (параметры и возвращаемые значения), предполагающие хранение 64-разрядных величин, чтобы можно было использовать тип LongLong для 64-разрядных целых чисел или тип LongPtr для указателей и дескрипторов. Чтобы обеспечить обратную совместимость с VBA 6 и более ранними версиями, используйте следующую конструкцию.
#If Vba7 Then
Declare PtrSafe Sub...
#Else
Declare Sub...
#EndIf