Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Macro création d'un dossier

5 réponses
Avatar
Jocelyne
Bonjour à tous,

Je suis débutante en VBA et je tente de créer une macro qui permet de créer
un dossier si celui-ci n'existe pas et ne fais rien si le dossier existe.

Le résultat que j'obtiens : elle fonctionne si le dossier n'existe pas mais
pas en ce qui concerne la partie si le dossier existe.

Voici une partie de la macro.

'Annonce la création du dossier avec la possibilité de canceller l'action
Response = MsgBox("Un dossier au nom de " & Chr(34) & StrConv(NomRep,
vbProperCase) & StrConv(PrenomRep, vbProperCase) & _
" " & Format(DateNaisRep, "yyyy-mm-dd") & Chr(34) & " sera créé.",
vbOKCancel, "Création du dossier")

If Response = vbCancel Then
MsgBox "Vous avez annulé la création du dossier.", vbExclamation
Exit Sub 'Arrete la procédure complète
Else
'Si le dossier n'existe pas, le dossier est créé, sinon la procédure se
termine.
If Dir$(Chemin & StrConv(NomRep, vbProperCase) & StrConv(PrenomRep,
vbProperCase) & " " & Format(DateNaisRep, "yyyy-mm-dd"), vbDirectory) =
vbNullString Then

'Le dossier n'existe pas alors C'EST ICI QUE CA PLANTE LORSQUE LE
DOSSIER EXISTE. LA MACRO FAIT CETTE LIGNE PLUTOT QUE DE SAUTER À ELSE.
MkDir (StrConv(NomRep, vbProperCase) & StrConv(PrenomRep, vbProperCase)
& " " & Format(DateNaisRep, "yyyy-mm-dd"))

Else
'Le dossier existe alors
MsgBox ("Le dossier existe déjà. Vérifiez les données" _
& " dans le formulaire et recommencez.")
Exit Sub

End If
End If

********
Est-ce quelqu'un serait assez gentil pour me dire qu'est-ce qui cloche dans
la macro et m'aider à la rendre fonctionnelle? Ça fait quelques jours déjà
que j'essaie de trouver la logique mais je ne vois plus clair.

Merci de votre aide.

5 réponses

Avatar
Geo
Bonjour
[Réponse faite sur le forum public Word :
news://msnews.microsoft.com/ microsoft.public.fr.word ]
Bonjour à tous,

Je suis débutante en VBA et je tente de créer une macro qui permet de créer
un dossier si celui-ci n'existe pas et ne fais rien si le dossier existe.

Le résultat que j'obtiens : elle fonctionne si le dossier n'existe pas mais
pas en ce qui concerne la partie si le dossier existe.

Voici une partie de la macro.

'Annonce la création du dossier avec la possibilité de canceller l'action
Response = MsgBox("Un dossier au nom de " & Chr(34) & StrConv(NomRep,
vbProperCase) & StrConv(PrenomRep, vbProperCase) & _
" " & Format(DateNaisRep, "yyyy-mm-dd") & Chr(34) & " sera créé.",
vbOKCancel, "Création du dossier")

If Response = vbCancel Then
MsgBox "Vous avez annulé la création du dossier.", vbExclamation
Exit Sub 'Arrete la procédure complète
Else
'Si le dossier n'existe pas, le dossier est créé, sinon la procédure se
termine.
If Dir$(Chemin & StrConv(NomRep, vbProperCase) & StrConv(PrenomRep,
vbProperCase) & " " & Format(DateNaisRep, "yyyy-mm-dd"), vbDirectory) =
vbNullString Then

'Le dossier n'existe pas alors C'EST ICI QUE CA PLANTE LORSQUE LE
DOSSIER EXISTE. LA MACRO FAIT CETTE LIGNE PLUTOT QUE DE SAUTER À ELSE.
MkDir (StrConv(NomRep, vbProperCase) & StrConv(PrenomRep, vbProperCase)
& " " & Format(DateNaisRep, "yyyy-mm-dd"))

Else
'Le dossier existe alors
MsgBox ("Le dossier existe déjà. Vérifiez les données" _
& " dans le formulaire et recommencez.")
Exit Sub

End If
End If

********
Est-ce quelqu'un serait assez gentil pour me dire qu'est-ce qui cloche dans
la macro et m'aider à la rendre fonctionnelle? Ça fait quelques jours déjà
que j'essaie de trouver la logique mais je ne vois plus clair.

Merci de votre aide.



C'est le vbNullString, il faut mettre "", ce qui n'est pas la même
chose.
Et si je peux me permettre un conseil, utilisez des variables
instermédiaires comme :

Dim NomRep As string
NomRep = Chemin & StrConv(NomRep, vbProperCase) & StrConv(PrenomRep,
vbProperCase & " " & Format(DateNaisRep, "yyyy-mm-dd")
debug.print "Nom du dossier " & NomRep
If Dir$(NomRep) , vbDirectory) = "" then
'Le dossier n'existe pas a
MkDir NomRep

Else
'Le dossier existe alors
MsgBox ("Le dossier " & nomrep " &existe déjà. Vérifiez les
données" _
& " dans le formulaire et recommencez.")
Exit Sub
End If

C'est plus fiable et plus facilie à déboguer et maintenir (utilisation
du debug.print).

--
A+
Avatar
Jocelyne
Merci beaucoup Geo de vos conseils.

J'ai remplacé l'instruction vbNullString par des "" mais ça ne fonctionnait
toujours pas. Alors, j'ai suivi vos conseils sur l'utilisation de variables
intermédiaires et ça fonctionne très bien.

Est-ce que je peux me permettre une autre question?

J'ai une autre macro qui utilise le contenu des mêmes variables NomRep,
PrenomRep, etc. pour créer le nom du fichier.

J'ai lu qu'on pouvait mettre des variables publiques pour pouvoir les
utiliser dans plusieurs procédures. J'ai essayé mais je n'arrive pas à
comprendre comment faire.

1. J'ai essayé en mettant les variables dans la zone de déclarations.
2. J'ai essayé aussi en mettant static lors de la déclarations.

Il y a quelque chose que j'ignore pour obtenir le bon résultat. Alors, pour
la macro je répète toutes les mêmes instructions pour obtenir mes variables.

Encore une fois merci.

Jocelyne

"Geo" a écrit :

Bonjour
[Réponse faite sur le forum public Word :
news://msnews.microsoft.com/ microsoft.public.fr.word ]
> Bonjour à tous,
>
> Je suis débutante en VBA et je tente de créer une macro qui permet de créer
> un dossier si celui-ci n'existe pas et ne fais rien si le dossier existe.
>
> Le résultat que j'obtiens : elle fonctionne si le dossier n'existe pas mais
> pas en ce qui concerne la partie si le dossier existe.
>
> Voici une partie de la macro.
>
> 'Annonce la création du dossier avec la possibilité de canceller l'action
> Response = MsgBox("Un dossier au nom de " & Chr(34) & StrConv(NomRep,
> vbProperCase) & StrConv(PrenomRep, vbProperCase) & _
> " " & Format(DateNaisRep, "yyyy-mm-dd") & Chr(34) & " sera créé.",
> vbOKCancel, "Création du dossier")
>
> If Response = vbCancel Then
> MsgBox "Vous avez annulé la création du dossier.", vbExclamation
> Exit Sub 'Arrete la procédure complète
> Else
> 'Si le dossier n'existe pas, le dossier est créé, sinon la procédure se
> termine.
> If Dir$(Chemin & StrConv(NomRep, vbProperCase) & StrConv(PrenomRep,
> vbProperCase) & " " & Format(DateNaisRep, "yyyy-mm-dd"), vbDirectory) =
> vbNullString Then
>
> 'Le dossier n'existe pas alors C'EST ICI QUE CA PLANTE LORSQUE LE
> DOSSIER EXISTE. LA MACRO FAIT CETTE LIGNE PLUTOT QUE DE SAUTER À ELSE.
> MkDir (StrConv(NomRep, vbProperCase) & StrConv(PrenomRep, vbProperCase)
> & " " & Format(DateNaisRep, "yyyy-mm-dd"))
>
> Else
> 'Le dossier existe alors
> MsgBox ("Le dossier existe déjà. Vérifiez les données" _
> & " dans le formulaire et recommencez.")
> Exit Sub
>
> End If
> End If
>
> ********
> Est-ce quelqu'un serait assez gentil pour me dire qu'est-ce qui cloche dans
> la macro et m'aider à la rendre fonctionnelle? Ça fait quelques jours déjà
> que j'essaie de trouver la logique mais je ne vois plus clair.
>
> Merci de votre aide.

C'est le vbNullString, il faut mettre "", ce qui n'est pas la même
chose.
Et si je peux me permettre un conseil, utilisez des variables
instermédiaires comme :

Dim NomRep As string
NomRep = Chemin & StrConv(NomRep, vbProperCase) & StrConv(PrenomRep,
vbProperCase & " " & Format(DateNaisRep, "yyyy-mm-dd")
debug.print "Nom du dossier " & NomRep
If Dir$(NomRep) , vbDirectory) = "" then
'Le dossier n'existe pas a
MkDir NomRep

Else
'Le dossier existe alors
MsgBox ("Le dossier " & nomrep " &existe déjà. Vérifiez les
données" _
& " dans le formulaire et recommencez.")
Exit Sub
End If

C'est plus fiable et plus facilie à déboguer et maintenir (utilisation
du debug.print).

--
A+





Avatar
Geo
Bonjour Jocelyne

J'ai une autre macro qui utilise le contenu des mêmes variables NomRep,
PrenomRep, etc. pour créer le nom du fichier.

J'ai lu qu'on pouvait mettre des variables publiques pour pouvoir les
utiliser dans plusieurs procédures. J'ai essayé mais je n'arrive pas à
comprendre comment faire.

1. J'ai essayé en mettant les variables dans la zone de déclarations.



Il faut les déclarer avant le premier Sub ou function,
en gros on a :
Option Explicit
Dim MaVariablePublique as String
....

Sub MaFonction()

MaVariablePublique = "Ma chaîne de caractères"
' Appel d'un autre Sub
MaSousFonction
' ici MaVariablePublique est égale à "Modification"

End sub

Sub MaSousFonction()
' ici MaVariablePublique est égale à "Ma chaîne de caractères"
' si ce Sub a été appelé par MaFonction, sinon c'est une chaine vide
Debug.Print MaVariablePublique
MaVariablePublique = "Modification"
End sub

Mais à chaque fin d'exécution de la macro principale (MaFonction)
La variable publique comme les variables locales sont rééinitialisées.
Si vous lancez une macro puis une autre, par exemple ici MaFonction
puis MaSousFonction, la valeur de la variable publique est perdue.
Si c'est ça votre problème, on peut vous proposer une solution avec les
variables de document.

2. J'ai essayé aussi en mettant static lors de la déclarations.


C'est un peu délicat à utiliser, on les utilise principalement pour les
procédures récursives (aie le gros mot !).

N'hésitez pas à poser des questions, on se fera un plaisir d'essayer
d'y répondre.

--
A+
Avatar
heureux-oli
Salut,


Je vais te donner un lien vers un tuto sur la déclaration des variables et
leur durée de vie.

http://heureuxoli.developpez.com/office/word/vba-all/

http://heureuxoli.developpez.com/office/word/vba-all/?page=page5


Pardon Geo.
Aie pas sur la tête.


--
Heureux-oli
Si rien n'est mentionné pour le code, c'est que j'en suis l'auteur.
http://heureuxoli.developpez.com/
http://word.developpez.com/

----------------------------------------------------------------------------------

"Jocelyne" a écrit dans le message de
news:
Merci beaucoup Geo de vos conseils.

J'ai remplacé l'instruction vbNullString par des "" mais ça ne
fonctionnait
toujours pas. Alors, j'ai suivi vos conseils sur l'utilisation de
variables
intermédiaires et ça fonctionne très bien.

Est-ce que je peux me permettre une autre question?

J'ai une autre macro qui utilise le contenu des mêmes variables NomRep,
PrenomRep, etc. pour créer le nom du fichier.

J'ai lu qu'on pouvait mettre des variables publiques pour pouvoir les
utiliser dans plusieurs procédures. J'ai essayé mais je n'arrive pas à
comprendre comment faire.

1. J'ai essayé en mettant les variables dans la zone de déclarations.
2. J'ai essayé aussi en mettant static lors de la déclarations.

Il y a quelque chose que j'ignore pour obtenir le bon résultat. Alors,
pour
la macro je répète toutes les mêmes instructions pour obtenir mes
variables.

Encore une fois merci.

Jocelyne

"Geo" a écrit :

Bonjour
[Réponse faite sur le forum public Word :
news://msnews.microsoft.com/ microsoft.public.fr.word ]
> Bonjour à tous,
>
> Je suis débutante en VBA et je tente de créer une macro qui permet de
> créer
> un dossier si celui-ci n'existe pas et ne fais rien si le dossier
> existe.
>
> Le résultat que j'obtiens : elle fonctionne si le dossier n'existe pas
> mais
> pas en ce qui concerne la partie si le dossier existe.
>
> Voici une partie de la macro.
>
> 'Annonce la création du dossier avec la possibilité de canceller
> l'action
> Response = MsgBox("Un dossier au nom de " & Chr(34) & StrConv(NomRep,
> vbProperCase) & StrConv(PrenomRep, vbProperCase) & _
> " " & Format(DateNaisRep, "yyyy-mm-dd") & Chr(34) & " sera créé.",
> vbOKCancel, "Création du dossier")
>
> If Response = vbCancel Then
> MsgBox "Vous avez annulé la création du dossier.", vbExclamation
> Exit Sub 'Arrete la procédure complète
> Else
> 'Si le dossier n'existe pas, le dossier est créé, sinon la procédure se
> termine.
> If Dir$(Chemin & StrConv(NomRep, vbProperCase) & StrConv(PrenomRep,
> vbProperCase) & " " & Format(DateNaisRep, "yyyy-mm-dd"), vbDirectory) >> > vbNullString Then
>
> 'Le dossier n'existe pas alors C'EST ICI QUE CA PLANTE LORSQUE LE
> DOSSIER EXISTE. LA MACRO FAIT CETTE LIGNE PLUTOT QUE DE SAUTER À ELSE.
> MkDir (StrConv(NomRep, vbProperCase) & StrConv(PrenomRep,
> vbProperCase)
> & " " & Format(DateNaisRep, "yyyy-mm-dd"))
>
> Else
> 'Le dossier existe alors
> MsgBox ("Le dossier existe déjà. Vérifiez les données" _
> & " dans le formulaire et recommencez.")
> Exit Sub
>
> End If
> End If
>
> ********
> Est-ce quelqu'un serait assez gentil pour me dire qu'est-ce qui cloche
> dans
> la macro et m'aider à la rendre fonctionnelle? Ça fait quelques jours
> déjà
> que j'essaie de trouver la logique mais je ne vois plus clair.
>
> Merci de votre aide.

C'est le vbNullString, il faut mettre "", ce qui n'est pas la même
chose.
Et si je peux me permettre un conseil, utilisez des variables
instermédiaires comme :

Dim NomRep As string
NomRep = Chemin & StrConv(NomRep, vbProperCase) & StrConv(PrenomRep,
vbProperCase & " " & Format(DateNaisRep, "yyyy-mm-dd")
debug.print "Nom du dossier " & NomRep
If Dir$(NomRep) , vbDirectory) = "" then
'Le dossier n'existe pas a
MkDir NomRep

Else
'Le dossier existe alors
MsgBox ("Le dossier " & nomrep " &existe déjà. Vérifiez les
données" _
& " dans le formulaire et recommencez.")
Exit Sub
End If

C'est plus fiable et plus facilie à déboguer et maintenir (utilisation
du debug.print).

--
A+







Avatar
Jocelyne
Merci à vous deux. Je regarderai attentivement les liens et vous reviendrez
là-dessus.

Jocelyne

"heureux-oli" a écrit :

Salut,


Je vais te donner un lien vers un tuto sur la déclaration des variables et
leur durée de vie.

http://heureuxoli.developpez.com/office/word/vba-all/

http://heureuxoli.developpez.com/office/word/vba-all/?page=page5


Pardon Geo.
Aie pas sur la tête.


--
Heureux-oli
Si rien n'est mentionné pour le code, c'est que j'en suis l'auteur.
http://heureuxoli.developpez.com/
http://word.developpez.com/

----------------------------------------------------------------------------------

"Jocelyne" a écrit dans le message de
news:
> Merci beaucoup Geo de vos conseils.
>
> J'ai remplacé l'instruction vbNullString par des "" mais ça ne
> fonctionnait
> toujours pas. Alors, j'ai suivi vos conseils sur l'utilisation de
> variables
> intermédiaires et ça fonctionne très bien.
>
> Est-ce que je peux me permettre une autre question?
>
> J'ai une autre macro qui utilise le contenu des mêmes variables NomRep,
> PrenomRep, etc. pour créer le nom du fichier.
>
> J'ai lu qu'on pouvait mettre des variables publiques pour pouvoir les
> utiliser dans plusieurs procédures. J'ai essayé mais je n'arrive pas à
> comprendre comment faire.
>
> 1. J'ai essayé en mettant les variables dans la zone de déclarations.
> 2. J'ai essayé aussi en mettant static lors de la déclarations.
>
> Il y a quelque chose que j'ignore pour obtenir le bon résultat. Alors,
> pour
> la macro je répète toutes les mêmes instructions pour obtenir mes
> variables.
>
> Encore une fois merci.
>
> Jocelyne
>
> "Geo" a écrit :
>
>> Bonjour
>> [Réponse faite sur le forum public Word :
>> news://msnews.microsoft.com/ microsoft.public.fr.word ]
>> > Bonjour à tous,
>> >
>> > Je suis débutante en VBA et je tente de créer une macro qui permet de
>> > créer
>> > un dossier si celui-ci n'existe pas et ne fais rien si le dossier
>> > existe.
>> >
>> > Le résultat que j'obtiens : elle fonctionne si le dossier n'existe pas
>> > mais
>> > pas en ce qui concerne la partie si le dossier existe.
>> >
>> > Voici une partie de la macro.
>> >
>> > 'Annonce la création du dossier avec la possibilité de canceller
>> > l'action
>> > Response = MsgBox("Un dossier au nom de " & Chr(34) & StrConv(NomRep,
>> > vbProperCase) & StrConv(PrenomRep, vbProperCase) & _
>> > " " & Format(DateNaisRep, "yyyy-mm-dd") & Chr(34) & " sera créé.",
>> > vbOKCancel, "Création du dossier")
>> >
>> > If Response = vbCancel Then
>> > MsgBox "Vous avez annulé la création du dossier.", vbExclamation
>> > Exit Sub 'Arrete la procédure complète
>> > Else
>> > 'Si le dossier n'existe pas, le dossier est créé, sinon la procédure se
>> > termine.
>> > If Dir$(Chemin & StrConv(NomRep, vbProperCase) & StrConv(PrenomRep,
>> > vbProperCase) & " " & Format(DateNaisRep, "yyyy-mm-dd"), vbDirectory) > >> > vbNullString Then
>> >
>> > 'Le dossier n'existe pas alors C'EST ICI QUE CA PLANTE LORSQUE LE
>> > DOSSIER EXISTE. LA MACRO FAIT CETTE LIGNE PLUTOT QUE DE SAUTER À ELSE.
>> > MkDir (StrConv(NomRep, vbProperCase) & StrConv(PrenomRep,
>> > vbProperCase)
>> > & " " & Format(DateNaisRep, "yyyy-mm-dd"))
>> >
>> > Else
>> > 'Le dossier existe alors
>> > MsgBox ("Le dossier existe déjà. Vérifiez les données" _
>> > & " dans le formulaire et recommencez.")
>> > Exit Sub
>> >
>> > End If
>> > End If
>> >
>> > ********
>> > Est-ce quelqu'un serait assez gentil pour me dire qu'est-ce qui cloche
>> > dans
>> > la macro et m'aider à la rendre fonctionnelle? Ça fait quelques jours
>> > déjà
>> > que j'essaie de trouver la logique mais je ne vois plus clair.
>> >
>> > Merci de votre aide.
>>
>> C'est le vbNullString, il faut mettre "", ce qui n'est pas la même
>> chose.
>> Et si je peux me permettre un conseil, utilisez des variables
>> instermédiaires comme :
>>
>> Dim NomRep As string
>> NomRep = Chemin & StrConv(NomRep, vbProperCase) & StrConv(PrenomRep,
>> vbProperCase & " " & Format(DateNaisRep, "yyyy-mm-dd")
>> debug.print "Nom du dossier " & NomRep
>> If Dir$(NomRep) , vbDirectory) = "" then
>> 'Le dossier n'existe pas a
>> MkDir NomRep
>>
>> Else
>> 'Le dossier existe alors
>> MsgBox ("Le dossier " & nomrep " &existe déjà. Vérifiez les
>> données" _
>> & " dans le formulaire et recommencez.")
>> Exit Sub
>> End If
>>
>> C'est plus fiable et plus facilie à déboguer et maintenir (utilisation
>> du debug.print).
>>
>> --
>> A+
>>
>>
>>