Compatibilité 64 et 32 bits

bonjour,

je viens vers vous car j’ai un problème de compatibilité avec le classeur, j’ai essayé ce code de compatibilité mais il ne fonctionne pas il se trouve dans le module 5

Private Declare Function CallNextHookEx Lib « user32 » (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetModuleHandle Lib « kernel32 » Alias « GetModuleHandleA » (ByVal lpModuleName As String) As Long
Private Declare Function SetWindowsHookEx Lib « user32 » Alias « SetWindowsHookExA » (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib « user32 » (ByVal hHook As Long) As Long
Private Declare Function SendDlgItemMessage Lib « user32 » Alias « SendDlgItemMessageA » _
(ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GetClassName Lib « user32 » Alias « GetClassNameA » (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetCurrentThreadId Lib « kernel32 » () As Long
Private hHook As Long

Dans le module 5cette partie du code qui se met en rouge je sais que c’est en partie parce que ce n’est pas en 32 bits mis j’ai besoin que ce classeur soit compatible que ça soit en 64 bits ou en 32 bits pour son utilisation je vous mets le classeur correspondant pouvez-vous me dire s’il vous plaît.

Gestion_des_Artistes_v00.1.32bits.xlsm (787,6 Ko)

Il ne faut pas confondre vba7 et win64 : vba7 existe en 32 et 64 bits
https://docs.microsoft.com/fr-fr/office/client-developer/shared/compatibility-between-the-32-bit-and-64-bit-versions-of-office

Bonjour à toi,

Merci de te pencher sur mon problème je comprends qu’il y a une erreur mais cette partie de code on me l’a donné et je n’y connais pas grand-chose dans ses déclarations cette partie là je n’avais encore pas découverte si tu t’y connais un peu plus que moi peux tu m’aider pour rendre cela compatible s’il te plaît en te remerciant d’avance

Il manque un A à ton code :

#If VBA7

Je te remercie ça a l’air de vouloir fonctionner je verrai protester avec la version 32 bits en te remerciant en tout cas de ton aide

Désolé cher amis je reviens encore vous embêter j’ai un ami qui a essayé sur une version 32 bits et voilà ce que ça mais comme message d’erreur à l’ouverture du classeur

Doc2.pdf (114,4 Ko)

On revient à ma première réponse …
En 32 bits avec Excel 2120 ou plus, l’erreur est normale : le LongLong n’existe pas en 32 bits :

  • il faut différencier VBA7 en win32 (avec des Long ou des LongPtr)
  • et VBA7 en win64 (avec des LongLong)

Je suis désolé de vous embêter mais je n’arrive pas à identifier ce qui est 32 et 64 bits dans tout ce code comme je vous l’ai dit je ne connais pas cette partie de programmation de code je l’ai récupéré en pensant que ça allait fonctionner.

Alors oui c’est peut-être façon parlé du bidouillage mais comme je ne m’y connais pas je viens vers vous pouvez-vous me dire dans le code suivant quelle ligne je dois changer s’il vous plaît.

#If VBA7 Then

Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongLong, ByVal ncode As LongLong, ByVal wParam As LongLong, lParam As Any) As LongLong
Private Declare PtrSafe Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As LongLong
Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As LongLong, ByVal lpfn As LongLong, ByVal hmod As LongLong, ByVal dwThreadId As LongLong) As LongLong
Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongLong) As LongLong
Private Declare PtrSafe Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" (ByVal hDlg As LongLong, ByVal nIDDlgItem As LongLong, ByVal wMsg As LongLong, ByVal wParam As LongLong, ByVal lParam As LongLong) As LongLong
Private Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As LongLong, ByVal lpClassName As String, ByVal nMaxCount As LongLong) As LongLong
Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As LongLong
#Else
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" _
(ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long

Public Function NewProc(ByVal lngCode As LongLong, ByVal wParam As LongLong, ByVal lParam As LongLong) As LongLong
Private hHook As LongLong
Private hHook As Long

Private Const EM_SETPASSWORDCHAR = &HCC
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5
Private Const HC_ACTION = 0

#End If

C’est pour ça que je vous ai passé le classeur si vous pouvez y regarder s’il vous plaît

Je n’ai pas Office 64 bits pour tester la première partie mais pour le 32 bits à partir de Office 2010 (VBA7 et pas win64) ça devrais ressembler à ça :

Option Explicit

#If vb7 Then
  #If Win64 Then
    Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongLong, ByVal nCode As LongLong, ByVal wParam As LongLong, lParam As Any) As LongLong
    Private Declare PtrSafe Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As LongLong
    Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As LongLong, ByVal lpFn As LongLong, ByVal hmod As LongLong, ByVal dwThreadId As LongLong) As LongLong
    Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongLong) As LongLong
    Private Declare PtrSafe Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" (ByVal hDlg As LongLong, ByVal nIDDlgItem As LongLong, ByVal wMsg As LongLong, ByVal wParam As LongLong, ByVal lParam As LongLong) As LongLong
    Private Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As LongLong, ByVal lpClassName As String, ByVal nMaxCount As LongLong) As LongLong
    Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As LongLong
    Private hHook As LongLong
  #Else
    Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, ByVal nCode As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
    Private Declare PtrSafe Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As LongPtr
    Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpFn As LongPtr, ByVal hmod As LongPtr, ByVal dwThreadId As Long) As LongPtr
    Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongPtr) As Long
    Private Declare PtrSafe Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" (ByVal hDlg As LongPtr, ByVal nIDDlgItem As Long, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
    Private Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As LongPtr, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
    Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As Long
    Private hHook As LongPtr
  #End If
#Else
  Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
  Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
  Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpFn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
  Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
  Private Declare Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
  Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
  Private hHook As Long
#End If

Private Const EM_SETPASSWORDCHAR = &HCC
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5
Private Const HC_ACTION = 0

Dim RetVal

Public Function NewProc(ByVal lngCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim strClassName As String, lngBuffer As LongLong
  If lngCode < HC_ACTION Then
    NewProc = CallNextHookEx(hHook, lngCode, wParam, lParam)
    Exit Function
  End If
  strClassName = String$(256, " ")
  lngBuffer = 255
  If lngCode = HCBT_ACTIVATE Then
    RetVal = GetClassName(wParam, strClassName, lngBuffer)
    If Left$(strClassName, RetVal) = "#32770" Then
      SendDlgItemMessage wParam, &H1324, EM_SETPASSWORDCHAR, Asc("*"), &H0
    End If
  End If
  CallNextHookEx hHook, lngCode, wParam, lParam
End Function

Public Function InputBoxDK(Prompt, Optional Title, Optional Default, Optional XPos, Optional YPos, Optional HelpFile, Optional Context) As String
Dim lngModHwnd As LongLong, lngThreadID As LongLong
  lngThreadID = GetCurrentThreadId
  lngModHwnd = GetModuleHandle(vbNullString)
  hHook = SetWindowsHookEx(WH_CBT, AddressOf NewProc, lngModHwnd, lngThreadID)
  InputBoxDK = InputBox(Prompt, Title, Default, XPos, YPos, HelpFile, Context)
  UnhookWindowsHookEx hHook
End Function

Ceci dit, le fichier que tu as joint est bourré d’erreur lors de la compilation à cause de l’absence de certains contrôles dans les formulaires …

Merci de t’être penché sur mon problème en faite j’ai remarqué c’est vraiment l’histoire du inputbox qui bloque sur la version 32 bits pour le mot de passe sur le bouton mise à jour > page de garde en tout cas merci de votre aide et si quelqu’un a peut-être une solution à me proposer pour essayer d’adapter inputbox pour la version 32 bits ça serait avec plaisir cordialement

J’avais pas vu, c’est le même problème :

Public Function InputBoxDK(Prompt, Optional Title, Optional Default, Optional XPos, Optional YPos, Optional HelpFile, Optional Context) As String
#If vb7 Then
  #If Win64 Then
    Dim lngModHwnd As LongLong, lngThreadID As LongLong
  #Else
    Dim lngModHwnd As Longptr, lngThreadID As Long
  #End If
#Else
  Dim lngModHwnd As Long, lngThreadID As Long
#End If
  lngThreadID = GetCurrentThreadId
  lngModHwnd = GetModuleHandle(vbNullString)
  hHook = SetWindowsHookEx(WH_CBT, AddressOf NewProc, lngModHwnd, lngThreadID)
  InputBoxDK = InputBox(Prompt, Title, Default, XPos, YPos, HelpFile, Context)
  UnhookWindowsHookEx hHook
End Function

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.