J'ai observé un problème avec un appel de fonction ci-dessous lorsque nous avons migré vers la version Bit Office 2010-64. 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 Réponses :
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
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.
Je trouve l'utilisation de cette Essayez ceci sur des versions de 32 et 64 bits de bureau Et vous pouvez voir ce que je veux dire: p>
Merci pour les heads-up (Re les deux constantes du compilateur) Jamie. La directive #IF de FYI VBA est capable d'évaluer plusieurs constantes. Vous pouvez donc réécrire ce que vous avez écrit comme #if vba7 et win64 alors ... (version 64 bits) ... #elle ... (32 bits Version) ... #endif code>
Vous n'avez pas besoin d'utiliser le win64 code> constant pour déclarer correctement les fonctions d'API qui seront compatibles avec toutes les saveurs de bureau. Vous avez seulement besoin
VBA7 code> pour cela.
oui, win64 code> vous dit L'asile du bureau, mais vous n'avez pas besoin de ces informations pour déclarer correctement API.
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 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 code> de VBA Compiler peut gérer les opérateurs
et code>.
#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
Vous n'avez pas besoin d'utiliser le win64 code> constant pour déclarer correctement les fonctions d'API qui seront compatibles avec toutes les saveurs de bureau. Vous avez seulement besoin
VBA7 code> pour cela.
oui, win64 code> vous dit L'asile du bureau, mais vous n'avez pas besoin de ces informations pour déclarer correctement API.
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
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é <...> code>
@Remou: Merci d'avoir ajouté ce lien.