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 :

Création arborescence de dossier


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Création arborescence de dossier
    Bonjour à toutes et à tous !

    Je vous remercie pour l'aide précieuse que vous m'avez apporté sur des précédents topic mais je n'arrive toujours pas à réaliser ma solution c'est pour cela que je me tourne vers vous

    Je veux mettre en place un script sur VBA qui me permettrai de créer une arborescence de dossier et de sous dossier en fonction du contenu d'un tableur Excel et en fonction du chemin que l'utilisateur choisira.

    Voici à quoi ressemble mon tableur :

    Nom : TOTO.png
Affichages : 1378
Taille : 14,6 Ko

    Le but est de créer une arborescence à partir d'un chemin que l'utilisateur choisi, il faudrait que le script ne prenne pas en compte la 1ère ligne et commence à partir de la deuxième.
    Il faudrait également, pour la création des dossiers, fusionner les cellules A2 "ajouter un _" B2, notre dossier maître serait donc 1_TITI.
    Puis on créer dans 1_TITI, le dossier 1.1_Produit A, puis 1_2 Produit B, etc

    Mon code me permet de récupérer le chemin que l'utilisateur choisi mais impossible de créer cette arborescence dedans :/

    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
    Sub test_creation()
     
        Dim retour As Long
        retour = MsgBox(Prompt:="Merci de m'indiquer le chemin où je dois créer l'arborescence s'il vous plaît", Buttons:=vbYesNo)
        'Si on a cliqué sur Oui pour que l'utilisateur puisse écrire le chemin
     
        If retour = vbYes Then
            Dim chemin As String
            chemin = InputBox(Prompt:="Chemin : ")
            MsgBox (chemin)
     
            Dim confirmation As String
            confirmation = MsgBox(Prompt:="Confirmez-vous le chemin que vous venez d'écrire ?", Buttons:=vbYesNo)
     
            If confirmation = vbYes Then
                MsgBox "Je m'occupe de la création des dossier"
            Else
                MsgBox "Je vous prie de recommencer depuis le début"
            End If
     
        Else
            MsgBox "Merci de relancer le script pour créer l'arborescence"
        End If
    Si vous avez besoin de plus d'informations, n'hésitez pas à répondre sur ce topic ou m'envoyer un message

    Cordialement, bonne journée.

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,


    Exemple de TreeView

    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
    Dim tw As MSComctlLib.TreeView
    Dim n, Rng
    Private Sub UserForm_Initialize()
      Set Rng = Range("A2:C" & [A65000].End(xlUp).Row)
      pere = "0"
      nomPere = Application.VLookup(pere, Rng, 2, False)
      Set tw = Me.MonArbre
      n = Rng.Rows.Count
      tw.Nodes.Add(, , "NoeudMat" & pere, nomPere).Expanded = True    ' Racine arbre
      Fils pere
    End Sub
     
    Sub Fils(parent)       ' procédure récursive
      For i = 2 To n
        cd = CStr(Rng(i, 1))
        niv = Len(cd) - Len(Replace(cd, ".", ""))
        If niv = 0 Then temp = "0" Else p = InStrRev(cd, ".") - 1: temp = Left(cd, p)
        If temp = parent Then
          tw.Nodes.Add("NoeudMat" & parent, tvwChild, "NoeudMat" & _
            CStr(Rng(i, 1)), CStr(Rng(i, 1)) & ": " & Rng(i, 2) & "-").Expanded = True
          Fils CStr(Rng(i, 1))
        End If
      Next i
    End Sub

    Boisgontier
    Fichiers attachés Fichiers attachés

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse rapide !

    Lorsque j'essaye d’exécuter le code, il m'indique
    Erreur de compilation: Type défini par l'utilisateur non défini
    En surlignant cette phrase Dim tw As MSComctlLib.TreeView.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Voici mon code pour récupérer le chemin mais le seul hic est la création des dossiers :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    Sub test_creation()
     
        Dim retour As Long
        retour = MsgBox(Prompt:="Merci de m'indiquer le chemin où je dois créer l'arborescence s'il vous plaît", Buttons:=vbYesNo)
        'Si on a cliqué sur Oui pour que l'utilisateur puisse écrire le chemin
     
        If retour = vbYes Then
            Dim Chemin As String
            Chemin = InputBox(Prompt:="Chemin : ")
     
            Dim confirmation As String
            confirmation = MsgBox(Prompt:="Confirmez-vous le chemin que vous venez d'écrire ?", Buttons:=vbYesNo)
            MsgBox (Chemin)
     
            If confirmation = vbYes Then
                MsgBox "Je m'occupe de la création des dossier"
            Else
                MsgBox "Je vous prie de recommencer depuis le début"
            End If
     
        Else
            MsgBox "Merci de relancer le script pour créer l'arborescence"
        End If
     
        Dim FSO As Object, Dossier As Object
        Dim oWSS As Object, oGenvag As Object
        Dim C As Range
     
        Set oWSS = CreateObject("WScript.Shell")
     
        chemin_creation = Chemin
     
        Set oWSS = Nothing
        Set FSO = CreateObject("Scripting.FileSystemObject")
        On Error Resume Next
        Set Dossier = FSO.GetFolder(chemin_creation & "\F")
        If Not Dossier Is Nothing Then
            MsgBox "Le dossier F existe"
            Exit Sub 'Si le dossier F existe déjà, le programme s'arrête
     
            Application.Wait (Now + TimeValue("0:00:03"))  'pause
     
        End If
     
     
        MkDir chemin_creation & "\F"
        ChDir chemin_creation & "\F"
        For Each C In Range([A2], Cells(Rows.Count, 1).End(xlUp))
            ChDir chemin_creation & "\F"
            For i = 1 To 100
                If Cells(C.Row, i).Value = "" Then Exit For
                If Cells(C.Row, i + 1) <> "" And Cells(C.Row, i) <> Cells(C.Row - 1, i) Then
     
                    MkDir CurDir & "\" & Cells(C.Row, i)
                    Application.Wait (Now + TimeValue("0:00:03"))  'pause
     
                    ChDir CurDir & "\" & Cells(C.Row, i)
                    Application.Wait (Now + TimeValue("0:00:03"))  'pause
     
                Else
                    ChDir CurDir & "\" & Cells(C.Row, i)
                End If
            Next i
        Next C
        On Error GoTo 0
        MsgBox "Finalisation"
    End Sub

    Avec ce code que j'ai récupéré sur un autre topic j'arrive à me déplacer sur le chemin voulu mais pas à créer les dossier en fonction du contenu de mon tableur :/

  5. #5
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello,
    Citation Envoyé par vodkysan Voir le message
    Merci pour ta réponse rapide !

    Lorsque j'essaye d’exécuter le code, il m'indique "Erreur de compilation: Type défini par l'utilisateur non défini"

    En surlignant cette phrase "Dim tw As MSComctlLib.TreeView"
    Dans VBA , dans le menu Outils/Références as-tu la référence Microsoft Windows Common Controls 6.0 qui apparaît et est-elle cochée ? :

    Nom : mscomctl.PNG
Affichages : 665
Taille : 22,8 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Hello !

    Je l'ai mais avec le service pack 4 et non le 6 :/

    Nom : TOTObis.png
Affichages : 628
Taille : 11,2 Ko

    Lorsque je lance le script, il m'indique une erreur avec le mot "Me"

    Nom : TOTObisbis.png
Affichages : 669
Taille : 12,6 Ko

    Cordialement

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Petite modification du 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    Sub test_creation()
     
        Dim retour As Long
        retour = MsgBox(Prompt:="Merci de m'indiquer le chemin où je dois créer l'arborescence s'il vous plaît", Buttons:=vbYesNo)
        'Si on a cliqué sur Oui pour que l'utilisateur puisse écrire le chemin
     
        If retour = vbYes Then
            Dim Chemin As String
            Chemin = InputBox(Prompt:="Chemin : ")
            Dim confirmation As String
            confirmation = MsgBox(Prompt:="Confirmez-vous le chemin que vous venez d'écrire ?", Buttons:=vbYesNo)
            MsgBox (Chemin)
     
            If confirmation = vbYes Then
                MsgBox "Je m'occupe de la création des dossier"
            Else
                MsgBox "Je vous prie de recommencer depuis le début"
                Exit Sub
            End If
        Else
            MsgBox "Merci de relancer le script pour créer l'arborescence"
        End If
     
        Dim FSO As Object, Dossier As Object
        Dim oWSS As Object, oGenvag As Object
        Dim C As Range
        Set oWSS = CreateObject("WScript.Shell")
        chemin_creation = Chemin
        Set oWSS = Nothing
        Set FSO = CreateObject("Scripting.FileSystemObject")
        On Error Resume Next
        Set Dossier = FSO.GetFolder(chemin_creation & "\F")
     
        If Not Dossier Is Nothing Then
            MsgBox "Le dossier F existe"
            Exit Sub 'Si le dossier F existe déjà, le programme s'arrête
            Application.Wait (Now + TimeValue("0:00:03"))  'pause
        End If
     
        'Pour copier le contenu de deux colonnes pour les fusionner en une seule
        For i = 1 To Range("A65536").End(xlUp).Row
            Range("a" & i) = Range("a" & i) & "_" & LTrim(Range("b" & i))
            Columns("B:B").ClearContents
        Next
     
        'Création répertoire F
        MkDir chemin_creation & "\F"
        ChDir chemin_creation & "\F"
     
        For Each C In Range("A65536", Cells(Rows.Count, 1).End(xlUp))
            ChDir chemin_creation & "\F"
            For i = 2 To 100
                If Cells(C.Row, i).Value = "" Then Exit For
                If Cells(C.Row, i + 1) <> "" And Cells(C.Row, i) <> Cells(C.Row - 1, i) Then
                    MkDir CurDir & "\" & Cells(C.Row, i)
                    Application.Wait (Now + TimeValue("0:00:03"))  'pause
                    ChDir CurDir & "\" & Cells(C.Row, i)
                    Application.Wait (Now + TimeValue("0:00:03"))  'pause
                Else
                    ChDir CurDir & "\" & Cells(C.Row, i)
                    Application.Wait (Now + TimeValue("0:00:03"))  'pause
                End If
            Next i
        Next C
        On Error GoTo 0
        MsgBox "Finalisation"
    End Sub
    Grosso modo, j'arrive à fusionner le contenu des deux colonnes en une seule.

    Je n'arrive toujours pas à créer les dossier en fonction du contenu de la colonne A, il me créer le répertoire F où je veux mais pas les dossier

    Help :/

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut.

    Perso, j'ajouterais une colonne au tableau pour créer le chemin complet du dossier. Après, une simple boucle crée les dossiers à la volée

    Nom : 2020-03-29_131023.png
Affichages : 789
Taille : 17,5 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub CreateFolders()
      Dim c As Range
     
      For Each c In Range("t_Dossiers[Chemin]")
        MkDir c.Value
      Next
    End Sub

    Attention. Je n'ai mis ici aucune sécurité. Cela implique que le dossier en G1 doit préexister, et que tu ne peux lancer la macro qu'une seule fois. C'est le concept que je te donne ici, qui est fidèle à ma signature (quand tu fais du vba pour Excel, pense Excel avant de penser VBA => Cette façon d'aborder les choses simplifie le code pour qui n'est pas programmeur de métier), pas le truc tout ficelé final.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Création arborescence dossiers
    Par nahelo dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 06/08/2019, 14h18
  2. [XL-2010] Création arborescence dossiers
    Par funkyf dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 08/02/2019, 15h06
  3. [XL-2007] Création arborescence dossiers et création de fichiers
    Par raneelbe dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 25/01/2019, 17h44
  4. Réponses: 2
    Dernier message: 09/11/2018, 14h56
  5. Création d'une arborescence de dossiers
    Par guidzit dans le forum Access
    Réponses: 4
    Dernier message: 25/09/2006, 09h14

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