Supprimer signet dans word à partir d'excel

Résolu/Fermé
TonyLucky - 11 avril 2022 à 11:59
 TonyLucky - 15 avril 2022 à 17:40
Bonjour à tous,
Me voici confronté à un nouveau problème. Je tourne en rond depuis hier sans parvenir à avancer.
A partir d'excel, j'ai une procédure pour créer un courriel sous outlook. Pour le contenu de mon courriel, j'utilise un document word.htm. J'ajoute des infos en utilisant la procédure Replace. Ce n'est peut-être pas très élégant, mais cela fonctionne. Première étape réussie. Je génère mon courrier avec la mise en forme que je souhaite.
Je coince sur la seconde étape : supprimer des paragraphes sous condition. Pour cela, j'ai créé des signets dans mon document word, qui sont bien sauvegardés dans la version doc.htm
J'ai trouvé plein d'infos sur le net, bien sûr, mais je n'arrive pas à les adapter à ma procédure.
Je ne peux pas mettre la totalité de mon code, mais juste là où je coince. Nom fichier est déclaré en string, fso et ts en variant, SignetNom en word.range

J'ai une erreur 91 sur with (variable objet ou de bloc with non définie). J'ai essayé d'autres déclarations pour ouvrir mon document modèle, mais je n'arrivai plus à générer ts.readall. Pareil, si je passe le with, j'ai la même erreur sur set signetnom.

'document modèle
    NomFichier = ThisWorkbook.Path & "\OUTILS\Modeles\mail dossier.htm"
        Set fso = CreateObject("scripting.filesystemobject")
        Set ts = fso.OpenTextfile(NomFichier)
        
        With Application.Documents(NomFichier)
        Set SignetNom = .Bookmarks("Pass").Range
        .Range(SignetNom).Delete
        End With

        TexteMaitre = ts.readall
        ts.Close
            'intégre la phrase d'appel
            TexteMaitre = Replace(TexteMaitre, "XXX_1", Replace(texte1, vbLf, "<br>"))
            'intégre dans le texte les pièces manquantes du dossier
            TexteMaitre = Replace(TexteMaitre, "XXX_2", Replace(texte2, vbLf, "<br>"))




J'avoue qu'une aide serait la bienvenue, en espérant que mes explications soient suffisantes. Par avance, un grand merci.

Tony





Configuration: Windows / Firefox 99.0
A voir également:

6 réponses

yg_be Messages postés 23431 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 janvier 2025 Ambassadeur 1 559
11 avril 2022 à 12:57
bonjour,
au lieu de
With Application.Documents(NomFichier)

il est préférable de faire
dim wdoc as ???
set wdoc= Application.Documents(NomFichier)
With wdoc

cela te force à choisir un type, et t'aide à obtenir des messages d'erreurs plus précis.

par ailleurs, je ferais plutôt ainsi:
Dim wapp As Word.Application, wdox As Word.Documents, wdoc As Word.Document, nomfichier As String
Set wapp = New Word.Application
Set wdox = wapp.Documents
nomfichier = ThisWorkbook.Path + "\undoc.docx"
Set wdoc = wdox.Open(nomfichier)
' with wdoc ...
wdoc.Close
wapp.Quit
0
Bonjour,
Merci de votre réponse.
Merci aussi au modérateur qui a déplacé ma question que j'avais mise dans 'programmation'. Une fausse manip de ma part. Désolé.

J'ai réfléchi et regardé d'un peu plus près ma macro. De fait, je n'ouvre pas le document word lors de la création du courriel : je récupère simplement son contenu. En pas à pas, quand je survole "ts"", l'info bulle me donne "html". Donc, je ne peux pas associer les deux procédures. D'autant plus que la suppression du signet est définitive dans le document word, si j'ai bien compris.
Je cherche donc le code html me permettant soit de supprimer le signet, soit de le remplacer par un champs vide. Là, je coince aussi. Mais je pense que c'est la piste à suivre.
0
yg_be Messages postés 23431 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 janvier 2025 1 559
11 avril 2022 à 17:27
As-tu encore l'erreur 91?

Ton dernier message est relativement incompréhensible.
0
Pas toujours facile d'expliquer son problème quand on a le nez dedans !
Oui, j'ai toujours l'erreur 91. Mais c'est ce que je voulais expliquer dans mon dernier message. J'essayais de mélanger deux procédures distinctes : celle que j'utilise pour récupérer le texte dans mon fichier word, sans l'ouvrir :
    'document modèle
    NomFichier = ThisWorkbook.Path & "\OUTILS\Modeles\mail client dossier.htm"
        Set fso = CreateObject("scripting.filesystemobject")
        Set ts = fso.OpenTextfile(NomFichier)

 '    With WordApp.Documents(NomFichier)
    '    Set SignetNom = .Bookmarks("Pass").Range
    '    .Range(SignetNom).Delete
    '    End With   
       
        TexteMaitre = ts.readall
        ts.Close           
            'intégre dans la phrase d'appel
            TexteMaitre = Replace(TexteMaitre, "XXX_1", Replace(texte1, vbCr, "<br>"))
            'intégre dans le texte les pièces manquantes du dossier locatif

et celle que j'avais trouvé pour supprimer les signets, pour laquelle vous m'avez donné une variante et que j'incluais dans la mienne. Donc, évidemment, cela ne peut marcher. C'est la raison pour laquelle j'ai essayé de trouver l'instruction html permettant de supprimer un signet, sans succès pour l'instant. Du coup, il faut que je repense ma procédure et fasse de nouveaux tests.
En espérant avoir été un peu plus clair...
0
Voilà, j'avance dans ma démarche. *en *html, je suis débutant, donc, je tatonne !

J'ai testé plusieurs codes html différents. Les deux plus logiques me semblent les deux lignes ci dessous. Lorsque j'active la première, il ne se passe rien. Si j'active la seconde, tout mon texte est effacé.
TexteMaitre = Replace(TexteMaitre, "<div><name=MobiliPass></div>", Replace("", vbCr, "<br>"))
            TexteMaitre = "<div class=noprint><name=MobiliPass></div>"

je suppose que la solution est entre les deux.
Des idées ?
D'avance merci
0
yg_be Messages postés 23431 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 janvier 2025 1 559
12 avril 2022 à 13:48
Il est totalement inutile de nous montrer des bouts de code incomplets.
As-tu renoncé à l'idée d'utiliser Word pour supprimer les paragraphes inutiles?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour,

Désolé pour le retard à répondre mais j'étais en déplacement.
Non, je n'ai pas renoncé mais je n'ai pas eu le temps de creuser. Il faut que je construise un fichier test : ce sera plus simple pour moi. J'espère pouvoir faire cela la semaine prochaine.
Bon week-end de Pâques.
0
J'ai finalement configuré la solution suivante pour obtenir le résultat souhaité, ie masquer certains onglets dans mon document word modèle selon conditions.
J'ai créé deux macros par signet : l'une pour afficher le texte, l'autre pour le masquer
Sub Afficher_Garant1()
    Selection.GoTo What:=wdGoToBookmark, Name:="Garant1"
    Selection.Font.Hidden = False
End Sub

Sub Masquer_Garant1()
    Selection.GoTo What:=wdGoToBookmark, Name:="Garant1"
    Selection.Font.Hidden = True
End Sub


Avec cette solution, le texte apparaît ou n'apparaît pas et n'est pas détruit.

Ensuite, dans Excel, j'ai ajouté le code suivant :
Dim WordApp As Word.Application 'activer référence Word
'adapte le contenu du document aux différentes options
Set WordApp = CreateObject("Word.Application")
    With WordApp
        .Visible = False
        .Documents.Open (ThisWorkbook.Path & "\OUTILS\Modeles\mail dossier.htm")
        .Run procedure1 'appel la macro Masquer_Garant1 ou Afficher_Garant1 selon le besoin
        .Run procedure2 'idem pour un autre signet,...
        
        .ActiveDocument.Save
        .Quit
    End With
    Set WordApp = Nothing


Voilà, problème résolu, en attendant de m'attaquant au suivant !
Bonne fête de Pâques à tous.
0