Erreur macro 32 -> 64 bits

Bonjour,

J'ai codé un outil automatisé pour réaliser des devis à un ami sur mon Excel 32 bits.

Cependant, celui-ci a une version d'Excel en 64 bits.

J'ai tenté d'intégrer la notion PtrSafe au moment de déclarer ma fonction or ceci n'a pas fonctionner et lui affiche le message suivant : "Le code contenu dans ce projet doit être mis à jour pour pouvoir être utilisé sur les systèmes 64 bits. Vérifiez et mettez à jour les instructions Declare, puis marquez-les avec l'attribut PtrSafe."

Etant sur une version 32 bits, je n'ai pas ce type de blocage et je ne parviens donc pas à identifier l'élement défaillant.

Voici ma déclaration de fonction :

Option Explicit

Private Declare Function PtrSafe FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal

lpWindowName As String) As Long

Private Declare Function PtrSafe GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal

nIndex As Long) As Long

Private Declare Function PtrSafe SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal

nIndex As Long, ByVal dwNewLong As Long) As Long

Private Declare Function PtrSafe DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long

Private DayLabel() As New lblClass, idx As Integer, m As Integer

Dim i

Dim LaDerniere

Help me please !

Salut Flo,

essaie comme ca

Option Explicit

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr

Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr

Public Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hWnd As LongPtr) As Long

Private DayLabel() As New lblClass, idx As Integer, m As Integer
Dim i
Dim LaDerniere

Bonjour,

Désolé pour la réponse tardive, j'étais en déplacement.

Merci de ton aide.

J'ai donc déployé la déclaration de variable suivante :

" Option Explicit

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr

Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr

Private Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hwnd As LongPtr) As Long

Private DayLabel() As New lblClass, idx As Integer, m As Integer

Dim i

Dim LaDerniere"

Hors, mon ami m'a envoyé le screen (ci-joint) lorsqu'il a souhaité activer la macro.

Avez-vous une idée de l'origine de ce défaut ?

Merci !

Bonne soirée

img 13041

Salut Flo,

il faut voir le code complet pour pouvoir trouver une solution

Bonne soirée

Possible en MP ?

Car je ne peux diffuser le contenu entier et tout dissocier sera un travail colossal

Possible en MP ?

Car je ne peux diffuser le contenu entier et tout dissocier sera un travail colossal

oui pas de soucis, le fichier complet

Bonjour Flo33400, m3ellem1, le forum,

Source:https://forum.excel-pratique.com/viewtopic.php?f=2&t=99189

donc deux modifications principales à faire :

ajouter PtrSafe juste après Declare

et les variables Long doivent être déclarées en LongPtr, mais pas le Long de la function...

Donc le dernier Long doit rester Long et non LongPtr.....

Cordialement,

Très bien, merci.

Dois-je appliquer cette modification à la ligne "GetWindow" et "SetWindow" aussi ?

Re,

J'ai été confronté au même problème ici:

https://forum.excel-pratique.com/viewtopic.php?p=826777#p826777

J'ai suivi les instructions de ce sujet https://forum.excel-pratique.com/viewtopic.php?f=2&t=99189 et il a été résolu,

Donc PtrSafe après chaque Declare et remplacer tes Long par LongPtr (sauf celui qui est en dernier !), donc non pour Getwindow et SetWindow.

Ça doit donner un code du genre:

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As LongPtr) As Long

Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As LongPtr, ByVal dwNewLong As LongPtr) As Long

Private Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hwnd As LongPtr) As Long

Cordialement,

Bonjour,

Je pense que tu peux laisser les deux formulations de déclaration 32bits et 64bits en

les indiquant en "Général"

de la facçon suivante :

#If VBA7 Or Win64 Then
'version pour 64bits
Declare PtrSafe Sub ……………………………... As LongPtr)

#Else
'version 32bits
Declare Sub ................................ As Long)

#End If

Ton fichier pourra alors fonctionner dans les deux versions en même temps.

Problème résolu ! Merci à tous 😉👏

Bonjour,

Un complément d'info pour un sujet récurrent...

Il ne s'agit pas de transformer tous les "Long" en "LongPtr", un peu au hasard, pour que cela fonctionne, ce serait une erreur!

à lire : la note dans ce doc : https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/longptr-data-type

LongPtr n’est pas un véritable type de données, car il est converti en Long dans les environnements 32 bits, ou en LongLong dans les environnements 64 bits. L’utilisation de LongPtr permet d’écrire du code portable exécutable à la fois dans les environnements 32 bits et 64 bits. Utilisez LongPtr pour les pointeurs et les handles.

Il convient donc de n'utiliser LongPtr que pour passer des données pour les pointeurs et les handles!

Rechercher des sujets similaires à "erreur macro bits"