Inclure le texte de signets dans nom de fichier word

Résolu
Over.Slash Messages postés 10 Date d'inscription lundi 24 mars 2014 Statut Membre Dernière intervention 20 août 2014 - Modifié par Over.Slash le 24/03/2014 à 12:58
Over.Slash Messages postés 10 Date d'inscription lundi 24 mars 2014 Statut Membre Dernière intervention 20 août 2014 - 25 mars 2014 à 09:43
bonjour nouveau sur ce forum et débutant en vba.

je suis entrain de créer une macro en vba pour enregistrer automatiquement un fichier Word qui à été créer à partir d'un modèle.

je désirerais insérer le texte de deux signets dans le nom du fichier mais je rencontre un problème une erreur

voici le code que j'ai écris

Objet = ActiveDocument.Bookmarks("signet").Range.Text
Envoie = ActiveDocument.Bookmarks("signet3").Range.Text

ActiveDocument.SaveAs FileName:=Objet & Envoie & ".doc"

Objet désigne l'objet de mon courrier c'est du texte faisant partie de mon document que écris a chaque nouveau document.

Envoie désigne le mode d'envoie du courrier (fax, lettre simple, recommandé etc ...) c'est du texte faisant partie d'une liste déroulante incluse dans mon document.

que je mette soit Objet ou Envoie tout seul le résultat est le même.

pourtant le texte de Objet et Envoie sont bien récupéré mais le fichier ne s'enregistre pas : ERREUR

erreur d'exécution '5487':

Impossible de terminer l'enregistrement:erreur d'autorisation d'accès au fichier.


si quelqu'un pouvais me donner un coup de main ca serait super sympa, merci

3 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
24 mars 2014 à 19:10
Bonjour,

Tu peux essayer comme ça :

Objet = ActiveDocument.Bookmarks("signet").Range.Text
Envoie = ActiveDocument.Bookmarks("signet3").Range.Text
newName = Objet & Envoie & ".doc"
Debug.Print newName
ActiveDocument.SaveAs FileName:=newName

Au cas où.. tu n'as pas de caractères spéciaux dans tes variables ?
- retour à la ligne
- Slash
- Apostrophes ..
- Points d'interrogation ou d'exclamation...
???

Si ça ne fonctionne toujours pas, marques nous ici ce que donne le résultat de : Debug.Print newName
1
Over.Slash Messages postés 10 Date d'inscription lundi 24 mars 2014 Statut Membre Dernière intervention 20 août 2014 1
Modifié par jordane45 le 25/03/2014 à 01:25
j'avais effectivement un retour à la ligne dans les signets, merci pour ton aide.

maintenant je peux vous donner mon code en entier puisque il fonctionne

Sub Macro1()

'Enregistrement auto du fichier

attention = ActiveDocument.MailMerge.DataSource.DataFields(1).Value
contact = ActiveDocument.MailMerge.DataSource.DataFields(3).Value
fonction = ActiveDocument.MailMerge.DataSource.DataFields(4).Value
designation = ActiveDocument.MailMerge.DataSource.DataFields(5).Value
agence = ActiveDocument.MailMerge.DataSource.DataFields(6).Value
service = ActiveDocument.MailMerge.DataSource.DataFields(7).Value

Objet = ActiveDocument.Bookmarks("Objet").Range.Text
Envoie = ActiveDocument.Bookmarks("Envoie").Range.Text

ActiveDocument.SaveAs FileName:="C:\Users\Corsaire 98\Documents\Courriers\Courrier " & attention & " " & contact & " " & fonction & " " & designation & " " & agence & " " & service & " - " & Objet & " - " & Envoie & " - " & Format(Date, "dd-mm-yyyy") & ".doc"

End Sub


merci encore
0
Over.Slash Messages postés 10 Date d'inscription lundi 24 mars 2014 Statut Membre Dernière intervention 20 août 2014 1
Modifié par Over.Slash le 24/03/2014 à 21:07
je ne sais pas si je peux ajouter cela a ce pose ou si il faut que j'en ouvre un autre pour traiter un autre sujet toujours lié a ce même code pour y ajouté des commandes

car je m'aperçois maintenant que dans mon nom de fichier j'ai parfois des espaces de trop due au champs vide si ils ne sont pas renseignés.

je pensais ajouté une fonction If de cette façon.

ActiveDocument.SaveAs FileName:=... & If (attention="" then "" else attention & " ")  ... & ".doc" 

si le champ attention est vide vba le désigne comme "".

si c'est le cas je voudrais que " " devienne "" dans mon nom de fichier,

si non que le champ attention apparaisse suivie d'un " ".

et ainsi de suite pour tous les autres champs inclus dans mon nom de fichier.

je sais utiliser la fonction SI sous excel et IF en basic mais en vba, quelqu'un pourrais me renseigner ?

merci par avance.
1
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
25 mars 2014 à 01:43
Pas de soucis.
Par contre :
1 - vu que ta question est résolue ( ta seconde question ayant été également traitée dans ton autre discussion), merci de passer le sujet en clos en cliquant sur le lien "Marquer comme résolu" qui se trouve sous le titre de ta question.

2 - Dans ta concaténation... attention à ce que ton nom de fichier + le chemin où tu le stockes ne dépasse pas les 256 caractères (Windows a tendance à ne pas aimer...)

3 - Il existe une fonction en VBA qui permet de retirer les espaces qui se trouvent avant et après une chaine de caractères... ainsi plus besoin de tes if.. TRIM

Objet = trim(ActiveDocument.Bookmarks("Objet").Range.Text)
Envoie = trim(ActiveDocument.Bookmarks("Envoie").Range.Text)


Tu pourrais même te faire une fonction de "nettoyage" de tes chaines de caractères pour retirer tous les caractères "gênants"
Function strClean(str) As String
' Fonction de nettoyage de chaine de caractères
    If IsEmpty(str) Then strClean ""
    Dim strTmp As String
    str = Replace(str, "'", "")
    str = Replace(str, Chr(8), "")
    str = Replace(str, Chr(9), "")
    str = Replace(str, Chr(10), "")
    str = Replace(str, Chr(11), "")
    str = Replace(str, Chr(12), "")
    str = Replace(str, Chr(13), "")
    str = Replace(str, "?", "")
    str = Replace(str, "!", "")
    str = Replace(str, "/", "")
    str = Replace(str, "\", "")
    str = Replace(str, ":", "")
    str = Replace(str, ";", "")
    str = Replace(str, ",", "")
    str = Replace(str, "$", "")
    str = Replace(str, " ", "")
    str = Replace(str, """", "")
    ' On retourne la chaine néttoyée
    strClean = Trim(str)
End Function

( normalement je te l'aurai fait via un REGEX (expréssions régulières) mais ça complique les choses pour pas grand chose...)

et donc pour récupérer tes variables tu ferais :
Objet = strClean(ActiveDocument.Bookmarks("Objet").Range.Text)
Envoie = strClean(ActiveDocument.Bookmarks("Envoie").Range.Text)



Voilou.
Cordialement,
Jordane.
1
Over.Slash Messages postés 10 Date d'inscription lundi 24 mars 2014 Statut Membre Dernière intervention 20 août 2014 1
25 mars 2014 à 09:43
ha oui ca c'est vraiment super le nettoyage de chaine, car en effet comme il s'agit de texte qui est repris pour edit le nom de fichier a l'enregistrement ca peut poser des problèmes temporaires si il y a effectivement des caractaires non autorisée
0
Rejoignez-nous