Se connecter avec
S'enregistrer | Connectez-vous
Résolu

VBA : enregistrement d'un fichier word dans un dossier p-e inexistant

Dernière réponse : dans Programmation
Partagez

Bonjour, j'aimerais pouvoir créer un fichier avec comme nom la date et l'heure et l'enregistrer dans un dossier qui si il n'existe pas sera créé je galère un pe est-ce que quelqu'un pe m'aider ? voici mon code Private Sub CommandButton1_Click() Dim Chemin As String, NomRep As String, nomFichier As String Chemin = "E:\Bob" NomRep = Dir(Chemin, vbDirectory) nomFichier = Format(Now, "dd mmmm yyyy hh") & "h" & Minute(Time) & ".doc" Do While NomRep < Bob > "E:\" If NomRep < Bob > "E:\" And NomRep < Bob > "E:\" Then If (GetAttr(Chemin & NomRep) _ And vbDirectory) = vbDirectory Then MsgBox(Prompt, [Buttons As VbMsgBoxStyle = vbOKOnly], [Effectué]) As VbMsgBoxResult End If End If NomRep = Dir Loop Call ChangeFileOpenDirectory("E:\Bob") Call ActiveDocument.SaveAs(nomFichier) End Sub

Salut,

Je te prie de bien vouloir modifier ton message, et de le mettre un peu en forme. Là, c'est illisible. De plus, je te rappelle que le règlement stipule que toute pièce de code-source doit être présentée entre les balises [code][/|/i]code]. Tu auras plus d'informations en le lisant, ce règlement !

oui je pensé l'avoir fait c'est une erreur de ma part
donc on recommence ;) 

Bonjour,
j'aimerais pouvoir créer un fichier avec comme nom la date et l'heure et l'enregistrer dans un dossier qui si il n'existe pas sera créé sauf que je n'y arrive pas
pouvez-vous m'aider ?

voici mon code :
(j'ai appelé le dossier Bob pour l'exemple)

  1. Private Sub CommandButton1_Click()
  2.  
  3.  
  4. Dim Chemin As String, NomRep As String, nomFichier As String
  5.  
  6.  
  7. Chemin = "E:\Bob"
  8. NomRep = Dir(Chemin, vbDirectory)
  9. nomFichier = Format(Now, "dd mmmm yyyy hh") & "h" & Minute(Time) & ".doc"
  10.  
  11.  
  12.  
  13. Do While NomRep < Bob > "E:\"
  14.  
  15.  
  16. If NomRep < Bob > "E:\" And NomRep < Bob > "E:\" Then
  17.  
  18. If (GetAttr(Chemin & NomRep) _
  19. And vbDirectory) = vbDirectory Then
  20. MsgBox(Prompt, [Buttons As VbMsgBoxStyle = vbOKOnly], [Effectué]) As VbMsgBoxResult
  21. End If
  22. End If
  23. NomRep = Dir
  24. Loop
  25.  
  26. Call ChangeFileOpenDirectory("E:\Bob")
  27. Call ActiveDocument.SaveAs(nomFichier)
  28.  
  29.  
  30. End Sub
.

j'apprend seul et c'est vrai que c'est pas évident
je ne suis vraiment pas sur déjà pour ma boite messagebox alors le reste je ne sais pas
j'ai tester ma fonction d'enregistrement elle fonctione donc je pense que le problème viens de ma boucle qui créé le dossier si il n'existe pas
Contenus similaires
Posez votre question

Ohlala, vlà le dawa !!!
T'as jamais programmé, toi ?

Alors voici la définition de MsgBox :
MsgBox(prompt[, buttons] [, title] [, helpfile, context]) As VbMsgBoxResult

Ceci signifie que MsgBox() attend d'abord le message, puis optionnellement (je le sais car il y a des crochets) un nombre qui représente la liste des boutons (0 pour Ok, 1 pour Ok+Cancel, etc. cf. l'aide), puis un titre, puis enfin un fichier d'aide et son contexte. Le résultat est un nombre qui s'interprète comme un VbMsgBoxResult, c'est-à-dire 1 pour Ok, 2 pour annuler, etc. (cf. l'aide)

Donc, si tu veux afficher un texte, t'embête pas :
  1. Sub FonctionTest()
  2. MsgBox "Avec TH.fr, je découvre le VB !"
  3. End Sub


Tips: si tu n'attends pas de retour de la fonction, il ne faut pas mettre les parenthèses.

Maintenant, je voudrais bien que tu m'expliques les ligne 13 et 16.

à vrai dire j'ai mis <bob> en attendant parceque je ne savais pas quoi mettre

je voudrais faire une boucle "tant que" le dossier Bob n'existe pas dans E:\
créer le dossier Bob (donc changer la valeur de NomRep)

si le dossier E:\Bob existe
sauvgarder le fichier dans E:\Bob

donc....
[code]

Do while NomRep(E:\,)
[/|/i]code]

ou bien

[code]
/* une fonction qui lit le répertoir qui renvoi par exemple vrai si le repertoire existe ?? */
Function RepertoireExiste(Chemin As String) As Boolean
On Error Resume Next
RepertoireExiste = GetAttr(Chemin) And vbDirectory
End Function

If RepertoireExiste(E:\Bob)= true then
Call ChangeFileOpenDirectory("E:\Bob" )
Call ActiveDocument.SaveAs(nomFichier)
End if
if not (RepertoireExiste(E:\Bob))= true then
Call ChangeFileOpenDirectory("E:\" )
MkDir Bob
MsgBox "le dossier BoB est créé"
End if

[/|/i]code]
est ce que c'est plus mieux ?
je suis pas doué on dirait

Tu veux bien me remplacer [/|/i]code] par s'il te plaît ?

Ah non, tu n'es pas doué (pas encore ;)  )
Mais c'est quoi cette boucle While ????

Algo 1000 fois plus simple :
  • Si le répertoire n'existe pas, le créer,
  • Enregistrer !
  • [/code]

    M'enfin, je n'ai jamais dit qu'il ne fallait pas créer une fonction. Elle est d'ailleurs très bien ta fonction RepertoireExiste(). Je dis juste qu'il faut d'abord vérifier si le répertoire existe, le créer s'il n'existe pas, puis seulement après la vérification et la création éventuelle, sauvegarder.

    -----------

    Mets des [/code] dans ton code, que je puisse te dire à quelles lignes ton code pose problème.

    AH pardon

    ok

    enfaite je ne sais pas comment imbriquer une fonction dans un Sub je pense le problème vien de là

    1. Private Sub CommandButton1_Click()
    2.  
    3.  
    4. Dim Chemin As String, NomRep As String, nomFichier As String
    5.  
    6. Chemin = "E:\Bob"
    7. NomRep = Dir(Chemin, vbDirectory)
    8. nomFichier = Format(Now, "dd mmmm yyyy hh") & "h" & Minute(Time) & ".doc"
    9.  
    10. If RepertoireExiste(E:\Bob)= true then
    11. Call ChangeFileOpenDirectory("E:\Bob")
    12. Call ActiveDocument.SaveAs(nomFichier)
    13. End If
    14. if not (RepertoireExiste(E:\Bob))= true then
    15. Call ChangeFileOpenDirectory("E:\")
    16. MkDir Bob
    17. MsgBox "le dossier BoB est créé"
    18. Call ChangeFileOpenDirectory("E:\Bob")
    19. End If
    20.  
    21. Function RepertoireExiste(Chemin As String) As Boolean
    22. On Error Resume Next
    23. RepertoireExiste = GetAttr(Chemin) And vbDirectory
    24. End Function
    25.  
    26. Call ActiveDocument.SaveAs(nomFichier)
    27.  
    28.  
    29. End Function
    30.  
    31. End Sub

    Salut,

    Ben justement, faut pas imbriquer !!! :lol: 

    1. Function RepertoireExiste(Chemin As String) As Boolean
    2. On Error Resume Next
    3. RepertoireExiste = GetAttr(Chemin) And vbDirectory
    4. End Function
    5.  
    6. Private Sub CommandButton1_Click()
    7.  
    8. ...
    9.  
    10. If Not RepertoireExiste(E:\Bob) Then
    11.  
    12. ...
    13.  
    14. End Sub


    Retire les = true de ton code. Dirais-tu d"une vérité qu'elle est "véritablement pour de vrai vraiment vraie" ? Tu peux, mais ça en fait trop.

    Ajoute Option Explicit au début de ton code, (ce qui t'obligera à déclarer tes variables, et vérifiera que tu n'en as pas oublié). Une erreur devrait se déclencher sut ta ligne 16. Réfléchis... ;) 

    je sais que le but désiré est proche je sens la compétence pratiquement acquise grâce à vos lumière ! merci

    il y a un problème avec la fonction RepertoireExiste le compilateur me dit que le nom de la fonction est ambigu "erreur de compilation : nom ambigu détecté : RepertoireExiste" je pensais que l'écriture à la russe était une nomenclature commune pour tout les languages ?? peut être que le problème n'est pas celui que je crois...

    1. Function RepertoireExiste(Chemin As String) As Boolean
    2. On Error Resume Next
    3. RepertoireExiste = GetAttr(Chemin) And vbDirectory
    4. End Function
    5.  
    6.  
    7. Private Sub CommandButton1_Click()
    8.  
    9. Dim Chemin As String, NomRep As String, nomFichier As String
    10.  
    11. Chemin = "E:\Bob"
    12. NomRep = Dir(Chemin, vbDirectory)
    13. nomFichier = Format(Now, "dd mmmm yyyy hh") & "h" & Minute(Time) & ".doc"
    14.  
    15.  
    16.  
    17. If RepertoireExiste("E:\Bob") Then
    18. Call ChangeFileOpenDirectory("E:\Bob")
    19. End If
    20. If Not (RepertoireExiste("E:\Bob")) Then
    21. MkDir "E:\Bob"
    22. MsgBox "le dossier BoB est créé"
    23. Call ChangeFileOpenDirectory("E:\Bob")
    24. End If
    25.  
    26.  
    27.  
    28. Call ActiveDocument.SaveAs(nomFichier)
    29.  
    30.  
    31. End Sub


    MkDir appel une chaine donc caractère donc "" et il manquait le lieu E:\
    c'était bien ça le problème ?

    have a wonderful day

    j'ai fait une petite faute de frappe

    à la fin de mon poste

    MkDir appel une chaine de caractère donc "" et il manquait le lieu E:\
    de création du dossier
    c'était bien ça le problème ?

    alors maintenant que j'essai d'améliorer tout ça j'ai un autre soussi

    j'arrive à déclarer une checkBoc et à exploiter son contenu


    1. Dim Valide As boolean
    2. Valide = ThisDocument.FormFields("Valide").CheckBox.Value


    mais j'aimera exploiter un champs de texte rempli par la personne qui rempli mon formulaire

    1. Dim Nom As String
    2. Nom = ThisDocument.FormFields("Nom").TextInput


    enfaite je voudrais que le "Nom" rempli par l'utilisateur apparaisse dans le titre du document

    1. nomFichier = "Nom" & Format(Now, "dd mmmm yyyy hh" ) & "h" & Minute(Time) & ".doc"

    Eh, eh !
    Tu fais les questions et les réponses.
    C'est parce que tu avances tout seul, c'est très bien.

    Etudie-moi ce code et frappe-toi le front en disant : "Mais c'est bien sûr !!!"
    1. Nom = "donutsledingue"
    2. MsgBox "Nom" & Format(Now, "dd mmmm yyyy hh" ) & "h" & Minute(Time) & ".doc"
    3. MsgBox Nom & Format(Now, "dd mmmm yyyy hh" ) & "h" & Minute(Time) & ".doc"

    Mais c'est biensûr !!!
    éh oui je ne fait pas appel à une chaîne de caractère directement mais un objet
    donc pas de ""
    mais par contre ça ne marche toujours pas :( 
    (j'ai changé je met Nom comme Nom de répertoire et non comme Nom de fichier)

    1. Dim Nom As String
    2. Nom = ThisDocument.FormFields("Nom" ).TextInput
    3. ...
    4. If Repertoire("E:\" & Nom) Then
    5. Call ChangeFileOpenDirectory("E:\" & Nom)
    6. End If
    7.  
    8. If Not (Repertoire("E:\" & Nom )) Then
    9. MkDir "E:\" & Nom
    10. End If
    11. ...



    on me dit que le membre de collection requis n'existe pas
    mais qu'est ce que ça veut dire ? est ce que ça veut dire que l'adresse du dossier n'est pas valide ?

    1. If Repertoire("E:\" & Nom) Then
    2. Call ChangeFileOpenDirectory("E:\" & Nom)
    3. End If
    4. If Not (Repertoire("E:\" & Nom )) Then
    5. MkDir "E:\" & Nom
    6. End If

    Et maintenant, on apprend la clause Else :

    1. If Repertoire("E:\" & Nom) Then
    2. Call ChangeFileOpenDirectory("E:\" & Nom)
    3. Else
    4. MkDir "E:\" & Nom
    5. End If


    Citation :
    on me dit que
    A quelle ligne ?
    Et quel est le message exact ?

    j'aimerais créer une erreur mais je ne sais pas comment arrêter le programme (return(0) en c ??)

    j'ai une série de boucle qui s'execute et j'aimerais que si une boucle If s'execute le reste des boucle ne s'execute pas
    en me renseignant j'ai vue des handler ?? mais je ne sais pas comment ça marche

    1. ' Gestion des erreurs
    2.  
    3. If Valide = False And EnCours = False Then
    4. MsgBox "erreur " & Vbexclamation & ": le formulaire doit être validé"
    5. ' Goto 0 ???
    6. End If
    7.  
    8. If Valide = True And EnCours = True Then
    9. MsgBox "erreur " & Vbexclamation & ": Le formulaire ne peut pas être à la fois valide et invalide"
    10. 'Goto 0 ???
    11. End If



    quand au Vbexclamation ça ne sert à rien mais ça fait pro :D 

    (else c'est bien aussi :D )

    j'ai trouvé une solution pour mes erreures j'ajoute une variable erreur bolléenne qui se met vrai si il y a une erreur
    dans les boucles suivantes je rajoute la condition

    1. If .... And erreur = false then
    2. ...
    3. End If


    mais bon c'est un peu fastidieu

    pour le message d'erreur je ne sais pas à quel ligne il se situe
    le message exacte est :
    erreur d'execution 5941
    le membre de la collection requis n'existe pas

    je programme la macro avec word
    j'ai insérer un texte enrichi (je vai essayer avec un texte pas enrichi)
    je l'ai appelé Nom et du coup j'utilise Nom dans mon code

    je pense que c'est la déclaration du champ text qui ne marche pas


    j'ai mis
    1. Dim Nom As String
    2. Nom = ThisDocument.FormFields("Nom").TextInput

    mais je pense qu'il doit me manquer quelquechose

    1. If Valide = False And EnCours = False Then

    1. If Valide = True And EnCours = True Then


    Arrête avec tes = True, = False c'est moche, très moche.

    Et puis révise tes tables de Boole. Pour la première, je pense qu'il faut un OU pas un ET.

    1. If Not Valide Or Not EnCours Then

    1. If Valide And EnCours Then


    Si une erreur se déclenche sans que tu ne saches bien où elle se trouve, mets un point d'arrêt ou l'instruction Stop un peu avant l'endroit que tu soupçonnes.

    pour les erreures il y a deux checkbox et il faut absolument en choisir une sur les deux ni les deux en même temps ni aucune

    c'est pour ça que j'ai mis
    1. If Valide = False And EnCours = False Then


    c'est parceque les deux checkBox sont décoché donc là un message d'erreur sera affiché



    pour mon erreur
    erreur d'execution 5941
    le membre de la collection requis n'existe pas

    ce sont ces deux lignes là qui pose problème

    1. 'Nom = ThisDocument.FormFields("Nom").TextInput
    2. 'Prenom = ThisDocument.FormFields("Prenom").TextInput


    quand je les mets en commentaire il n'y a plus d'erreurs
    et l'erreur s'est affiché quand je les ai rajouté à mon code

    Oki pour le ET. Mais n'écrit pas = False pour autant :
    1. If Not Valide And Not EnCours Then

    (Je pinaille ;)  )

    -----

    Ton document (ThisDocument) n'a pas de champ de formulaire (FormFields) qui s'appelle Nom ou Prénom. Que veux-tu que je te dise ?
    Décris-moi ces deux champs. Comment les as-tu créé ?

    ah ok donc ça donne
    c'est noté pour les If not ;) 

    je les ai créé automatiquement dans word et je me suis rendu comte qu'il se créé à chaque fois que je cré un champ un nouveau Sub...

    1. Private Sub Nom_Change()
    2. Dim Nom As String
    3. Nom = "bob"
    4.  
    5. End Sub


    c'est pour ça mais du coup je ne sais pas comment faire pour récupérer la valeur de ma TextBox Nom si elle n'est pas dans le même sub

    est ce que c'est normal que la textbox n'est pas dans la même sub ?
    j'ai essayé dans le nouveau Sub de renvoyer


    je me suis mal exprimé
    à chaque fois que je cré un champs textbox dans word c'est dans un nouveau sub qu'il apparai et pas dans le mien
    mais je ne sais pas comment récupérer l'information de cette textbox
    pour l'utiliser dans mon sub clickbutton

    enfaite ça marche si c'est pas dans le même sub mais chaque fois que je change un charactère du champ il marque une erreur la même qu'avant

    et pourtant je récupère bien ce qu'il y a dans le champs...
    enfaite le nouveaux sub créé quand je créé un champs de text Nom s'execute quand le champ change
    mais je voudrais qu'il change quand je click sur button1

    1. Private Sub Nom_Change()
    2. Dim Nom As String
    3. Nom = ThisDocument.FormFields("Nom").TextInput.Application
    4. End Sub


    c'est pour ça qu'il note une erreur chaque fois que je note un nouveaux caractère mais pourtant si je clic sur fin dans la fenêtre d'erreur la macro continu à s'exécuter
    et le dossier s'enregistre bien avec comme nom le contenu de la TextBox Nom

    Meilleure solution

    il suffisait de rien mettre dans ce sub (puisque c'est un sub de "change"

    et de déclarer les variables convnablement de le sub click button

    le problème est réglé :)  merci à toi zeb
    Posez votre question