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 :

Obtenir un fonctionnement de mon code selon la version office utilisée


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Par défaut Obtenir un fonctionnement de mon code selon la version office utilisée
    Bonjour

    Je cherche une solution pour résoudre le message d'erreur suivant:
    "Erreur de compilation dans le module caché : CG_TG
    cette erreur se produit probablement lorsque le code est incompatible avec la version, plateforme ou architecture de cette application
    ".
    J'utilise office 2016 maintenant. Est-ce que l'erreur pourrait provenir du changement de version office?
    Le code me paraît bien rédigé car sur d'autres PC je ne rencontre pas ce message d'erreur et je remercie encore son auteur.
    Ci-dessous le 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
    Option Explicit
     
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
     
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String _
        , ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
     
     
    Sub Imprimer_VISA()
        Dim Nomfic As String, spath As String
        Dim x As Long
     
        x = FindWindow("XLMAIN", Application.Caption)
        spath = Environ("USERPROFILE")
        spath = spath & "\Desktop\Z_YEMBI\"
        Nomfic = Sheets("PARAMETRE_ADMIN").Range("M2")     
        ShellExecute x, "print", spath & Nomfic, "2", "3", 1
    End Sub

  2. #2
    Membre Expert Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Par défaut
    Remplacer "Declare Function" et "Private Sub"
    par:
    "Declare PtrSafe Function" et "Declare PtrSafe Sub"
    En général, pour assurer la compatibilité descendante avec VBA version 6 et versions antérieures, utilisez la construction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #If VBA7 Then
    Declare PtrSafe Sub...
    #Else
    Declare Sub...
    #EndIf

  3. #3
    Membre éclairé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Par défaut
    Bonjour Zekraoui_Jakani et le forum

    Je m'excuse du temps de réponse.
    J'ai pas trop bien compris votre proposition mais voici ce que j'ai essayé de bricoler suivant votre aide:
    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
    Option Explicit
    If vba7 Then
    Private Declare ptrsafe Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As Longptr
     
    Private Declare ptrsafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String _
        , ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Longptr
        Else
        Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As Longptr
     
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String _
        , ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Longptr
        End If
    En faisant deds recherches pour comprendre l'utilisation de PtrSafe, j'ai appris qu'il "faut" utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    As Longptr au lieu de As Long
    Merci de m'aider à faire bon usage de votre solution.

  4. #4
    Membre Expert Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Par défaut
    Dans l'expression "As Longptr", on dirait que cette variable est sortie de son contexte; elle vient probablement d'un module de classe.
    Personnellement j'éviterais tous les tests su vb6/vba7, et j'utilisrais partout "Sub ptrsafe nomDeProcédure()" ou "Function ptrsafe nomDeFonction(x,y,...)"

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Lien en anglais sur la question How to convert Windows API declarations in VBA for 64-bit
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre éclairé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Par défaut
    Bonsoir Zakraoui et Philippe

    Merci pour vos propositions respectives.
    Zprès avoir ajouter le ptrsafe dans le code, j'ai constaté que la partie du code comportant Ptrsafe a été signalée en rouge comme pour indiquer qu'il y'avait une erreur.
    J'ai ajouté # dans certains éléments du code comme ci-dessous et je souhaite qu'on m'assure que c'est correct avant que je ne puisse l'envoyer aux utilisatauers finaux:
    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
    Option Explicit
    #If VBA7 Then
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
     
    Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String _
        , ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
        #Else
        Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
     
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String _
        , ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
        #End If
    Sub Imprimer_PS()
        Dim Nomfic As String, spath As String
        Dim x As Long
     
        x = FindWindow("XLMAIN", Application.Caption)
        spath = Environ("USERPROFILE")
        spath = spath & "\Desktop\Z_YE\"
        Nomfic = Sheets("PARAMETRE_ADMIN").Range("M2")     
        ShellExecute x, "print", spath & Nomfic, "2", "3", 1

Discussions similaires

  1. Problème de mise en page selon la version Office
    Par MaelB dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/01/2013, 16h42
  2. Mon code peut il fonctionner ?
    Par dreeve dans le forum Langage
    Réponses: 10
    Dernier message: 07/06/2007, 11h19
  3. Réponses: 6
    Dernier message: 12/04/2007, 14h58
  4. [MySQL] Mon code ne fonctionne pas correctement
    Par bebas dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 24/02/2007, 14h27
  5. Un alert() en plus et mon code fonctionne, sans il foire :|
    Par narnou dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/03/2006, 14h44

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