[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 SubVous remerciant par avance pour votre aide les gens
Bonjour,
C'est :
strFolders = strFolders & "\" & Cells(objCell.Row, 1).ValueMais 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 SubHello 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) :
Puis de l'arborescence générée :
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 Subla 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 FunctionL 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 SubPour 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 SubRe !
Ç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é