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 :

décocher une référence VBA manquante [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    PMO
    Inscrit en
    Août 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : PMO
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 66
    Points : 56
    Points
    56
    Par défaut décocher une référence VBA manquante
    Bonjour,
    J'utilise (avec des collègues) un tableau Excel avec des macros faisant intervenir des références VBA pour word et outlook
    Le problème est que désormais certains sont passés sous office 2016 et les autres sont restés en office 2010 et de ce fait quand quelqu'un qui est sous office 2016 enregistre le tableau cela entraine des erreurs de compilation pour ceux qui sont restés en office 2010
    Pour résoudre le problème, il suffit de décocher (dans l'environnement VBA) les cases commençant par MANQUANT dans la fenêtre des référence disponibles puis rajouter les bonnes référence.
    Je voudrais écrire une macro réalisant cette opération.
    Rajouter des références manquantes : je sais faire mais là où je bloque c'est l'équivalent de décocher les case "MANQUANT..."
    Si j'essaye de supprimer les référence, ça plante car justement elles sont en erreur
    Si quelqu'un avait une idée…
    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Points : 378
    Points
    378
    Par défaut
    Bonjour,

    pour éviter d'en arriver la il est préférable de faire de la liaison retardée (Late Binding en anglais) au lieu de liaison anticipée.
    Dans ce cas la liaison avec la référence ce produira non pas lors de la compilation(pendant l'ouverture du fichier) mais lors de l’exécution de la macro.

    Donc dans un premier temps on évite l'erreur à l'ouverture. Ce qui permettra, si comme tu le souhaites, de lancer une macro qui vérifiera l’état des références et ce dès l’événement Workbook_open().

    Pour étayer mon propos je reprend les exemples de l'article ici : Early binding and late binding in Automation

    Edit: voir même comme dit dans l'article de ne pas référencer du tout !


    Code Liaison Anticipée, à éviter : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    ' Declare the object as an early-bound object
      Dim oExcel As Excel.Application
     
      Set oExcel = CreateObject("Excel.Application")
     
    ' The Visible property is called via the v-table
      oExcel.Visible = True


    Code Liaison Retardée, à préférer. : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ' No reference to a type library is needed to use late binding.
    ' As long as the object supports IDispatch, the method can 
    ' be dynamically located and invoked at run-time.
     
    ' Declare the object as a late-bound object
      Dim oExcel As Object
     
      Set oExcel = CreateObject("Excel.Application")
     
    ' The Visible property is called via IDispatch
      oExcel.Visible = True

    voir aussi l'aide VBA à propos de : Fonction CreateObject

    A+

  3. #3
    Membre du Club
    Homme Profil pro
    PMO
    Inscrit en
    Août 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : PMO
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Merci pour ta réponse rapide,
    Il va me falloir un peu de temps pour bien assimiler.

    Si j'ai bien compris l'article et tes codes il faut que je fasse en sorte que VBA (Excel) gère les liaisons avec Word et Outlook via des références par liaisons retardées au lieu des liaisons anticipées qui sont faites par défaut

    Pour ce faire, je crée un objet EXCEL.Application que j'aurais déclaré en tant que simple objet et non pas un objet de l'application Excel (ce qui fait la différence entre liaison retardée et liaison anticipée)
    Cette déclaration je la fais dans la partie THISWORKBOOK OPEN

    Mais après ?
    ça fait en sorte que si je rajoute les liens word et outlook, VBA se débrouille quelque soit la version Excel ??

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Points : 378
    Points
    378
    Par défaut
    Citation Envoyé par Airthé Voir le message
    Cette déclaration je la fais dans la partie THISWORKBOOK OPEN
    non non pas dans THISWORKBOOK OPEN. mais comme tu le fais déjà... probablement dans un module.

    L'idée avec THISWORKBOOK OPEN était à propos d’une macro pour décocher les références manquantes et uniquement pour cela.

    A+

  5. #5
    Membre du Club
    Homme Profil pro
    PMO
    Inscrit en
    Août 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : PMO
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Finalement, j'ai trouvé une solution de contournement
    • Dans la procedure "Before Close" du classeur, je supprime les références Word et Outlook
    • Dans la procédure OPEN du classeur je les crée

    Et si tout va bien, à chaque ouverture la création (via le n° de Guid des références) des référence est forcément la bonne et comme elle est supprimée à l'enregistrement du classeur, il n'y a plus de MANQUANT à l'ouverture suivante

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Bonjour Airthé,

    Pourriez-vous donner un exemple de code de suppression - et d'ajout - de référence ?
    Merci déjà.

  7. #7
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 419
    Points : 2 178
    Points
    2 178
    Par défaut
    Bonjour,
    Il faut désactiver toutes référence à Word, Excel, Outlook,etc. Et utiliser la méthode CreateObject dans ton code !

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 755
    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 : 12 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La lecture d'un billet que j'ai écrit sur le sujet et titré VBA Excel - La compilation conditionnelle ou comment développer en EarlyBinding et distribuer en late binding vous aidera peut-être
    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

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Merci pour vos réponses.

    J'ai lu quelque part que le Early Binding s'exécutait plus rapidement. Et le code me semble plus explicite...
    Mais c'est vrai que dans un environnement multi-versions, c'est le brin...
    J'ai résolu ça en enlevant la référence en sortie de fichier et en l'ajoutant à l'ouverture, avec l'identifiant GUID de la référence.
    De la sorte, selon la version, la référence chargée est toujours la bonne. Ou devrait.

  10. #10
    Membre du Club
    Homme Profil pro
    PMO
    Inscrit en
    Août 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : PMO
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par pierregy Voir le message
    Bonjour Airthé,

    Pourriez-vous donner un exemple de code de suppression - et d'ajout - de référence ?
    Merci déjà.
    Bonjour voici les 2 macros que j'avais écrites à l'époque. Le même tableau Excel partagé pouvait être ouvert par des post en Win 7 et d'autre en Win 10 d'où ces macro
    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
    Sub Mise_en_place_Références_VBA() 'répertoire
        'Cette procédure n'a d'intéret que tant qu'il y a des utilisateurs windows 7 et des utilisateurs WIndows 10 en même temps
        'Car les noms des références complémentaires nécessaires à cet outil (référence WORD et OULOOK) sont différents
        'mais surtout les 2 fichiers de références ne cohabitent pas, il ya soit l'un soit l'autre
        'par contre ils ont le même GUID
        'Guid : Global Unique Identifier => il est extrait directement à partir de la base de registre de Windows. Un numéro qui a cette forme :
        '{0D452EE1-E08F-101A-852E-02608C4D0BB4}
     
        'En principe, quand le dernier enregistrement se fait à partir d'office 2016, si l'utilisateur utilise office 2010 ça a pour conséquence que dans
        'la fenêtre "Références" du menu "Outils" de VBA les case cochées correspondant à WORD et OUTLOOK commence par "MANQUANT"
        'ce qui provoque une erreur d'exécution dès le départ (l'inverse n'est pas vrai)
        'Solution de contournement : Supprimer ces références dès qu'on n'en a plus besoin
     
        On Error Resume Next
        GUIDWORD = "{00020905-0000-0000-C000-000000000046}" 'Guid de word
        GUIDOUTLOOK = "{00062FFF-0000-0000-C000-000000000046}" 'Guid de outlook
        GUIDSCRIPTINFRUNTIME = "{420B2830-E718-11CF-893D-00A0C9054228}"
        ThisWorkbook.VBProject.References.AddFromGuid GUID:=GUIDWORD, major:=2, minor:=0
        ThisWorkbook.VBProject.References.AddFromGuid GUID:=GUIDOUTLOOK, major:=2, minor:=0
        ThisWorkbook.VBProject.References.AddFromGuid GUID:=GUIDSCRIPTINFRUNTIME, major:=1, minor:=0
        On Error GoTo 0 
    End Sub
     
    Sub Suppression_Références_VBA()
        Dim oRef As Object
        On Error Resume Next
        Set oRefWord = ThisWorkbook.VBProject.References("Word")
        Set oRefOutlook = ThisWorkbook.VBProject.References("outlook")
        With ThisWorkbook.VBProject.References
                .Remove oRefWord
                .Remove oRefOutlook
        End With
        On Error GoTo 0
    End Sub
    J'espère que cela vous convient

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Un tout grand merci ! Bon week-end.

  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 755
    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 : 12 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Attention que pour utiliser la propriété vbProject de l'objet Application, il faut autoriser l'accès au modèle d'objets du projet VBA et ce sur toutes les machines qui vont utiliser le programme. Certain service informatique bloque cette option.
    Et le fait d'avoir placé un On Error Resume Next aura comme conséquence que l'erreur ne sera pas levée
    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

  13. #13
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 419
    Points : 2 178
    Points
    2 178
    Par défaut
    Bonjour,
    Perso l'accès à vbproject interdit!

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

Discussions similaires

  1. [VBA] Ajouter dynamiquement une référence
    Par jpharand dans le forum VBA Access
    Réponses: 23
    Dernier message: 16/04/2010, 23h28
  2. Ajouter une références dans VBA
    Par DPhBxl dans le forum VBA Access
    Réponses: 12
    Dernier message: 03/10/2008, 15h54
  3. Impossible de décocher une bibliothèque de référence
    Par Alain36 dans le forum VBA Access
    Réponses: 15
    Dernier message: 13/12/2007, 09h47
  4. [VBA]Changer automatiquement la version d'une référence
    Par mooh91 dans le forum VBA Access
    Réponses: 15
    Dernier message: 18/04/2007, 20h38
  5. Référence VBA manquante Access 2000
    Par p'tite Sandrine dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/11/2006, 13h47

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