7
votes

Comment faire du code VBA compatible pour Office 2010 - version 64 bits et versions de bureau plus anciennes

J'ai observé un problème avec un appel de fonction ci-dessous lorsque nous avons migré vers la version Bit Office 2010-64. XXX PRE>

Selon les informations disponibles sur http://msdn.microsoft.com/en-us/library/ee691831.aspx lien. J'ai changé ci-dessus appel comme ci-dessous et cela fonctionne bien sur la version Office 2010 64 bits. P>

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


4 commentaires

Pour votre information: Microsoft recommande de l'utilisation de la version 64 bits de la raison de la compatibilité. Vous ne devez l'utiliser que si vous devez traiter des documents extrêmement volumineux (feuilles de calcul Excel).


@ 0xa3 qui ne semble pas être une citation exacte: TechNet.microsoft.com/ EN-US / Bibliothèque / EE681792.ASPX , YESNO?


Constantes du compilateur conditionnel: Stackoverflow.com/questions/3426693 / Tempvar-and-Access-2003 / ... #if version = "14.0" Puis déclarez privé <...>


@Remou: Merci d'avoir ajouté ce lien.


4 Réponses :


14
votes

Comme l'indique l'article MSDN, utilisez la compilation conditionnelle: cela fonctionne bien pour moi dans Excel 97 via Excel 2010 32 bits et 64 bits.

#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


4 commentaires

Merci Charles, j'ai essayé cela à ma fin, mais sur un bureau 32 bits, il lance une erreur de compilation pour Ptrsafe indiquant "la fonction ou le sous-titre n'est pas défini". Pouvez-vous s'il vous plaît laissez-moi savoir si je manque quelque chose. Merci d'avance.


Je viens de le tester sur Excel 2003: compile bien.


La seule chose à laquelle je puisse penser, c'est que je me développe toujours sous 32 bits, puis de tester en 64: essayez d'exporter les modules de code et de réimporter en 32 bits Excel


Cela fonctionne maintenant à ma fin. La seule chose que j'ai faite pour vous rendre au travail a été changée pour ignorer les erreurs syntaxiques. Merci pour tous les pointeurs Charles.



3
votes

Je trouve l'utilisation de cette constante de compilateur VBA7 sur Internet par rapport à la compatibilité Office 64 bits mais contrairement à ce qui est souvent dit, cette constante de compilateur détecte les installations de bureau à l'aide de VBA7 E.G. Office 2010, pas de bureau 64 bits. Confondant, si vous devez déterminer si vous utilisez la version 64 bits de l'application Office, vous devez utiliser la constante Win64 constante!

Essayez ceci sur des versions de 32 et 64 bits de bureau Et vous pouvez voir ce que je veux dire: xxx

grâce à Steve Rindsberg < / a> pour me mettre directement sur celui-ci! Steve a également ajouté:

Win64 vous dit réellement si votre version de votre bureau L'application est 64 bits. Si vous devez soutenir les anciennes versions de bureau, Vous voudrez peut-être combiner cela avec un chèque VBA7 à un cas particulier versions de votre application de bureau qui ne comprendra pas le nouveau compilateur Directives. Mais si votre code échoue sur une version 32 bits de la Application de bureau, il se peut que ce soit parce qu'il frappe votre compilateur directive, constatant que oui, il est devenu VBA7, puis essayant d'exécuter le Appel d'API 64 bits, qui ne volera pas parce qu'il est un bureau 32 bits.

Cela devrait donc être la bonne approche pour combiner la compatibilité de bureau VBA7 et 64 bits: xxx



0
votes

raffiner l'excellente information / réponse de Jamie Garroch (qui explique comment la constante de compilateur VBA7 ne vous dit pas pour Bien sûr, si votre code est exécuté dans une application Office 64 bits), le #if code> de VBA Compiler peut gérer les opérateurs et code>.

Cela signifie que vous n'avez pas besoin répéter vos déclarations de fonction 32 bits. Vous pouvez simplement faire cela: P>

    #If VBA7 And Win64 Then ...
        '64 Bit Declarations: for example ...
        Private Declare PtrSafe Sub API_CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, source As Any, ByVal bytes As Long)
    #Else
        '32 Bit Declarations: for example ...
        Public Declare Sub API_CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, source As Any, ByVal bytes As Long)
    #End If


1 commentaires

Vous n'avez pas besoin d'utiliser le win64 constant pour déclarer correctement les fonctions d'API qui seront compatibles avec toutes les saveurs de bureau. Vous avez seulement besoin VBA7 pour cela. oui, win64 vous dit L'asile du bureau, mais vous n'avez pas besoin de ces informations pour déclarer correctement API.



0
votes

Si vous utilisez Office 2003, utilisez:

#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


0 commentaires