Как сделать код VBA совместимым для Office 2010 - 64-битная версия и более ранние версии Office - PullRequest
4 голосов
/ 23 ноября 2010

Я обнаружил проблему с вызовом функции ниже, когда мы мигрировали в офисную 2010-64 битную версию.

Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Согласно информации, доступной по ссылке http://msdn.microsoft.com/en-us/library/ee691831.aspx.Я изменил вышеупомянутый вызов, как показано ниже, и он работал нормально на 64-битной версии Office 2010.

Private Declare PtrSafe Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Проблема в том, что мне нужно сделать такой же вызов, чтобы работать и на старых офисных версиях, и он выдаетошибка компиляции на старых версиях.

Кто-нибудь знает, как сделать этот вызов работающим для Office 2010 и более старых версий Office.

Ответы [ 2 ]

10 голосов
/ 23 ноября 2010

Как говорится в статье MSDN, используйте условную компиляцию: у меня она хорошо работает в Excel 97 - Excel 2010, 32-разрядная и 64-разрядная.

#If VBA7 Then
Private Declare PtrSafe Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
#Else
Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
#End if
1 голос
/ 07 ноября 2018

Я нахожу использование этой постоянной компилятора VBA7 по всему Интернету в отношении 64-битной совместимости с Office, но вопреки тому, что часто говорят, эта константа компилятора обнаруживает установки Office с использованием VBA7, например Office 2010 и выше., а не 64-битный офис.Если вам нужно определить, используете ли вы 64-разрядную версию приложения Office, вам нужно использовать Win64 константу!

Попробуйте это из 32- и 64-разрядных версий.Office, и вы можете понять, что я имею в виду:

Sub DemoCompilerConstants()

    #If VBA7 Then
        MsgBox "VBA7"
    #Else
        MsgBox "Not VBA7"
    #End If

    #If Win64 Then
        MsgBox "Win64"
    #Else
        MsgBox "NOT Win64"
    #End If

End Sub

Спасибо Стиву Риндсбергу за то, что я прямо сказал об этом!Стив также добавил:

Win64 фактически сообщает вам, является ли ваша версия приложения Office 64-разрядной.Если вам требуется поддержка более старых версий Office, вы можете захотеть объединить это с проверкой VBA7 для специальных версий вашего приложения Office, которые не будут понимать новые директивы компилятора.Но если ваш код не работает в 32-битной версии приложения Office, это может быть потому, что он попадает в директиву компилятора, обнаруживает, что да, у него есть VBA7, а затем пытается выполнить вызов 64-битного API, который не будетFly, потому что это 32-битный Office.

Так что это должен быть правильный подход для объединения VBA7 и 64-битной совместимости с Office:

#If VBA7 Then
  #If Win64 Then ' Declare using PtrSafe for Office 64 bit
    Declare PtrSafe Function ....
  #Else ' Declare for Office 32 bit
    Declare Function ....
  #End If
#Else ' Declare for Office 32 bit
  Declare Function ....
#End If
...