Supprimer signet dans word à partir d'excel

Résolu
TonyLucky -  
 TonyLucky -
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

6 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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
  2. TonyLucky
     
    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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      As-tu encore l'erreur 91?

      Ton dernier message est relativement incompréhensible.
      0
  3. TonyLucky
     
    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
  4. TonyLucky
     
    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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. TonyLucky
     
    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
  7. TonyLucky
     
    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