Recherche de sous dossier en vba

Résolu
anthony -  
 melanie1324 -
Bonjour,

quel code faut il pour ouvrir le sous dossier correspondant à la valeur d'une textbox ?
j'ai un dossier commun dans lequel se trouve différents sous dossiers dont le nom correspondant aux valeurs que la textbox peut afficher
valeur textbox 1245
dossier global : C:\Users\thony\Desktop
et dans le dossier D1230_1265 on trouve le dossier 1245

voici le chemin complet quand on arrive au niveau voulu
C:\Users\thony\Desktop\D1230_1265\1245

19 réponses

Résumé de la discussion

Ouverture automatique d’un sous-dossier correspondant à la valeur saisie dans une textbox, en utilisant une structure où le dossier parent commun contient des sous-dossiers nommés d’après les valeurs affichées. Plusieurs approches préconisent d’utiliser Dir avec une variable série et de tester l’existence du fichier Map everest.wcf dans X:\CAD\Export_Data\Fichiers_Testeurs, par exemple: quelfichier = Dir("X:\CAD\Export_Data\Fichiers_Testeurs" & serie & "\Map everest.wcf"). Difficultés courantes incluent l’ouverture du dialogue dans Mes documents, la nécessité d’adapter le nom du dossier (par exemple D1275_1299) et l’utilisation d’un gestionnaire d’erreurs comme On Error GoTo. En pratique, la robustesse dépend d’une vérification précoce de l’existence du répertoire correspondant à la valeur et d’un contrôle explicite des extensions, afin d’éviter les boucles et les ouvertures erronées.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. melanie1324
     
    j'ai fait une erreur, c'est celui-ci :

    Private Sub CommandButton5_Click()
    Dim QuelFichier
    Dim serie As String
    serie = TextBox2
    quelfichier = Dir "X:\CAD\Export_Data\Fichiers_Testeurs\" & serie & "\Map everest.wcf"
    If quelfichier <> "" Then
    MsgBox QuelFichier
    Else
    MsgBox "Vous n'avez pas sélectionné de fichier"
    End If
    End Sub
    1
    1. melanie1324
       
      Pour un sous dossier, tu peux t'arrêter à :
      quelfichier = Dir "X:\CAD\Export_Data\Fichiers_Testeurs\" & serie
      0
    2. Anthony
       
      merci pour tes réponses. le truc c'est que je ne connais pas le répertoire contenant le dossier ayant le nom de la textbox2
      X:\CAD\Export_Data\Fichiers_Testeurs\D1275_1299\1293

      partie des répertoires fixes : X:\CAD\Export_Data\Fichiers_Testeurs\
      textbox2 = 1293
      par contre D1275_1299 serait le dossier D900_924 si textbox2=900
      donc la recherche se fait sur un nom contenu dans un répertoire variable
      0
  2. melanie1324
     
    Bonjour,
    tu mets la valeur de ta textbox dans une variable :

    varibale = textbox(....)
    et quand tu écris pour ouvrir ton fichier :
    "C:\Users\thony\Desktop\D1230_1265\" & variable
    0
    1. Anthony
       
      Bonjour,

      j'ai bien peur de ne pas être au niveau requis :-(
      voici le code que j'ai écrit mais ça plante (runtime error 76, path not find)

      Private Sub CommandButton5_Click()
      Dim QuelFichier
      Dim serie As String
      serie = TextBox2
      ChDrive ("X") 'lettre du lecteur sur lequel on cherche.
      ChDir "X:\CAD\Export_Data\Fichiers_Testeurs" & serie
      QuelFichier = Application.GetOpenFilename("Map everest,*.wcf")
      If QuelFichier <> False Then
      MsgBox QuelFichier
      Else
      MsgBox "Vous n'avez pas sélectionné de fichier"
      End If
      End Sub

      le fichier a trouver se trouve dans un sous dossier variable selon la valeur de la textbox
      0
  3. melanie1324
     
    Re,
    Essaie avec ce code la :

    Private Sub CommandButton5_Click()
    Dim QuelFichier
    Dim serie As String
    serie = TextBox2
    quelfichier = Dir "X:\CAD\Export_Data\Fichiers_Testeurs\" & serie & "\Map everest.wcf"
    If dir <> "" Then
    MsgBox QuelFichier
    Else
    MsgBox "Vous n'avez pas sélectionné de fichier"
    End If
    End Sub
    0
  4. melanie1324
     
    bonsoir,

    ca serait possible d'écrire le code, si vos dossiers étaient
    DXXX_1299

    car le code serait :
    quelfichier = Dir "X:\CAD\Export_Data\Fichiers_Testeurs\D" & serie & "_1299"

    sauf que vous c'est DXXX_001, DXXX_002...
    vous avez bcp de dossiers?
    0
    1. anthony
       
      il y a environ 50 dossiers du type DXXX_XXX et dans chacun de ces dossiers autant de sous dossiers que la série entre les deux chiffres
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. melanie1324
     
    Bonjour,

    Private Sub CommandButton5_Click()
    Dim QuelFichier
    Dim serie As String
    dim fso As Object, Dossier As Object
    Dim sousRep As Object, Flder As Object

    serie = TextBox2
    'définit ton répertoire de travail
    LeDossier = "X:\CAD\Export_Data\Fichiers_Testeurs\"
    quelfichier = ""
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set Dossier = fso.GetFolder(LeDossier)
    'examen du répertoire courant
    For Each Flder In Dossier.subfolders 'pour chacun de tes sous dossiers
    if left(flder,len(serie)+2+len(LeDossier) = Ledossier & "\D" & serie
    quelfichier =1
    end if

    Next

    If quelfichier <> "" Then
    MsgBox QuelFichier
    Else
    MsgBox "Vous n'avez pas sélectionné de fichier"
    End If

    end sub

    Ca va parcourir tous tes sous dossiers. est-ce que ca marche?
    0
  7. melanie1324
     
    Au cas ou, avant le if left...
    écrit :
    a = left(flder,len(serie)+2+len(LeDossier)
    b = Ledossier & "\D" & serie

    et appuie sur F8, lorsque tu a spassé ces deux lignes, positionne ta souris sur a et b et regarde à quoi c'est égal.
    Pour info :
    len(x) = nombre de caractères d'une variable
    left(x,y) = prend la gauche de la variable sur y caractères

    exemepl : left("abcd",1 ) = "a"
    left("abc",3) = "abc"
    0
    1. Anthony
       
      merci à toi de prendre du temps pour m'aider
      je te joins le fichier, ça sera plsu simple pour toi pour contrôler.
      http://www.cijoint.fr/cjlink.php?file=cj201101/cijEB3QweK.xls
      j'ai intégré ton code dans le bouton 6, comme ça tu vois ce que j'avais essayé auparavant avec le bouton 5
      0
    2. Anthony
       
      a = "X:\CAD\Export_Data\Fichiers_Testeurs\D1"
      b = "X:\CAD\Export_Data\Fichiers_Testeurs\\D1"
      j'ai enlevé le \ dans la formule de b
      il semble que la recherche se fasse car il y a quelques secondes de latence et il m'affiche la boîte de dialogue m'indiquant que je n'ai sélectionné aucun fichier
      0
  8. melanie1324
     
    Bonjour,
    j'ai fait une petite erreur :
    remplace cette ligne :
    if left(flder,len(serie)+2+len(LeDossier) = Ledossier & "\D" & serie

    par
    if left(flder,len(serie)+2+len(LeDossier) = Ledossier & "D" & serie

    Le mieux est que tu fasses des tests et vois si ca marche car je vais pas avoir bcp de temps aujourd'hui pour regarder ton fichier.
    Dis moi si ca te donne le résultat escompté.
    1
    1. Anthony
       
      a = "X:\CAD\Export_Data\Fichiers_Testeurs\D1600_"
      b = "X:\CAD\Export_Data\Fichiers_Testeurs\D1293"
      et il faudrait que ce soit X:\CAD\Export_Data\Fichiers_Testeurs\D1275_1299\1293
      0
  9. Anthony
     
    par contre je me rends compte qu'il y a une logique de nomenclature des dossiers après X:\CAD\Export_Data\Fichiers_Testeurs\
    c'est par série, ça commence avec le premier dossier
    D750_774
    D775_799
    D800_824 .....

    D2625_2649
    D2650_2674

    donc on a une série de 24, est ce que ça peut aider à définir dans quel répertoire trouver le dossier = textbox2 ?
    0
  10. melanie1324
     
    Oui, ca aide beaucoup plus :

    Private Sub CommandButton5_Click()
    Dim QuelFichier
    Dim serie As String
    serie = TextBox2
    variable = 750
    QuelFichier = "X:\CAD\Export_Data\Fichiers_Testeurs\ D"

    Do While variable < 999999999
    If Dir(QuelFichier & variable & "_" & variable + 24 & "\" & serie & "\Map everest.wcf") <> "" Then

    variables = variable
    variable = 999999999 + 1

    End If
    variable = variable + 1
    Loop

    If variables <> "" Then
    MsgBox "X:\CAD\Export_Data\Fichiers_Testeurs\D" & variables & "_" & variables + 24 & "\" & serie & "\Map everest.wcf"
    Else
    MsgBox "Vous n'avez pas sélectionné de fichier"
    End If
    End Sub

    On devrait y arriver non?
    0
    1. anthony
       
      il cherche mais rien ne se passe rien même après 5 minutes
      0
  11. melanie1324
     
    Bonjour,

    entre Do While variable < 999999999 et

    If Dir(QuelFichier & variable & "_" & variable + 24 & "\" & serie & "\Map everest.wcf")

    ajoute a = QuelFichier & variable & "_" & variable + 24 & "\" & serie & "\Map everest.wcf"

    fait F8.
    La valeur de a est-elle conforme à tes dossiers?
    0
    1. Anthony
       
      hello
      ça m'affiche X:\CAD\Export_Data\Fichiers_Testeurs\D750_754\1296
      au lieu de X:\CAD\Export_Data\Fichiers_Testeurs\D1275_1299\1296
      donc visiblement il ne fait pas le recherche sur les dossiers en D
      en si en fait je commence à réfléchir, en fait c'est bon, il inscrit bien la bonne nomenclature et c'est ensuite que la boucle va se faire
      0
    2. Anthony
       
      re
      j'ai modifié ton code et je commence à comprendre pourquoi tu m'as fait rajouter la ligne
      a = ......
      j'ai intégré un break point après le loop et j'ai fait du pas à pas en regardant la valeur que prend a à chaque tour.
      donc ça basculait de 750, 751, 752
      du coup j'ai modifié le +1 en +25 et j'obtiens les noms de dossiers comme dans mon répertoire
      End If
      variable = variable + 25
      Loop

      j'ai enlevé le break point et lancé la macro. il y a le sablier et ça ne répond plus :-(
      0
    3. Anthony
       
      je pense comprendre en faisant le pas à pas, en fait la boucle perdure sans vérifier que 1293 (valeur textbox) est bien dans le dossier D1275_1299
      la boucle se poursuit.
      que faut il écrire pour lui faire comprendre qu'on est dans le bon dossier et que la boucle s'arrête pour ouvrir ce dossier 1293 dans le répertoire D1275_1299 ?
      0
  12. melanie1324
     
    pour que la boucle s'arrête :
    tu dis variables = variable (pour enregistrer la bonne valeur)
    et que variable = 999999999 + 1

    mais la macro est longue parce que la boucle tourne jusqu'à ce qu'à
    variable soit supérieur à 999999999

    tu peux modifier ce chiffre et mettre la valeur que tu veux.

    Dir(QuelFichier & variable & "_" & variable + 24 & "\" & serie & "\Map everest.wcf") ==> regarde si le fichier Map everest.wcf est dans le dossier quelfichier\valeurvariable_valeurvariable+24

    a adapter.
    0
    1. Anthony
       
      Voici ce que j'ai fait

      Private Sub CommandButton7_Click()
      Dim QuelFichier
      Dim serie As String
      serie = TextBox2
      variable = 750
      QuelFichier = "X:\CAD\Export_Data\Fichiers_Testeurs\D"

      Do While variable < 999999999
      a = QuelFichier & variable & "_" & variable + 24 & "\" & serie & "\"
      If serie <= variable + 24 Then
      Application.Dialogs(xlDialogOpen).Show a
      Else

      End If

      variable = variable + 25
      Loop

      End Sub

      le truc c'est que ça m'ouvre bien la fenêtre de sélection mais pas dan sle répertoire qu'on vient de définir, ça ouvre dans "mes documents" (sauf que j'ai les extensions xls alors qu'il me faudrait seulement les fichiers en .wcf) et la fenêtre s'ouvre perpétuellement comme si ça bouclait dessus.

      je ne sais pas si j'utilise les bons codes, le but étant d'ouvrir le dossier ayant le nom de la textbox2
      0
  13. melanie1324
     
    Private Sub CommandButton7_Click()
    Dim QuelFichier
    Dim serie As String
    serie = TextBox2
    variable = 750
    QuelFichier = "X:\CAD\Export_Data\Fichiers_Testeurs\D"

    Do While variable < 999999999
    a = QuelFichier & variable & "_" & variable + 24 & "\" & serie & "\"
    If dir(a,vbdirectory)<>"" Then

    chdir (a)
    Application.Dialogs(xlDialogOpen).Show
    Else

    End If

    variable = variable + 25
    Loop

    End Sub

    Je n'ai pas trouvé pour l'extension. désolée
    0
    1. Anthony
       
      je susi navré pour le temps que je te prends car tu dosi avoir bien plus urgent à faire.
      en tous les cas je te remercie de ton aide car les choses ont considérablement avancé grâce à toi.

      c'est étrange, ça m'ouvre bien l'explorer mais dns le dossier "mes documents"
      et quand je fais annuler sur la fenêtre de l'explorer, ça fait planter excel
      0
    2. Anthony
       
      voilà ce que j'ai fait et là pas trop de soucis
      Private Sub CommandButton7_Click()
      Dim QuelFichier
      Dim serie As String
      Dim trouve
      serie = textbox2
      variable = 750
      QuelFichier = "X:\CAD\Export_Data\Fichiers_Testeurs\D"

      Do While variable < 999999999
      a = QuelFichier & variable & "_" & variable + 24 & "\" & serie & "\"
      If serie <= variable + 24 Then
      'If Dir(a, vbDirectory) <> "" Then
      ChDrive ("X")

      ChDir (a)
      trouve = Application.GetOpenFilename("Map everest,*.wcf", , Ouvrir)
      'Application.Dialogs(xlDialogOpen).Show
      Else

      End If

      variable = variable + 25
      Loop

      End Sub

      quand je fixe uen valeur serie = 960 ça ne fait plus planter excel en utilisant getOpenFileName et je peux lui préciser l'extension.
      et j'ai rajouté chdrive avant chdir, ça m'ouvre bien le dossier
      par contre quand je fais serie = textbox2 ça me dit que le path n'est pas trouvable et en effet quand je regarde la valeur de a il reste bloqué sur le dossier D750_774 alors que la valeur est 2622, en fait visiblement la boucle ne se fait plus
      je ne comprends plus rien
      0
  14. melanie1324
     
    re,

    il faudrait avant le end sub que tu écrives
    quelfichier =""
    serie =""
    a =""
    variable = ""
    et vois si ca le refait. Sinon, j'ai pas d'explications.

    J'essaie de t'aider un maximum mais c'est pas évident!
    0
  15. melanie1324
     
    et regarde la valeur de trouve en pas à pas (F8) si ca se trouve, y unpb sur l'une des variables.
    0
    1. anthony
       
      j'ai rajouté ce que tu m'as demandé et j'arrive à ça
      quelfichier OK
      serie OK
      a OK (j'ai bien le bon dossier et sous dossier)
      variable OK (ici 900 pour serie = 921)
      par contre l'explorer ne s'ouvre pas sur le bon dossier
      0
    2. anthony
       
      second essai avec serie = 1294
      toutes les valeurs de contrôle sont bonnes mais le dossier qui s'ouvre n'est pas le bon et ça freeze excel, t'es obligé d'aller dans le gestionnaire de tâche pour refermer
      0
    3. anthony
       
      ok c'est résolu
      effectivement excel plantait car la boucle ne finissait jamais.
      j'ai inséré un EXIT SUB
      Application.Dialogs(xlDialogOpen).Show
      exit sub
      Else

      Merci infiniment melanie1324, tu es une chef ;-) car la boucle pour trouver le dossier parent c'est topissime
      0
  16. melanie1324
     
    Je suis désolée que ca ait pris autant de temps. J'ai cru qu'on allait jamais y arrivé. C'est pas évident à distance.
    en tout cas, heureuse que tu ais obtenu le résultat escompté.
    0
    1. Anthony
       
      en tous les cas tu es tenace et je t'en remercie
      0
    2. anthony
       
      Bonsoir Mélanie

      les utilisateurs sont tombés sur le cas qui déroge ^^
      textbox 2 = 1451
      Ce répertoire existe X:\CAD\Export_Data\Fiches_liaison\D1450_1474
      par contre il n'y a pas de sous dossier 1451 existant, la macro leur a affiché une erreur 52, bad name or number et du coup la panique car ne sachant pas quoi faire.
      comment éviter que le débuguer s'affiche avec cette erreur et qu'à la place j'ai un message prévenant que le dossier ayant le nom de la textbox2 n'existe pas ?


      Private Sub CommandButton5_Click()
      Dim QuelFichier
      Dim serie As String
      Dim trouve
      serie = TextBox2
      variable = 750 'correspond au n° du premier dossier
      QuelFichier = "X:\CAD\Export_Data\Fiches_liaison\D" 'répertoire contenant les dossiers

      Do While variable < 9999
      a = QuelFichier & variable & "_" & variable + 24 & "\" & serie & "\" 'défini la structure des répertoire de recherche
      If Dir(a, vbDirectory) <> "" Then
      ChDrive ("X") 'précise le disque dans lequel chercher
      ChDir (a) 'précise les répertoires dans lesquels se placer

      trouve = Application.GetOpenFilename("Map pdf,*.pdf", , Ouvrir) 'ouvre la fenêtre d'exploration avec l'extension du fichier précisée

      Exit Sub 'met fin à la macro sans quoi excel plante
      Else

      End If

      variable = variable + 25 'définit la valeur qu'il faut ajouter pour passer au dossier suivant
      Loop

      Exit Sub 'met fin à la macro sans quoi excel plante
      End Sub


      juste par curiosité. quand le dossier existe, ça m'ouvre donc la fenêtre avec les fichiers en pdf accessible, par contre quand je sélectionne celui que je veux et je fais "open" rien ne se passe. pour que je puisse accéder au fichier dans acrobat, je dosi faire clic droit et open et là ça s'ouvre. que faut il faire pour que ça s'ouvre directement sans le clic droit ?

      merci à toi si tu as le temps de voir
      0
  17. melanie1324
     
    Bonjour,

    Pour ta seonde question, le mieux est que tu recherches sur google "ouvrir pdf vba excel" je pense que tu touveras le code correspondant (j'ai pas le temps de le faire)

    sinon modifie ta macro comme suit :
    Private Sub CommandButton5_Click()
    Dim QuelFichier
    Dim serie As String
    Dim trouve
    serie = TextBox2
    variable = 750 'correspond au n° du premier dossier
    QuelFichier = "X:\CAD\Export_Data\Fiches_liaison\D" 'répertoire contenant les dossiers

    Do While variable < 9999
    a = QuelFichier & variable & "_" & variable + 24 & "\" & serie & "\" 'défini la structure des répertoire de recherche
    If Dir(a, vbDirectory) <> "" Then
    ChDrive ("X") 'précise le disque dans lequel chercher
    ChDir (a) 'précise les répertoires dans lesquels se placer

    trouve = Application.GetOpenFilename("Map pdf,*.pdf", , Ouvrir) 'ouvre la fenêtre d'exploration avec l'extension du fichier précisée

    if trouve = "" then
    msgbox ("Vous n'avez sélectionné aucun fichier")
    end if

    Exit Sub 'met fin à la macro sans quoi excel plante
    Else

    End If

    variable = variable + 25 'définit la valeur qu'il faut ajouter pour passer au dossier suivant
    Loop

    Exit Sub 'met fin à la macro sans quoi excel plante
    End Sub
    0
    1. anthony
       
      hello
      ça ne donne rien, ça serait valable si on avait l'exploreur et qu'on ne sélectionnait aucun fichier.
      là le pb rencontré, c'est que le dossier cherché n'existe pas et il faudrait un msgbox qui indique "ce dossier n'existe pas"
      je n'arrive pas à savoir comment le traduire et où le placer sinon j'ai la boucle qui ne se fait plus en m'indiquant "loop without do"
      0
  18. melanie1324
     
    juste par curiosité si tu écris :
    ChDrive ("X") 'précise le disque dans lequel chercher
    ChDir (a) 'précise les répertoires dans lesquels se placer

    zz = chdir(a)

    A quoi est égal zz quand le dossier n'existe pas?
    Il me semble à ""
    si c'est le cas

    if chdir(a) = "" then
    msgbox("dossier inexistant")
    else
    trouve =....
    end if
    0
    1. anthony
       
      il me dit que c'est une expected function or variable
      j'ai écrit zz = dir(a) et là plus d'erreur
      a = X:\CAD\Export_Data\Fiches_liaison\D9975_9999\1451
      0
  19. melanie1324
     
    Bonjour,

    le plussimple, envois ton fichier sur ci-joint.fr
    0
    1. anthony
       
      j'ai trouvé une parade en rajoutant en début de code
      on error goto erreur

      et avant le end sub j'ai indiqué
      erreur :
      msgbox ("Le dossier de la série " & serie & " n'existe pas !")
      du coup ça pallie le débogueur mais maintenant si un autre bug pointe son nez il n'y a plus moyen de connaître le type d'erreur.
      mais je ne suis pas inquiet, c'est un très bon code que tu as fait là :-)

      là j'ai pas la bonne version du prgramme, si tu veux vraiment y jeter un oeil je peux te l'envoyer demain
      0
    2. anthony
       
      http://www.cijoint.fr/cjlink.php?file=cj201102/cijRC3TqRx.xls
      0
  20. melanie1324
     
    C'est aussi une solution.
    J'ai essayé de faire de mon mieux et hier, j'avais pas bcp de temps.
    Mais si maintenant tout est nickel. Tant mieux.
    et c'est dans des cas comme le tien qu'on apprend le langage vba et ca sert toujours crois moi
    0