VBA Création sous-dossier lorsque cellule est remplie

Bonjour à tous,

J'aurais besoin de votre aide pour la création d'une macro.

Je souhaite, sur le fichier ci-dessous, créer un dossier portant le nom de la cellule A2 et qui se déclenche quand celle-ci se remplie. J'ai fait la formule qui affiche un résultat en A2 lorsque B2, C2, D2 et E2 sont remplies toutes les 4, mais je ne sais pas comment faire et déclencher la macro.

L'idée étant de pouvoir utiliser la macro sur toutes les cellules de la colonne A, le tableau étant complété au fur et à mesure.

Merci d'avance pour votre aide

11sdos-test.xlsx (9.63 Ko)

Est ce que ca pourrait t'aider déjà ?

Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("A:E") 'choisir la zone active

If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
If Cells(Target.Row, 1) <> "" Then MsgBox "Créer un dossier ?"

End If
End Sub

Bonjour,

Merci mais ce n'est pas exactement ce que je cherche, je voudrais que le dossier se créé automatiquement quand une cellule de la colonne A se remplie avec la formule.

Bonjour à tous,

Une proposition. Le dossier se crée dans le dossier contenant le fichier sdos-test.xlsm. A tester dans un dossier d'études.

18sdos-test.xlsm (15.51 Ko)

Ca fonctionne ! Super merci !

Est-il possible de mettre un debut de chemin d'accès que je puisse modifier pour mettre le fichier où je veux ?

Peux-tu m'expliquer, dans ton code, comment tu pointes vers la colonne A, je ne comprends pas ?

Vous pouvez mettre votre fichier où bon vous semble. Ne sachant pas où les dossiers doivent être créés par rapport à ce fichier, j'ai fait en sorte que les sous-dossiers soient créés dans le même dossier. Mais si vous savez exactement où il faut les créer, donnez-nous en le chemin absolu.

Dans mon code, on ne pointe jamais sur la colonne A, c'est votre formule qui crée l'événement.

Le code expliqué :

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim col As Integer, lign As Long ' n° de colonne et de ligne
    Dim fichier As String, chemin As String

    col = Target.Column ' le contenu d'une cellule de la feuille a changé
    If col < 2 Or col > 5 Then Exit Sub ' Si l'utilisateur a modifié une cellule de la colonne 1 ou > 5 on quitte (NOP)

    ' Le changement s'est produit dans la colonne 2, 3, 4 ou 5
    chemin = ThisWorkbook.Path & "\" ' On cherche le chemin du dossier où se trouve le fichier sdos-test.xlsm
    lign = Target.Row ' Le changement a eu lieu sur la ligne "lign"
    fichier = ""    ' Par défaut, la variable "fichier" est vide, mais comme elle peut être publique, on se méfie.
    If Cells(lign, 1) <> "" Then fichier = Cells(lign, 1) ' Si la cellule de la colonne 1 a changé 2 possibilités :
    ' a) l'utilisateur à vidé une cellule de la colonne 2, 3, 4 ou 5 et la cellule de la colonne 1 s'est vidée : on ne fait rien.
    ' b) l'utilisateur a rempli la dernière cellule vide de la colonne 2, 3, 4 ou 5), la cellule de la colonne 1 a maintenant un contenu grâce à votre formule, on l'affecte à la variable "fichier"
    If fichier <> "" Then MkDir chemin & fichier ' La variable dossier ayant un contenu, on crée le sous-dossier dans le dossier maître.

End Sub

Merci beaucoup pour les explications.

Du coup, idéalement je voudrais que les sous dossiers se créés dans : J:\A_PARC MAD\Dossiers Véhicules\Dossiers\

Dans mon fichier d'exemple les colonnes qui sont modifiés sont 2, 3, 4 et 5 mais au final ça pourrait être d'autres colonnes (pas forcement cote à cote) c'est pour ça que je te demandais comment tu pointais la colonne A, je voudrais que ce soit l'apparition de la valeur dans cette colonne A qui lance la macro, est-ce possible ?

Encore merci pour ton temps.

J'ai m'impression que vous n'avez pas tout lu.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
1    Dim fichier As String, chemin As String, lign As Long

2    chemin = "J:\A_PARC MAD\Dossiers Véhicules\Dossiers\"
3    lign = Target.Row
4    fichier = ""
5    If Cells(lign, 1) <> "" Then fichier = Cells(lign, 1)
6    If fichier <> "" Then MkDir chemin & fichier

End Sub

1 déclaration obligatoire des variables (Option Explicit)
2 Votre chemin
3 on récupère la ligne où une cellule a changé
4 On initialise à vide la variable "fichier" au cas où elle serait publique
5) si la cellule "lign" de la colonne A change on a 2 cas : a) elle s'est vidée b) elle s'est remplie. Si elle s'est vidée, c'est parce qu'on a vidé la cellule d'une des 4 colonnes clés de votre formule. Si elle s'est remplie c'est parce que les 4 cellules en question ont un contenu. Dans ce cas, on récupère en A le nom du dossier à créer
6 On crée le dossier.

9sdos-test.xlsm (15.59 Ko)

Ca marche parfaitement, c'est exactement ça.

Merci beaucoup.

Ce fut un plaisir, bonne continuation.

Serait-il possible de rajouter au code que si le sous dossier existe déjà il ne fait rien ? Car une fois que j'ai rempli les 4 colonnes qui déclenchent et que le dossier se créé, à chaque fois que je fais une modif sur la ligne la macro se relance et plante car le sous dossier existe déjà.

merci d'avance

Ce sera malheureusement ma dernière intervention, faute de temps. Tu aurais dû tout dire dès le départ.

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim fichier As String, chemin As String, lign As Long

    chemin = "J:\A_PARC MAD\Dossiers Véhicules\Dossiers\"
    lign = Target.Row
    fichier = ""
    If Cells(lign, 1) <> "" Then fichier = Cells(lign, 1)
    If fichier <> "" Then chemin = chemin & fichier
    If Dir(chemin, vbDirectory) = "" Then MkDir chemin
End Sub

Ca sera la bonne ! C'est parfait.

Désolé c'est en testant ta précédente version que je me suis rendu compte du problème.

Merci pour le temps passé, c'est exactement ce qu'il me fallait.

Rechercher des sujets similaires à "vba creation dossier lorsque remplie"