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é Win32 64


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2013
    Messages : 3
    Par défaut Compatibilité Win32 64
    Bonjour,

    J'ai récupérer un code VBA faisant partie du logiciel REFPROP. J'ai appliqué ce code sur l'un de mes documents excel. Ce code fonctionne très bien quand excel est lancé en 32 bits.
    Le problème se pose quand je tente de lancer l'application sou 64 bits.

    Sur le site de microsoft certaines explications/solutions sont présentées, mais n'étant qu'un amateur en programmation je ne suis pas capable de trouver la solution. Je viens donc chercher votre aide.
    Je vous mets à disposition deux documents: le premier fonctionnel sous 32 bits le deuxième est le code que j'ai tenté de modifier:
    Declaration avec ptrsafe et ajout de ByVal et LongLong

    64bits
    http://www.mediafire.com/download/ps...jet_64bits.rar

    32bits
    http://www.mediafire.com/download/t1...jet_32bits.rar

    Merci a tous

  2. #2
    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 compatibilité win32 64
    bonjour,

    Je n'ouvre pas les documents joints.

    J'ai eu à solutionner récemment ce type de problème.

    Il m'a suffit dans les deux cas d'ajouter "ptrsafe" juste après les instructions "declare ....." dans le code. "declare ptrsafe ....." pour régler le problème.

    Pas eu à me préoccuper des "long long" ou quoi que ce soit d'autre.

    Cordialement,

  3. #3
    Invité
    Invité(e)
    Par défaut
    J'ai ouvert ton classeur tout à l'heure, et je pense qu'il faut une dll 64 bit.
    Pour charger une dll et voir si son chargement est bon ou non, on peux utiliser une API Microsoft "kernel32" : fonction LoadLibrary. Si cette fonction charge une dll, elle renvoie un handle, sinon, elle renvoie 0.

    A mettre dans un module, tout en haut du module:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #If VBA7 Then
        Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr
    #Else
        Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    #End If
    A mettre en dessous dans le même module:
    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
    Public Function TestChargementDLL() As Boolean
     
        #If VBA7 Then
          Dim Réponse As LongPtr
        #Else
          Dim Réponse As Long
        #End If
     
        Réponse = LoadLibrary(ThisWorkbook.Path & "\refprop.dll") 'Le nomcomplet est à adapter.
        If Réponse <> 0 Then
            TestChargementDLL = True
        Else
            MsgBox "Ne peux pas charger la dll" & "refprop.dll"
        End If
     
    End Function
    De l'extérieur, test par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Appel_TestChargementDLL()
        Dim Réponse As Boolean
        Réponse = TestChargementDLL
    End Sub
    Essaie de charger la librairie en 32 bit pour voir si ça marche. Si ça marche, le problème vient de la dll.
    Dernière modification par Invité ; 08/10/2013 à 21h26.

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2013
    Messages : 3
    Par défaut
    Ok, merci pour vos réponses je vais essayer ca.

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2013
    Messages : 3
    Par défaut
    Citation Envoyé par Nouveau2 Voir le message
    J'ai ouvert ton classeur tout à l'heure, et je pense qu'il faut une dll 64 bit.
    Pour charger une dll et voir si son chargement est bon ou non, on peux utiliser une API Microsoft "kernel32" : fonction LoadLibrary. Si cette fonction charge une dll, elle renvoie un handle, sinon, elle renvoie 0.

    A mettre dans un module, tout en haut du module:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #If VBA7 Then
        Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr
    #Else
        Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    #End If
    A mettre en dessous dans le même module:
    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
    Public Function TestChargementDLL() As Boolean
     
        #If VBA7 Then
          Dim Réponse As LongPtr
        #Else
          Dim Réponse As Long
        #End If
     
        Réponse = LoadLibrary(ThisWorkbook.Path & "\refprop.dll") 'Le nomcomplet est à adapter.
        If Réponse <> 0 Then
            TestChargementDLL = True
        Else
            MsgBox "Ne peux pas charger la dll" & "refprop.dll"
        End If
     
    End Function
    De l'extérieur, test par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Appel_TestChargementDLL()
        Dim Réponse As Boolean
        Réponse = TestChargementDLL
    End Sub
    Essaie de charger la librairie en 32 bit pour voir si ça marche. Si ça marche, le problème vient de la dll.
    Bonjour,

    Le problème semble bien venir de la dll. J'ai fais les test que tu m'as proposé ci-dessus, en effet cela fonctionne bien en 32 bits mais pas en 64.
    Je ne m'y connais vraiment pas en programmation, donc je vais peut être poser une question dont le réponse semble évidente pour vous.
    Je n'ai pas créé cette dll, mais y a t-il un moyen de l'éditer, la modifier pour qu'elle soit compatible 64 bits?

    Merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjours,

    Je ne programme pas dans d'autre langages que le VBA (pour l'instant). Peut être voir dans un forum voisin si ils ont la solutions http://www.developpez.net/forums/f16...steme/windows/ , mais en principe, il faut se renseigner auprès de ceux qui ont fait le programme. Ils ont peut être une version 64 bit.

    PS: J'ai pas beaucoup cherché dans les sous-forum, mais il y en a surement d'autres aussi bien adaptés voir mieux adaptés.

  7. #7
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Bonjour ,

    Pour Office 64 bits, les dll et activex doivent obligatoirement être compilés en 64 bits.
    Il faut donc que le programmeur de la dll puisse fournir une version 64 bits compilée à partir des sources.

    Pour la modification du code VBA, ne croyez pas qu'il suffit d'ajouter PtrSafe aux déclarations.
    Sinon à quoi ça servirait ???

    PtrSafe signifie en gros "Pointeurs sûrs".
    Cela indique que vous avez modifié les types des pointeurs de manière sûre et que VBA peut exécuter le code.
    C'est pour cela qu'on est bloqué, pour ne pas exécuter du code non sûr.

    Sinon ça peut fonctionner mais pas tout le temps.

    Un article sur le sujet :
    http://arkham46.developpez.com/artic...ice/vba64bits/

Discussions similaires

  1. Compatibilité Qt interface et win32 thread
    Par ooxoo dans le forum Multithreading
    Réponses: 7
    Dernier message: 06/10/2009, 15h52
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  3. convertir un nom long (win32) en format dos (8+3)
    Par kylekiller dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2002, 13h34
  4. Compatibilité Visibroker 4.5 C++ Builder
    Par manuel dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 21h57
  5. compatibilité des librairies directX8
    Par Freakazoid dans le forum DirectX
    Réponses: 3
    Dernier message: 23/05/2002, 21h33

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