IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Compatibilité (de la Version 32bits x86 à la version 64bits x64) [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Par défaut Compatibilité (de la Version 32bits x86 à la version 64bits x64)
    Bonjour,

    Je dispose d'un code permettant de "griser" le bouton croix de fermeture en haut à droite d'un userform.

    Cependant, lorsque j'exécute mon formulaire sur un ordinateur en 64 bits, cela m'indique une erreur de compatibilité.

    L'idée serait de rendre compatible mon code qui marche sous 32bits sur ce type d'ordinateur en x64.

    Pouvez-vous m'aider SVP ? car il s'agit d'une fonction système et je ne suis pas à l'aise !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'Fonctions systèmes nécessaires à la désactivation du bouton "Croix de fermeture" de Mise_en_Forme
    Private Const SC_CLOSE = &HF060&
    Private Const MF_BYCOMMAND = &H0&
     
    Private Declare Function GetSystemMenu Lib "user32" _
            (ByVal hwnd As Long, ByVal bRevert As Long) As Long
     
    Private Declare Function RemoveMenu Lib "user32" _
            (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
     
    Private Declare Function FindWindowA Lib "user32" _
      (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private Sub CommandButton4_Click()
    'Bouton "Formulaire" permettant d'afficher le formulaire
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     
    'Masquer le bouton "Croix de fermeture"
    Dim hSysMenu As Long
    Dim MeHwnd As Long
        MeHwnd = FindWindowA(vbNullString, Modification.Caption)
        If MeHwnd > 0 Then
            hSysMenu = GetSystemMenu(MeHwnd, False)
            RemoveMenu hSysMenu, SC_CLOSE, MF_BYCOMMAND
        Else
            MsgBox "Handle de " & Modification.Caption & " Introuvable", vbCritical
        End If
     
    'Affichage du formulaire "Modification"
    Formulaire.Hide
    Modification.Show 0
    End Sub
    Merci d'avance de votre aide !!

    GK

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Bonjour, bonjour !

    Consulter le tutoriel Développer avec Office 64 bits

    Voilà, voilà !


    ______________________________________________________________________________________________________
    Je suis Paris, Charlie, …

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Par défaut
    C'est ça qui faut que je mette ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'Déclaration de l'API
    #If VBA7 Then
    Private Declare PtrSafe Sub PathStripPath Lib "shlwapi.dll" _
       Alias "PathStripPathA" (ByVal pszPath As String)
    Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" _
       Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
    #Else
    Private Declare Sub PathStripPath Lib "shlwapi.dll" _
       Alias "PathStripPathA" (ByVal pszPath As String)
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
       Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
    #End If

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Par défaut
    J'ai fait ça pour le moment, je vais tester sur un ordinateur en x64 d'ici demain :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    'Fonctions systèmes nécessaires à la désactivation du bouton "Croix de fermeture" de Mise_en_Forme
    Private Const SC_CLOSE = &HF060&
    Private Const MF_BYCOMMAND = &H0&
     
    #If VBA7 Then 'Version x64
    Private Declare PtrSafe Function GetSystemMenu Lib "user32" _
            (ByVal hwnd As Long, ByVal bRevert As Long) As Long
     
    Private Declare PtrSafe Function RemoveMenu Lib "user32" _
            (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
     
    Private Declare PtrSafe Function FindWindowA Lib "user32" _
      (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    #Else         'Version x86 (32 bits)
    Private Declare Function GetSystemMenu Lib "user32" _
            (ByVal hwnd As Long, ByVal bRevert As Long) As Long
     
    Private Declare Function RemoveMenu Lib "user32" _
            (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
     
    Private Declare Function FindWindowA Lib "user32" _
      (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    #End If
    Je me demande s'il faut que je modifie ce code par la même occasion ? (qui se trouve au sein d'un bouton)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'Masquer le bouton "Croix de fermeture"
    Dim hSysMenu As Long
    Dim MeHwnd As Long
        MeHwnd = FindWindowA(vbNullString, Modification.Caption)
        If MeHwnd > 0 Then
            hSysMenu = GetSystemMenu(MeHwnd, False)
            RemoveMenu hSysMenu, SC_CLOSE, MF_BYCOMMAND
        Else
            MsgBox "Handle de " & Modification.Caption & " Introuvable", vbCritical
        End If

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Par défaut
    J'ai trouvé mon bonheur ici : http://www.jkp-ads.com/articles/apideclarations.asp

    On y retrouve la majorité des déclarations de l'API en x64 et x86(32 bits).

    Après mes tests, je posterai ici même la version définitive et fonctionnelle du code.

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Par défaut
    Voici la solution (testé et fonctionnelle):

    Pour résumer :
    1- Il faut modifier uniquement le code de déclaration des variables de l'API.
    2- Le code faisant appel à ces variables reste inchangé.
    3- Pour passer de x86 (32bits) à x64, il faut simplement :
    -a Rajouter "Ptrsafe" entre "Declare" et "Function"
    -b Passer les "Long" en "Longptr"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    'Fonctions systèmes nécessaires à la désactivation du bouton "Croix de fermeture" de Mise_en_Forme
    Private Const SC_CLOSE = &HF060&
    Private Const MF_BYCOMMAND = &H0&
     
    #If VBA7 Then 'Version x64
    Private Declare PtrSafe Function GetSystemMenu Lib "user32" _
            (ByVal hwnd As LongPtr, ByVal bRevert As LongPtr) As LongPtr
     
    Private Declare PtrSafe Function RemoveMenu Lib "user32" _
            (ByVal hMenu As LongPtr, ByVal nPosition As LongPtr, ByVal wFlags As LongPtr) As LongPtr
     
    Private Declare PtrSafe Function FindWindowA Lib "user32" _
      (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    #Else         'Version x86 (32 bits)
    Private Declare Function GetSystemMenu Lib "user32" _
            (ByVal hwnd As Long, ByVal bRevert As Long) As Long
     
    Private Declare Function RemoveMenu Lib "user32" _
            (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
     
    Private Declare Function FindWindowA Lib "user32" _
      (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    #End If
    Cordialement.

    GK

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Migration 4D 6.5 vers version 32bit
    Par LEBIB dans le forum 4D
    Réponses: 0
    Dernier message: 07/10/2015, 14h56
  2. Réponses: 19
    Dernier message: 17/01/2009, 02h17
  3. Réponses: 1
    Dernier message: 23/07/2007, 10h19
  4. Réponses: 3
    Dernier message: 15/09/2006, 11h23
  5. Réponses: 7
    Dernier message: 21/01/2006, 00h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo