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 :

VBA : récupérer un chemin de fichier fluctuant [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Septembre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 37
    Par défaut VBA : récupérer un chemin de fichier fluctuant
    Bonjour,
    J'ai cherché et essayé plusieurs solutions mais n'ai rien trouvé qui soit opérationnel : j'ai besoin de récupérer des chemins d'accès & noms de fichiers qui peuvent être fluctuants car manipulés par plusieurs personnes. Concrètement pour un mailing je dois récupérer les chemins des différents disponibles de la semaine suivante.
    1/ Répertoire parent identique à celui du classeur où se trouve la macro récupéré avec le workbook.path
    2/ sous dossier défini par exemple "GAMME"
    3/ sous-dossier contenant le n° de la semaine mais pouvant être appelé Semaine 41 ou semaine 41 ou sem 41 avec ou non des caractères derrière
    4/ nom du fichier contenant le n° de sem et le nom du tarif défini dans mon classeur ou dans la macro (par exemple NET)

    J'ai testé avec "*", "*[a-z]*", rien n'a fonctionné. Je précise qu'à chaque fois il n'y a qu'un sous-dossier ou nom de fichier remplissant les critères. J'avais réussi à inclure un nom de feuille partiel dans une formule une fois et il me trouve toujours le nom de la feuille en entier donc je me dis que ça doit être possible...

    Dernier code testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dossier = ThisWorkbook.Path
    Set fich_gamme_net = Workbooks.Open(dossier & "\GAMME\" & "*[a-z]*" & nosem & "\" & "*[a-z]*" & nosem & "*NET*" & ".xls")
    Génère un message d'erreur disant qu'il est impossible d'ouvrir le fichier avec les *[a-z]* apparaissant tels quels dans le nom du fichier

    Code avec nom de feuille partiel qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cell.Offset(0, -14).FormulaR1C1 = "=VLOOKUP(R[0]C[6],'export*'!R1C1:R9500C4,2,FALSE)"
    export étant suivi de la date de l'export et donc variable
    dans la formule de ma cellule j'ai bien le nom de la feuille en entier.

    J'espère avoir été suffisamment claire, c'est pas simple à expliquer.

    Merci d'avance pour votre aide

  2. #2
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour,

    Le simple semble de procéder par étape, en utilisant la fonction Dir().
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DPath = ThisWorkbook.Path
    FPath = Dir(DPath & "\*em*" & NumSem & "*", vbDirectory)
    If FPath <> "" Then
        FName = Dir(DPath & "\" & FPath & "\*" & NumSem & "*" & Tarif & "*")
        If FName <> "" Then
            MsgBox "Vous pouvez ouvrir le fichier : " & DPath & "\" & FPath & "\" & FName
        End If
    End If

  3. #3
    Membre averti
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Septembre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 37
    Par défaut
    Citation Envoyé par Ben_L Voir le message
    Bonjour,

    Le simple semble de procéder par étape, en utilisant la fonction Dir().
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DPath = ThisWorkbook.Path
    FPath = Dir(DPath & "\*em*" & NumSem & "*", vbDirectory)
    If FPath <> "" Then
        FName = Dir(DPath & "\" & FPath & "\*" & NumSem & "*" & Tarif & "*")
        If FName <> "" Then
            MsgBox "Vous pouvez ouvrir le fichier : " & DPath & "\" & FPath & "\" & FName
        End If
    End If
    Bonjour,
    Merci pour la réponse rapide
    Il manque le niveau 2, j'ai essayé d'adapter ainsi mais ça ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DPath = ThisWorkbook.Path
    DPath = ThisWorkbook.Path
    FPath = Dir(DPath & "\GAMME\*" & nosem & "*", vbDirectory)
    If FPath <> "" Then
        Fname = Dir(DPath & "\" & FPath & "\*" & nosem & "*" & "NET" & "*")
        'If FName <> "" Then
            MsgBox "Vous pouvez ouvrir le fichier : " & DPath & "\" & FPath & "\" & Fname
        'End If
    End If
    Il manque le sous dossier GAMME et le nom de fichier dans ce qui ressort dans la msgbox

  4. #4
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Ah oui, j'ai oublié le point 2...

    Vous pouvez essayer le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DPath = ThisWorkbook.Path
    FPath = Dir(DPath & "\GAMME\*" & nosem & "*", vbDirectory)
    If FPath <> "" Then
        Fname = Dir(DPath & "\GAMME\" & FPath & "\*" & nosem & "*NET*")
        If FName <> "" Then
            MsgBox "Vous pouvez ouvrir le fichier : " & DPath & "\GAMME\" & FPath & "\" & Fname
        Else
            MsgBox "Il n'a pas été possible de trouver le fichier associé à la semaine " & nosem & " !", vbCritical
        End If
    Else
        MsgBox "Il n'a pas été possible de trouver le dossier associé à la semaine " & nosem & " !", vbCritical
    End If
    Attention cependant : la méthode ci-dessus caractérise très peu les noms de dossiers1 et de fichiers. Elle est donc peu robuste.
    Si le nom de fichier obtenu n'est pas celui souhaité, il est possible d'améliorer le tout en scannant tous les fichiers/sous-dossiers d'un dossier et en cherchant un schéma orthographique donné par l'utilisation, soit de 'opérateur Like, soit d'expressions régulières (plus puissant mais nécessite l'ajout d'une référence).

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir
    visiblement ton fichier a nom fluctuant se trouve dans un sous dossier (avec un nom fluctuant aussi) du dossier"GAME" qui lui même est enfant de thisworbook.path

    étant donné que seul le chemin et seul un, partie du sous dossier est connu et seul 1 ou 2 morceaux du nom du fichier recherché est connu

    il va te falloir parcourir dossier et sous dossier jusqu'au fichier en partant de la racine connu soit thisworkbook.path & "\game\"
    on peut déjà parler de fonction récursive avec dir tu a des exemples dans les contributions

    a chaque sous dossier on le parcourt
    je te ferais un exemple demain quand tu aura un peu cherché
    des exemples il y en a à foison
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Membre averti
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Septembre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 37
    Par défaut
    Merci pour vos réponses.

    J'ai simplifié la macro en ajoutant une formule dans une feuille Excel existante pour fusionner les étapes 1 & 2, et ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    dossier = Sheets("Données").Range("D7").Value
    tarif = NET
    dossier_sem = Dir(dossier & "*" & numsem & "*", vbDirectory)
    If dossier_sem <> "" Then
        PJ = Dir(dossier & dossier_sem & "\*" & numsem & "*" & tarif & "*")
        If PJ <> "" Then
            MsgBox "Vous pouvez ouvrir le fichier : " & dossier & dossier_sem & "\" & PJ
        Else
            MsgBox "Il n'a pas été possible de trouver le fichier associé à la semaine " & numsem & " !", vbCritical
        End If
    Else
        MsgBox "Il n'a pas été possible de trouver le dossier associé à la semaine " & numsem & " !", vbCritical
    End If

    Le but est de remplir ce tableau qui référence les pièces à joindre :
    Dispo 1 Dispo 2 Dispo 3
    Tarif 1 ou 1bis
    Tarif 2
    Tarif 3
    En fait j'aimerais faire varier les variables dossier et tarif pour remplir mes 9 cases sans avoir à répéter tout le code à chaque fois, ce qui fonctionnerait mais est assez fastidieux et difficile à entretenir.
    Est-ce là que les fonctions récursives vont pouvoir m'être utiles? J'avoue être restée sur des fonctions basiques jusque là. Je vais chercher et reviens vers vous si je rame trop, ce qui sera sûrement le cas

    Merci encore

  7. #7
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Attention, il manque des guillemets à la ligne 2 de votre code :
    Quant à l'application du code sur diverses valeur, nul besoin de fonctions récursives.
    Il vous suffit d'inclure le code dans une Sub qui prendra des arguments (a priori nosem et tarif, voire également dossier).
    Appeler ensuite cette Sub dans une boucle. Les arguments peuvent être stockés dans une plage de données ou dans un tableau VBA.

  8. #8
    Membre averti
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Septembre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 37
    Par défaut
    Citation Envoyé par Ben_L Voir le message
    Quant à l'application du code sur diverses valeur, nul besoin de fonctions récursives.
    Il vous suffit d'inclure le code dans une Sub qui prendra des arguments (a priori nosem et tarif, voire également dossier).
    Appeler ensuite cette Sub dans une boucle. Les arguments peuvent être stockés dans une plage de données ou dans un tableau VBA.
    Mais oui j'aurais dû y penser, c'est pas comme si j'avais pas déjà utilisé la fonction For... Pourquoi faire simple quand on peut faire compliqué ! J'ai déjà les arguments dans des plages en plus

    Je reviens mettre le code final une fois que tout fonctionne.

    Merci encore !

  9. #9
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour,
    La "fonction" For ?
    Je ne connais aucune fonction de ce nom !

    Une fonction est une procédure qui retourne une valeur.
    Quelle est donc cette "fonction" For et que retourne-t-elle ?

    Ne me dis surtout pas que je "pinaille", sinon j'utiliserais des mots comme truc, machin, chouette, etc ... pour désigner n'importe quoi dans les réponses que je serais éventuellement amené à te faire. Et on verra ta tête.
    Les mots ont un sens et une importance. Leur utilisation correcte est la marque de la bonne compréhension que l'on a des choses traitées.

  10. #10
    Membre averti
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Septembre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 37
    Par défaut
    Comme promis voici le code final fonctionnel :
    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
    i = 1 ' rang dossier (colonne)
    j = 1 'rang tarif (ligne)
     
    For Each cell In Sheets("Données").Range("E7:G7")
    dossier = cell.Value
     
        For Each cell2 In Sheets("Données").Range("B2:B4")
        tarif = cell2.Value
     
        If i = 3 Then
            dossier_sem = Sheets("Données").Range("G6").Value ' pas de sous dossier par semaine
            Else: dossier_sem = Dir(dossier & "*" & numsem & "*", vbDirectory)
        End If
        If dossier_sem <> "" Then
            PJ = Dir(dossier & dossier_sem & "\*" & numsem & "*" & tarif & "*")
            If PJ <> "" Then 'si fichier trouvé
                'MsgBox "Vous pouvez ouvrir le fichier : " & dossier & dossier_sem & "\" & PJ
                Sheets("Mail").Cells(5 + j, 8 + i).Value = dossier & dossier_sem & "\" & PJ 'H8 = début du tableau à remplir
     
     
            Else ' si fichier non trouvé
                MsgBox "Il n'a pas été possible de trouver le fichier associé à la semaine " & numsem & " !", vbCritical
            End If
        Else ' si dossier semaine non trouvé
            MsgBox "Il n'a pas été possible de trouver le dossier associé à la semaine " & numsem & " !", vbCritical
        End If
     
        j = j + 1
        Next cell2
     
    i = i + 1
    j = 1
    Next cell
    Grand merci à Ben_L pour son aide précieuse

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 26/09/2017, 10h02
  2. Récupérer le chemin du fichier dans un input file
    Par michel81 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 22/12/2008, 11h29
  3. Réponses: 4
    Dernier message: 06/03/2008, 17h10
  4. Récupérer le chemin du fichier d'une bdd
    Par [DreaMs] dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/04/2006, 16h58
  5. Réponses: 10
    Dernier message: 24/10/2005, 16h37

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