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 :

Bouton Parcourir un dossier et non un fichier


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Points : 29
    Points
    29
    Par défaut Bouton Parcourir un dossier et non un fichier
    Bonjour,

    J'ai fais un bouton Parcourir afin de choisir un dossier (et non un fichier), et j'aimerai récupérer le chemin de ce dossier et de le mettre dans une variable que je réutiliserai ensuite.

    J'ai vu beaucoup d'infos sur comment choisir un fichier comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim QuelFichier
    QuelFichier = Application.GetOpenFilename(, , "Choisir un fichier")
    A la place du fichier, est-il possible de récupérer un dossier donc du coup, son arborescence ?
    Merci d'avance pour vos réponses.

  2. #2
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Il y a une rubrique dans la FAQ VB6 dont, je crois bien, le code proposé sera utilisable aussi en VBA.

    Comment ouvrir une fenêtre de sélection de répertoire ?

    S'il y a un problème, tu dis.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Points : 29
    Points
    29
    Par défaut
    Peut etre qu'il faut l'adapter ... Je suis néophyte dans ce domaine.
    Ce que j'ai fait, j'ai copié le 1er code dans un module

    Mais il me donne cette erreur:
    "Erreur de compilation: Seuls des commentaires peuvent apparaître après End Sub, End Function, ou End Property"

    Il surligne: Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long

    N'y a t-il pas une méthode VBA ?

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Ce qui veut dire que tu as placé la déclaration dans une procédure, ou après une procédure, ce qu'il ne faut pas faire !

    Les déclarations et les constantes doivent être placées tout en haut de ta page de code, AVANT toute procédure...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Points : 29
    Points
    29
    Par défaut
    Bonjour.
    J'ai bien reçu le message, merci.

    Par contre, a force de chercher, pour ceux que ça intéresse j'ai trouvé la méthode:

    Hop, on fait un bouton Parcourir, dans la Feuil1, on lui donne:
    Sub Parcourir()
    GetDirectory
    End Sub

    GetDirectory se chargera de récup le dossier:

    Dans le module:
    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
    39
    40
    41
    42
    43
     
    Public Type BROWSEINFO
    hOwner As Long
    pidlRoot As Long
    pszDisplayName As String
    lpszTitle As String
    ulFlags As Long
    lpfn As Long
    lParam As Long
    iImage As Long
    End Type
    '32-bit API declarations
    Declare Function SHGetPathFromIDList Lib "shell32.dll" _
    Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
    Declare Function SHBrowseForFolder Lib "shell32.dll" _
    Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
     
     
    Public Dossier
     
    Function GetDirectory(Optional Msg) As String
    Dim bInfo As BROWSEINFO
    Dim path As String
    Dim r As Long, X As Long, pos As Integer
    bInfo.pidlRoot = 0&
    If IsMissing(Msg) Then
    bInfo.lpszTitle = "Choisissez un dossier de destination pour les sauvegardes."
    Else
    bInfo.lpszTitle = Msg
    End If
    bInfo.ulFlags = &H1
    X = SHBrowseForFolder(bInfo)
    path = Space$(512)
    r = SHGetPathFromIDList(ByVal X, ByVal path)
    If r Then
    pos = InStr(path, Chr$(0))
    GetDirectory = Left(path, pos - 1)
    Dossier = GetDirectory & "\"
    Else
    GetDirectory = ""
    End If
     
    End Function
    Tout ceci a été récupéré de divers docs excel que j'ai pu "analyser".

    Cependant, maintenant que j'ai stocké le chemin dans la variable "Dossier".
    Je ne parviens pas a l'utiliser correctement. Exemple:

    .Range("C11").Formula = "='C:\Divers\excel\[" & Tableau(X) & "]Feuil1" & "'!" & "K78"

    Dans ce code, grâce au tableau (ou sont stockés tous les fichiers Excel), il va récupérer la cellule K78 de tous ces fichiers et les placer dans C11.

    Cependant, l'interet d'avoir fait un bouton Parcourir est justement d'avoir fait en sorte que C:\Divers\excel\ ne soit pas en dur dans le code. A la place, je souhaiterai mettre la variable "Dossier" mais syntaxiquement je n'y parviens pas ...

    Comment faire ?
    Merci d'avance

  6. #6
    Expert éminent sénior

    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
    Points : 20 147
    Points
    20 147
    Par défaut
    bonsoir

    Tu peux tester cette autre version :


    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
     Dim objShell As Object, objFolder As Object
     Dim oFolderItem As Object
     Dim Chemin As String
     Dim Tableau(1 To 1) As String
     
    Tableau(1) = "ClasseurFerme.xls"
     
     Set objShell = CreateObject("Shell.Application")
     Set objFolder = objShell.BrowseForFolder(&H0&, _
         "Choisir un répertoire", &H1&)
     
     If objFolder Is Nothing Then Exit Sub
     Set oFolderItem = objFolder.Items.Item
     Chemin = oFolderItem.Path
     If Len(Chemin) = 3 Then Chemin = Left(Chemin, 2)
     If Dir(Chemin & "\" & Tableau(1)) = "" Then Exit Sub
     
     Range("C11").Formula = "='" & Chemin & _
         "\[" & Tableau(1) & "]Feuil1'!K78"


    bonne soirée
    michel

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonsoir,

    je me demande pourquoi l'on boude VB ...
    Dir associé à un TreeView fait pourtant très joliment l'affaire, non ?

    Edit :
    Ainsi, par exemple :
    Un userform, un Treeview Treeview1, un bouton de commande Command1

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     Option Explicit
       Dim tvn As Node
     
    Private Sub Command1_Click()
       Dim monrep As String
       TreeView1.Nodes.Clear
       monrep = "d:\monoutil\"  ' on définit ici le répertoire à "déployer"
       If Right$(monrep, 1) <> "\" Then monrep = monrep$ + "\"
       Set tvn = TreeView1.Nodes.Add(, vbNullString, monrep, monrep)
       deployons monrep
    End Sub
     
    Sub deployons(ByVal chemin As String)
      Dim nomfic As String, numfic As Integer, tp As String, i As Integer
      If Right$(chemin, 1) <> "\" Then chemin = chemin & "\"
      nomfic = Dir$(chemin, vbDirectory)
      numfic = 1
      Do While nomfic <> ""
        If nomfic <> "." And nomfic <> ".." Then
          tp = chemin & nomfic
          If GetAttr(tp) And vbDirectory Then
            Set tvn = TreeView1.Nodes.Add(chemin, tvwChild, tp + "\", nomfic)
            deployons tp
            nomfic = Dir$(chemin, vbDirectory)
            For i = 2 To numfic
              nomfic = Dir$
            Next
          End If
        End If
        nomfic = Dir$: numfic = numfic + 1
       Loop
    End Sub
     
    Private Sub TreeView1_DblClick()
       MsgBox TreeView1.SelectedItem.FullPath
    End Sub
    On lance, on déploie comme on l'entend ...
    Un double clixk sur un item de son choix ... on voit...

    EDIT :
    L'intérêt d'une telle méthode est (je viens de la compléter chez moi dans ce sens) que l'on peut choisir ce que l'on va afficher :
    - tout (dossiers et fichiers)
    - uniquement les dossiers
    - uniquement les fichiers
    avec (cerise sur le gâteau) :
    - un filtre pour les noms de dossiers
    - un filtre pour les noms de fichier
    (on peut donc de cette manière, par exemple, n'afficher que les dossiers contenant la chaîne "RA" et leurs fichiers en extension "txt" (tout le reste étant donc occulté).

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Points : 29
    Points
    29
    Par défaut
    Merci bien, ça fonctionne.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Points : 29
    Points
    29
    Par défaut
    Désolé, mais j'ai une petite question encore :p

    Si je souhaite calculer la cellule K78 avec K79 par exemple dans la Formula, c'est possible ?

    En faisant cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("C11").Formula = "='" & Chemin& "[" & Tableau(1) & "]Feuil1'!K78"
    Il m'affiche bien dans la cellule C11 la valeur de K78 du fichier (représenté par le tableau ici).
    Cependant, si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("C11").Formula = "='" & Chemin& "[" & Tableau(1) & "]Feuil1'!K78+K79"
    Il va laisser la valeur de K78. Mais si je fais K78+1 il ajoutera bien le 1... Bon, du coup je tente d'utiliser SUM dans la formula. J'essaie des choses comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("C11").Formula = "='" & Chemin& "[" & Tableau(1) & "]Feuil1'!" = Sum(HK78 & ":" & H79)""
    Mais peu importe, rien ne passe, je dois avoir un vrai problème avec la syntaxe de VBA... :s


    merci beaucoup pour vos remarques.

  10. #10
    Expert éminent sénior

    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
    Points : 20 147
    Points
    20 147
    Par défaut
    bonsoir

    Tu peux utiliser cette syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Range("C11").Formula = "='" & Chemin & _
         "\[" & Tableau(1) & "]Feuil1'!K78+'" & Chemin & _
         "\[" & Tableau(1) & "]Feuil1'!K79"

    bonne soirée
    michel

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Points : 29
    Points
    29
    Par défaut
    Perfecto !
    Résolu de chez résolu.

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

Discussions similaires

  1. Parcourir un dossier et lire les fichier 1 par 1.
    Par jamsgoodon dans le forum Débuter
    Réponses: 15
    Dernier message: 08/02/2011, 11h06
  2. parcourir des dossiers et choisir un fichier
    Par juju44 dans le forum Macro
    Réponses: 3
    Dernier message: 11/04/2009, 18h33
  3. comment sélectionner un dossier et non un fichier
    Par edenreal dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 20/02/2009, 16h29
  4. Réponses: 3
    Dernier message: 15/05/2008, 15h22
  5. Réponses: 1
    Dernier message: 31/10/2005, 09h33

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