Erreur de compilation :incompatibilité de type après changement LongPtr 64b
Bonjour,
Je dois réouvrir sur mac 64b un fichier avec des forms et une programmation qui date de 2014. Tout à fonctionné à merveille depuis plusieurs années sur PC 32b. Aujourd'hui je dois l'ouvrir avec Excel 2016 sous Mac.
J'ai donc rajouté les PtrSafe et changé Long en LongPtr mais du coup j'ai une 'erreur de compilation : incompatibilité de type ' qui arrive sur la ligne : Private Sub UserForm_Initialize()
Voici le début de mon code. J'ai du faire une erreur avec les Ptr...
Public Marque
Private Declare PtrSafe Function FindWindowA Lib "User32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function EnableWindow Lib "User32" _
(ByVal hWnd As LongPtr, ByVal bEnable As LongPtr) As LongPtr
Private Declare PtrSafe Function GetWindowLongA Lib "User32" _
(ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLongA Lib "User32" _
(ByVal hWnd As LongPtr, ByVal nIndex As LongPtr, _
ByVal dwNewLong As LongPtr) As LongPtr
Sub AfficheEleves()
Eleves.Show
End Sub
Private Sub Annuler_Click()
Eleves.Hide
End Sub
Private Sub Nom_Change()
RechResp
End Sub
Private Sub UserForm_Activate()
EnableWindow FindWindowA("XLMAIN", Application.Caption), 1
Worksheets("Tableau").Activate
' Utilisation de l'option AddItem
Dim Arr() As String
Dim i As Integer, NbSheets As Integer
Dim Liste As Object
Dim NbNoms
Set Liste = Worksheets("Tableau").Cells(4, 2).Resize(Worksheets("Tableau").Cells(4, 2).CurrentRegion.Rows.Count - 1, 1)
NbNoms = Application.CountA(Range("B4").EntireColumn)
Eleves.Nom.Clear
ReDim Arr(1 To NbNoms)
For i = 1 To NbNoms
Arr(i) = Liste(i).Value
Eleves.Nom.AddItem Arr(i)
Next
Nom.ListIndex = 0
RechResp
End Sub
Private Sub UserForm_Initialize()
Dim hWnd As Long
hWnd = FindWindowA(vbNullString, Me.Caption)
SetWindowLongA hWnd, -16, GetWindowLongA(hWnd, -16) Or &H20000
End SubJe rappelle que ce code à fonctionné parfaitement pendant plusieurs années en 32b. Je n'ai changé que les Private Declare Function de début pour les adapter a 64b. Dois-je changer tous les Long du document en LongPtr? Je joins les fichiers utilisés pour mes 2 userforms. Le 1er (Eleves) est appelé par :
Sub Bouton1_QuandClic()
Eleves.Show
End SubEt c'est la que se produit l'erreur sur FindWindowA dans UserForm_Initialize.
Quelqu'un aurait-il une solution SVP
Merci d'avance
Bonjour,
Un premier jet... J'ai pas trop cherché de complications pour l'instant. C'est juste pour lancer le débat !
Je ne pense pas qu'il existe de :
Private Declare PtrSafe Function EnableWindow Lib "User32" _
(ByVal hWnd As LongPtr, ByVal bEnable As LongPtr) As LongPtrIl faut utiliser la version standard :
Private Declare Function EnableWindow Lib "User32" _
(ByVal hWnd As Long, ByVal bEnable As Long) As Long...ce qui ne me semble pas anormal pour cette fonction !
Voici la déclaration que j'ai trouvé pour :
Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtrIl me semble que cela entraine ipso facto la modification suivante dans ton UserForm_Initialize...
Dim hWnd As LongPtr(Les variables que tu utilises dans tes appels de fonctions doivent être de même type que celles déclarées dans l'API)
Après, bon... Euh... Suis pas du tout un spécialiste de ce genre de sport, Je serais même plutot le GéoCasseCou de service !
Voir si des spécialistes ont d'autres informations...
A+
oui je n'ai pas trouvé de Declare EnableWindow avec PtrSafe non plus. je vais essayer ta solution. Je fais un retour juste après.
Retour
Bon. Toujours le même probleme.
J'ai donc changé :
Private Declare Function EnableWindow Lib "User32" _
(ByVal hWnd As Long, ByVal bEnable As Long) As Longen :
Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtrce qui donne :
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) 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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As LongPtr) As LongPtr
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As LongPtr, ByVal dwNewLong As LongPtr) As LongPtret changé Dim hwnd As Long en Dim hwnd As LongPtr.
Ce qui me donne le message Erreur de compilation: sub ou fonction non définie toujours au même endroit qui bloque :
C'est FindWindowA qui pose problème pourtant la déclaration semble correcte
Private Sub UserForm_Initialize()
'EnableWindow FindWindow("Eleves", Application.Caption), True
Dim hwnd As LongPtr
hwnd = FindWindowA(vbNullString, Me.Caption)
SetWindowLongA hwnd, -16, GetWindowLongA(hwnd, -16) Or &H20000
End SubBon après ça... moi tes fichiers .txt : ils ne me passionnent pas plus que ça
Si tu me donnes un fichier avec le Userform je veux bien me pencher un peu bien que je n'ai pas de MAC, mébon : En l'état actuel je ne peux pas te dire grand chose...
Si !
Le Me.Caption me semble un peu téléphoné pour 2016 à plus forte raison sur MAC. Bien que Me.Caption semble à priori correct (un String)
Tu devrais le charger dans une variable typée String pour la passer en paramètre. Ça évitera à VBA de chercher à faire des auto-conversions hasardeuses...
Je pense aussi à autre chose : regarde dans VBA Outils > Références si tu n'en as pas une qui est déclarée manquante : Si c'est le cas tu sais ce qui te reste à faire !
[Edit]
Rien à voir avec le pb mais... Déclarer une variable public ne dispense pas de la typer :
Public Marque As String, Integer...etc...A+
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Vous n'utilisez pas le nom de la fonction relatif à votre code mais celui de l'Alias qui ne fait que le lien avec les DLL's de Windows et donc pas avec votre code VBA.
hwnd = FindWindowA(vbNullString, Me.Caption)ceci serait mieux :
hwnd = FindWindow(vbNullString, Me.Caption)Merci beaucoup. Je vaisessayer avec vos conseils. Désolée pour les fichiers .txt rébarbatifs ;-s