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 :

Adaptation d'un programme au 64 bit


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut Adaptation d'un programme au 64 bit
    Bonjour Patrick et autres membres,

    Peut on me dire si les lignes ci-dessous peuvent être sans inconvénient mises en lieux et place du second code

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    ' Exemple de déclaration compatible avec 64 bit tiré du fichier "redimensionner userform.xlm"
    ' voir également pour formation le documet sur le net "compatibilité entre les version 64 bits et 32 bits sur d'office 2010"
     
    Option Explicit
    #If VBA7 Then
         'api pour changer le mode d affichage du userform et activer ou non la fenetre
        Public Declare PtrSafe Function SWH Lib "user32" Alias "ShowWindow" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
        ' api pour changer le mode d affichage du userform et activer ou non la fenetre
        Public Declare PtrSafe Function SWA Lib "user32" Alias "ShowWindowAsync" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
         ' api pour redresser l'affichage en cas de modification de la caption
        Public Declare PtrSafe Function DMB Lib "user32" Alias "DrawMenuBar" (ByVal hwnd As LongPtr) As Long
          #If Win64 Then
             Public Declare PtrSafe Function SWLA Lib "user32" Alias "SetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
             Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
          #Else
             'api pour trouver et identifier le handle de la fenetre (identifiant de la fenetre
             Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
             'api pour appliquer le nouveau style a la fenetre (userform)
             Public Declare PtrSafe Function SWLA Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
          #End If
     
    #Else
       'api pour trouver et identifier le handle de la fenetre (identifiant de la fenetre
        Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
          'api pour appliquer le nouveau style a la fenetre (userform)
        Public Declare Function SWLA Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
         'api pour redresser l'affichage en cas de modification de la caption
        Public Declare Function DMB Lib "user32" Alias "DrawMenuBar" (ByVal hwnd As Long) As Long
         'api pour changer le mode d affichage du userform et activer ou non la fenetre
        Public Declare Function SWH Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
        ' api pour changer le mode d affichage du userform et activer ou non la fenetre
        Public Declare Function SWA Lib "user32" Alias "ShowWindowAsync" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
     
    #End If
    Option Explicit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Declare PtrSafe Function FindWindowA& Lib "user32" (ByVal lpClassName$, ByVal lpWindowName$)
    Public Declare PtrSafe Function GetWindowLongA& Lib "user32" (ByVal hwnd&, ByVal nIndex&)
    Public Declare PtrSafe Function SetWindowLongA& Lib "user32" (ByVal hwnd&, ByVal nIndex&, ByVal dwNewLong&)
    Comment puis-je adapter le premier code beaucoup plus général ? Il me semble que dans le premier code, il manque la seconde ligne du second code (et peut-être autre chose).

    Merci.

    Cordialement,
    Paul

  2. #2
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Bonjour,

    Tout est là http://arkham46.developpez.com/artic...ice/vba64bits/

    Bonne lecture.

  3. #3
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut
    Bonjour Issoram,

    Je vous remercie pour le renvoi qui est malheureusement pour moi de l’hébreu.

    Ayant déjà bien du mal à retenir les instructions classiques du VBA, il ne peut-être question pour moi d'encombrer ma caboche de ce charabia qui ne me servira que très exceptionnellement voire jamais.

    C'est d'ailleurs parce que j'avais compris être parvenu à la limite de mes capacités que je me suis absenté un temps certain de ce forum.

    Merci tout de même

    Cordialement,
    Paul

  4. #4
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, un autre lien , toujours aussi sibyllin ..... ?

  5. #5
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut
    Bonjour Kiki29,

    Je suis comme sœur Anne, de quel lien parlez-vous ?

    Paul

  6. #6
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, en passant le pointeur de la souris sur lien , ce pointeur change d'aspect , il n'y a plus qu'à cliquer sur lien.

  7. #7
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Reprenons tranquillement pas vite.

    Premier code:

    ShowWindow (Unique ici)
    ShowWindowAsync (Unique ici)
    DrawMenuBar (Unique ici)
    SetWindowLongPtrA (Unique ici et inutile en Windows 32 bits)
    FindWindowA(Commun)
    SetWindowLongA (Commun et utilisé sur un Windows 32 bits)


    Deuxième code:
    FindWindowA (Commun)
    GetWindowLongA (Unique ici)
    SetWindowLongA (Commun)


    C'est un peu comme si tu demandes si on peut remplacer les bananes par des tomates dans un gâteau aux bananes; parce que ce ne sont pas toutes les mêmes fonctions API. Et puis, surtout que, si tu utilises les versions avec Alias, tu dois changer ton code pour que tes appels de fonction correspondent. Donc le FindWindowA de ton deuxième code, est utilisé en tant que FindWindow tout court dans ton premier code

    Également, ce ne sont pas tous les appels de fonctions de l'API qui doivent être modifiés. Même que la plupart du temps, (je me garde quand même une petite gêne), les fonctions sont utilisables tel quel tant que l'on reste avec un Office à 32 bits; même si l'Office à 32 bits est utilisé sur un Windows à 64 bits.

    C'est presque toujours le nombre de bits d'Office qui prédomine. Le problème du 64 bits survient principalement (je me garde toujours une petite gêne) quand une macro doit être utilisée autant dans un Office à 32 bits que dans un Office à 64 bits. Dans ce cas, on peut faire deux versions de la macro, ou une version combinée en utilisant une ou des nouvelles constantes de compilation conditionnelle. (Dans ce cas : VBA7 pour signifier un VBA adapté pour Office 64 bits et 64bits pour un Windows à 64 bits)

  8. #8
    Invité
    Invité(e)
    Par défaut
    Salut,

    En principe, ça devrai être bon, mais comme dit au dessus, les noms de fonctions ne sont pas les même entre les 2 codes que tu as fourni, je me suis basé sur le nom des fonctions du 1er code, il n'y a qu'une seule déclaration que j'ai ajouter finalement.
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    ' Exemple de déclaration compatible avec 64 bit tiré du fichier "redimensionner userform.xlm"
    ' voir également pour formation le documet sur le net "compatibilité entre les version 64 bits et 32 bits sur d'office 2010"
     
    Option Explicit
    #If VBA7 Then
        ' api pour changer le mode d affichage du userform et activer ou non la fenetre
        Public Declare PtrSafe Function SWH Lib "user32" Alias "ShowWindow" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
        ' api pour changer le mode d affichage du userform et activer ou non la fenetre
        Public Declare PtrSafe Function SWA Lib "user32" Alias "ShowWindowAsync" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
        ' api pour redresser l'affichage en cas de modification de la caption
        Public Declare PtrSafe Function DMB Lib "user32" Alias "DrawMenuBar" (ByVal hwnd As LongPtr) As Long
        ' api pour trouver et identifier le handle de la fenetre (identifiant de la fenetre
        Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
     
        #If Win64 Then
            Public Declare PtrSafe Function GWLA Lib "user32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
            Public Declare PtrSafe Function SWLA Lib "user32" Alias "SetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
        #Else
            'api pour appliquer le nouveau style a la fenetre (userform)
            Public Declare PtrSafe Function GWLA Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
            Public Declare PtrSafe Function SWLA Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
        #End If
     
    #Else
       'api pour trouver et identifier le handle de la fenetre (identifiant de la fenetre
        Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
          'api pour appliquer le nouveau style a la fenetre (userform)
        Public Declare Function GWLA Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
        Public Declare Function SWLA Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
         'api pour redresser l'affichage en cas de modification de la caption
        Public Declare Function DMB Lib "user32" Alias "DrawMenuBar" (ByVal hwnd As Long) As Long
         'api pour changer le mode d affichage du userform et activer ou non la fenetre
        Public Declare Function SWH Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
        ' api pour changer le mode d affichage du userform et activer ou non la fenetre
        Public Declare Function SWA Lib "user32" Alias "ShowWindowAsync" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
     
    #End If
    Je n'ai pas essayé les codes en passant.

  9. #9
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut
    Bonjour Nouveau2 , Clementmarcotte et Kiki29

    Nouveau2 vos déclarations donnent aux premiers essais un résultat convenable.

    Il m'a fallu cependant faire quelques adaptations sur d'autres instructions dans lesquelles figuraient les allias et non le GWLA ou SWLA...

    Comme vous vous en doutez, j'avais fait des essais sur la base du lien remis par Kiki29 et les apports de Clementmarcotte. Étrangement cela bloquait sur les "as longPtr" en fin d'instruction. je vais comparer pour voir où je m'étais trompé.

    Nouveau2, je garde ce fichier en bibliothèque en lieu et place du précédent qui était déjà ton œuvre. Je garde également le lien de Kiki2 qui me permettra peut-être de m'en sortir en d'autres circonstances.

    Ajout: j'ai voté pour vous trois après ce post, mais je ne suis pas certain que cela soit bien passé. je ne sais comment on peut le vérifier ?

    Merci à tous,

    Paul

  10. #10
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par nibledispo Voir le message
    Bonjour Nouveau2 , Clementmarcotte et Kiki29

    Ajout: j'ai voté pour vous trois après ce post, mais je ne suis pas certain que cela soit bien passé. je ne sais comment on peut le vérifier ?

    Merci à tous,

    Paul
    Je présume que c'est correct, il y a un "1" à côté des pouces en l'air

  11. #11
    Invité
    Invité(e)
    Par défaut
    Salut,

    De rien,

    Pour vérifier si les déclarations sont bonne, je n'ai pas de solution.
    On va dire que si ça plante au moment de l'appel à la fonction, c'est pas bon


    @+

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

Discussions similaires

  1. Adaptation d'un programme C# en ASP.net
    Par cbr954 dans le forum ASP.NET
    Réponses: 14
    Dernier message: 26/03/2010, 17h50
  2. Programme C# 64 bits
    Par exile69 dans le forum Général Dotnet
    Réponses: 8
    Dernier message: 06/02/2010, 10h57
  3. Programmes Delphi 32 bits fonctionnent en 64 bits ?
    Par Droïde Système7 dans le forum Débuter
    Réponses: 10
    Dernier message: 09/01/2009, 15h04
  4. Réponses: 1
    Dernier message: 14/05/2007, 09h44
  5. MS-DOS programmes compatibles (16 bits)
    Par LarabNain dans le forum Windows
    Réponses: 3
    Dernier message: 03/10/2006, 13h40

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