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 :

Path dynamique des références en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par défaut Path dynamique des références en VBA
    Salut,

    j'aurais voulu savoir s'il était possible de modifier dynamiquement le path des références d'un projet VBA.

    Je m'explique : j'ai donc un projet, dans lequel j'utilise des objets de la bibliothèque ADO, et j'ai donc à charger la .dll ADO dans mon projet.
    Jusque là tout va bien, là où ça se complique c'est que le fichier Excel a vocation a être utilisé sur plusieurs ordinateurs, et que les chemins d'accès aux dll sont différents sur chacun d'eux (enfin basiquement il existe deux paths, un anglais "Common Files", et un français "Fichiers communs").

    Comme il est assez impratique d'avoir à modifier les références à chaque démarrage, et que j'aimerais éviter d'avoir deux fichiers (un par jeu de références), j'aimerais donc pouvoir modifier ces chemins d'accès automatiquement au démarrage d'Excel.

    Une idée ?


    Merci d'avance,

    @+

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Je pense que tu trouveras ce qu'il te faut dans ce tuto :http://silkyroad.developpez.com/VBA/...Editor/#LIII-A de Silkyroad, au niveau du chapitre III A.

    Starec

  3. #3
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par défaut
    Hihi, merci

  4. #4
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par défaut
    Voilà ma Sub, j'ai pas encore pu la tester puisque j'ai pas les autres ordinateurs sous la main, mais à priori ça devrait fonctionner, non ? :p

    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
     
    Sub checkRefs()
     
    Dim newPath As String
     
        For Each ref In ThisWorkbook.VBProject.References
            If ref.IsBroken = True Then
                newPath = Replace(ref.FullPath, "Common Files", "Fichiers Communs")
                ThisWorkbook.VBProject.References.Remove ref
                ThisWorkbook.VBProject.References.AddFromFile (newPath)
            End If
        Next ref
     
    End Sub    
     
    Copyright silkyroad ^^
    Je remplace seulement common files par fichiers communs parce que c'est principalement (seulement?) là que se pose le problème.

    Par contre, le but de tout ça était déjà de faire fonctionner le classeur, mais aussi de désactiver le message d'erreur à l'ouverture du fichier "Attention références manquantes" etc, c'est possible ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Il me semble que dans le tuto SilkyRoad en parle.

    Starec

  6. #6
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par défaut
    Soit je suis une grosse fiante, soit non il n'en parle pas.. :p

  7. #7
    Invité
    Invité(e)
    Par défaut
    Re

    Et c'est quoi cela

    Désactiver les références manquantes.
    Vba

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim Ref As Reference
     
    'La procédure boucle sur la collection de références et supprime celles qui sont
    'spécifiées manquantes.  
    For Each Ref In ThisWorkbook.VBProject.References
        If Ref.IsBroken = True Then _
            ThisWorkbook.VBProject.References.Remove Ref
    Next Ref
    Dans le chapitre III A

    Starec

  8. #8
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par défaut
    Ca c'est le code que j'ai copié.

    Excuse moi on a du mal se comprendre ; ce que je cherche à faire maintenant c'est désactiver non pas les références (ça c'est bon c'est fait), mais le message d'erreur comme quoi des références sont manquantes. Alors peut-être que le fait de les désactiver directement dans le workbook_open permet d'éviter cela, et à ce moment là le code est double emploi si je puis dire...

    Sinon en fin de compte un bon "Application.DisplayAlerts = False" devrait faire l'affaire, je pense.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par saipas Voir le message
    Ca c'est le code que j'ai copié.

    Excuse moi on a du mal se comprendre
    Effectivement

    Essaye avec le display alert à l'ouverture, mais il faut le remettre aprés.

    Starec

  10. #10
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par défaut
    Je viens de tester le code, il refuse de s'exécuter tant que les bibliothèques sont manquantes... Génial :p

    [EDIT]
    Rectification, il manquait seulement le "Dim ref as Object".
    Par contre maintenant au niveau des lignes que j'ai ajoutées pour changer les DLL, je me fais avoir parce qu'il semble impossible d'utiliser les propriétés d'une référence manquante :/

  11. #11
    Invité
    Invité(e)
    Par défaut
    Re

    Désolé de ne pouvoir t'aider, je n'ai jamais testé toutes les parties de ce tuto.
    Si Silkyroad passe par là, il pourra sûrement te renseigner.

    Starec

  12. #12
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par défaut
    Ok merci quand même pour ton aide

  13. #13
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Par défaut
    bonjour

    En relisant tous les message je ne comprend plus ou tu veux en venir ...

    Pour revenir à ta question initiale, cette macro permet de retrouver automatiquement le chemin du répertoire spécial "Fichiers communs".


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub CheminRepertoiresSpeciaux()
        'Testé avec Excel2002 & WinXp
        Const Cible = &H2B
        Dim objShell As Object
        Dim objFolder As Object, objFolderItem As Object
     
        Set objShell = CreateObject("Shell.Application")
        Set objFolder = objShell.Namespace(Cible)
        Set objFolderItem = objFolder.Self
     
        MsgBox objFolderItem.Path
    End Sub


    bon week end
    michel

  14. #14
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par défaut
    Le but était d'obtenir en fin de course des bibliothèques sans éléments manquants.

    Avec ta méthode il me suffit de chercher le path de "fichiers communs" et d'ajouter ensuite les dll à partir du path récupéré et de leur nom

    Nickel, merci beaucoup

  15. #15
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par défaut
    Yop,

    y'aurait moyen d'obtenir le path entier du dossier sans avoir à le mettre à la main ?

    Par ailleurs, j'hésitais sur la méthode quant à la manière d'ajouter les références :
    - soit je les ajoute à l'ouverture et je les enlève à la fermeture du fichier
    - soit je vérifie qu'elles existent avant l'ajout (comment on fait ? :p)
    - soit je joue sur l'erreur renvoyée lorsque l'on essaye d'ajouter une référence déjà existante
    Qu'est-ce que vous en pensez ?

    Ma fonction actuellement (fonctionnelle, merci ) :
    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
     
    Sub addRefs()
     
    On Error GoTo GestionErreur
     
     
        Const Cible = &H2B
        Dim objShell As Object
        Dim objFolder As Object, objFolderItem As Object
     
        Set objShell = CreateObject("Shell.Application")
        Set objFolder = objShell.Namespace(Cible)
        ThisWorkbook.VBProject.References.AddFromFile ("C:\Program Files\" & objFolder & "\System\ado\msadox.dll")
        ThisWorkbook.VBProject.References.AddFromFile ("C:\Program Files\" & objFolder & "\System\ado\msador15.dll")
     
        Exit Sub
     
    GestionErreur:
        If Err.Number = 32813 Then
            Resume Next
        Else:
            MsgBox ("Erreur numéro " & Err.Number & vbCrLf & Err.Description)
        End If
     
    End Sub

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Citation Envoyé par saipas Voir le message
    Yop,

    y'aurait moyen d'obtenir le path entier du dossier sans avoir à le mettre à la main ?
    N'est-ce pas "MsgBox objFolderItem.Path" qui te le donne ?
    Pour tes autres questions, et pour le béotien que je suis en la matière, la gestion d'erreur me paraîtrait une solution de facilité "acceptable"... mais certainement pas la plus sioux

  17. #17
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par défaut
    Arf zut j'essayais la propriété Path avec objFolder et non pas objFolderItem, c'est pour ça que ça fonctionnait pas.. Mici ^^


    Ajout de la fonction de sky pour enlever les MISSING :
    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
     
    Sub addRefs()
     
    On Error GoTo GestionErreur
     
        Dim Ref As Reference
        Const Cible = &H2B
        Dim doesntExist As Boolean
        Dim objShell As Object
        Dim objFolder As Object, objFolderItem As Object
     
        'La procédure boucle sur la collection de références et supprime celles qui sont
        'spécifiées manquantes.
        For Each Ref In ThisWorkbook.VBProject.References
            If Ref.IsBroken = True Then
                ThisWorkbook.VBProject.References.Remove Ref
                doesntExist = True
            End If
        Next Ref
     
        If doesntExist = True Then
            Set objShell = CreateObject("Shell.Application")
            Set objFolder = objShell.Namespace(Cible)
            Set objFolderItem = objFolder.self
            ThisWorkbook.VBProject.References.AddFromFile (objFolderItem.Path & "\System\ado\msadox.dll")
            ThisWorkbook.VBProject.References.AddFromFile (objFolderItem.Path & "\System\ado\msador15.dll")
        End If
     
        Exit Sub
     
    GestionErreur:
        If Err.Number = 32813 Then
            Resume Next
        Else:
            MsgBox ("Erreur numéro " & Err.Number & vbCrLf & Err.Description)
        End If
     
    End Sub

  18. #18
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par défaut
    Je viens d'essayer cette fonction sur un autre ordinateur sur lequel les DLL sont manquantes et elles produisent une erreur "object library not registered" :/

Discussions similaires

  1. [XL-2010] Rendre dynamique la référence à des cellules dans VBA
    Par Mistouv dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 03/07/2013, 22h10
  2. [AC-2007] Mise à jour des références par VBA
    Par jpg75014 dans le forum VBA Access
    Réponses: 2
    Dernier message: 16/06/2011, 18h31
  3. [Framework] shared prototype : un mapping dynamique des références
    Par ThomasEscolan dans le forum Spring
    Réponses: 0
    Dernier message: 24/03/2011, 11h25
  4. [VBA] Ajouter dynamiquement une référence
    Par jpharand dans le forum VBA Access
    Réponses: 23
    Dernier message: 17/04/2010, 00h28
  5. [VBA-E] Est il possible de creer dynamiquement des controles en VBA
    Par bbkenny dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 13/08/2004, 21h04

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