[VBA] Création Arborescence

Salut à tous !

Je viens à vous car je débute dans le monde du VBA et j'ai besoin d'un petit coup de pouce.

Voilà, je me sers d'un fichier Excel pour générer une arborescence sur un serveur. Ça fonctionne nickel et j'en suis heureux

Seulement, dans le code ci-dessous, ma macro va piocher mes chenins d'arborescence dans TOUTES les lignes de TOUTES les colonnes de la feuille concernée. Hors, mes chemins en question ne sont que dans la colonne A.

Pour faire simple, comment adapter le code suivant pour que seule la colonne A soit sollicitée pour générer mon arborescence :

Sub Arbo_2018_19()
    Dim objRow As Range, objCell As Range, strFolders As String

    For Each objRow In Worksheets("Arbo 2018-19").UsedRange.Rows
        strFolders = "\\172.17.6.199\media\DPT Francophone\"
        For Each objCell In objRow.Cells
            strFolders = strFolders & "\" & objCell
        Next
        Shell ("cmd /c md " & Chr(34) & strFolders & Chr(34))
    Next
End Sub

Vous remerciant par avance pour votre aide les gens

Bonjour,

C'est :

strFolders = strFolders & "\" & Cells(objCell.Row, 1).Value

Mais le code ci-dessous donne le même résultat car le parcours des cellules d'un plage se fait de gauche à droite et de haut en bas :

Sub Arbo_2018_19()

    Dim objRow As Range, objCell As Range, strFolders As String

    strFolders = "\\172.17.6.199\media\DPT Francophone\"

    For Each objCell In Worksheets("Arbo 2018-19").UsedRange

        strFolders = strFolders & "\" & Cells(objCell.Row, 1).Value
        Shell ("cmd /c md " & Chr(34) & strFolders & Chr(34))

    Next

End Sub

Hello Theze et merci pour le retour

Alors, on avance ! Ça fonctionne en partie car ma macro ne récupère plus les données qui se trouvent en colonne B pour créer mon arborescence.

Toutefois, elle récupère du contenu en trop qui me crée deux sous-dossiers supplémentaires :/

Voici une capture de mon fichier Excel (avec les bons chenins en colonne A) :

capture 1

Puis de l'arborescence générée :

capture 2

Concernant ta proposition, quelle partie du code me permet de "délimiter" la plage de recherche ?

Encore merci

Bonjour,

Sans fichier c'est pas facile de voir mais il te faut savoir que "UsedRange" ne signifie pas la plage où il y a des données mais la plage qui est utilisée que ce soit en mettant des couleurs de cellule, des bordures ou n'importe quoi d'autre sur une cellule sans que celle-ci possède une quelconque valeur. Un exemple, tu prends une feuille vierge et tu colores l'intérieur de la cellule mettons K20 et tu exécutes ce code :

Sub Test()

    MsgBox ActiveSheet.UsedRange.Address(0, 0)

End Sub

la valeur retournée sera K20 maintenant, tu mets une couleur de fonte dans la cellule D10 sans qu'il y ai un seul caractère et tu exécute à nouveau le code, la réponse sera D10:K20 alors que ta feuille ne possède aucune valeur !

Conclusion, éviter UsedRange et préférer une fonction qui va chercher la valeur la plus basse et la plus à droite pour définir la plage comme celle-ci par exemple que j'utilise régulièrement depuis des années :

Function DefPlage(Fe As Worksheet, Optional L As Long = 1, Optional C As Long = 1) As Range

    On Error GoTo Fin

    With Fe

        Set DefPlage = .Range(.Cells(L, C), _
                       .Cells(.Cells.Find("*", .[A1], -4123, , _
                       1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
                       2, 2).Column))

    End With

    Exit Function

Fin:

    Set DefPlage = Nothing

End Function

L et C (optionnels) sont respectivement ligne et colonne de début de plage, par défaut c'est 1 et 1 donc, A1 mais tu peux définir ta plage plus bas

Fonction que tu appelles de cette façon :

Sub Test()

    Dim Plage As Range

    Set Plage = DefPlage(ActiveSheet)

    MsgBox Plage.Address(0, 0)

End Sub

Pour pouvoir t'aider, il faudrait que tu postes un fichier anonymisé pour que je comprenne mieux ta demande

Bonjour Theze et merci pour ce retour très détaillé

Je commence à y voir un peu plus clair mais c'est pas encore ça.

La macro que j'avais posté au début de ce sujet fonctionnait parfaitement avant car je n'avais des données qu'en colonne A mais le fait d'en avoir également en colonne B me pousse à devoir modifier cette fonctionnalité.

J'ai créé un fichier avec je l'espère les informations nécessaires pour créer cette fameuse macro.

Merci beaucoup !!

Il te suffit de vider la variable à chaque tour :

Sub Arbo_2019_20()

    Dim Plage As Range
    Dim objCell As Range
    Dim strFolders As String

    With Worksheets("Arbo 2019-20"): Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With

    For Each objCell In Plage

        strFolders = "\\172.17.6.199\media\DPT Francophone\"

        strFolders = strFolders & "\" & objCell.Value

        Shell ("cmd /c md " & Chr(34) & strFolders & Chr(34))

        strFolders = "" '<--- vider ici la variable !

    Next

End Sub

Re !

Ça maaaaaaaaaaaaaaaaaaaaaaaaaarche !!!!

Mille mercis Theze

Je ne saisis pas encore l'entièreté du code mais je vais m'y pencher car c'est bien pratique quand on fait du "batchworking"

Thanks again !

Content de t'avoir aidé

Rechercher des sujets similaires à "vba creation arborescence"