Supprimer une balise html avec des guillemets et du texte variable

Bonjour à tous,

Voici un code VBA que j'utilise qui me permet de nettoyer des fichiers HTML de certaines balises définies et invariables :

  • <span style="font-size: 12px;">
  • </strong>
  • <span xml:lang="en" lang="en">
Sub Nettoyer_Annonce()
'
' Nettoyer_Annonce Macro
'
'

Dim Balise0 As String
Dim Balise1 As String
Dim Balise2 As String
Dim Balise3 As String

Balise0 = ""
Balise1 = "<span style=" & Chr(34) & "font-size: 12px;" & Chr(34) & ">"
Balise2 = "</strong>"
Balise3 = "<span xml:lang=" & Chr(34) & "en" & Chr(34) & " lang=" & Chr(34) & "en" & Chr(34) & ">"

ActiveDocument.Range.Select
With Selection.Find
    .Text = Balise1
    .Replacement.Text = Balise0
    .Forward = True
    .ClearFormatting
    .Wrap = wdFindContinue
    .Execute Replace:=wdReplaceAll
End With

With Selection.Find
    .Text = Balise2
    .Replacement.Text = Balise0
    .Forward = True
    .ClearFormatting
    .Wrap = wdFindContinue
    .Execute Replace:=wdReplaceAll
End With

With Selection.Find
    .Text = Balise3
    .Replacement.Text = Balise0
    .Forward = True
    .ClearFormatting
    .Wrap = wdFindContinue
    .Execute Replace:=wdReplaceAll
End With

End Sub

Ce n'est pas un super code, il peut être amélioré (mais je n'y connais rien en VB et suis déjà content d'avoir créé celui-ci (en me servant de ce forum, et d'un autre par ailleurs).

Je l'utilise sur Word, et pas sur Excel, mais bon, cela reste du VBA et de la macro Office.

Je trouverais peut-être la réponse à ma question sur ce forum néanmoins.

J'aimerais en effet supprimer (de la même manière que ci-dessus ou d'une autre mais dans la même macro ce serait bien) des balises de ce type :

  • <span title="texte1">
  • <span title="texte2">

etc...

Si je sais maintenant remplacer les guillemets avec le Chr(34) comme ci-dessus, je ne sais pas comment faire pour que la macro me remplace/supprime la balise sachant que les titres sont toujours différents (texte1, texte2...). J'ai donc besoin d'intégrer une variable pour que la macro agisse quel que soit le texte.

Avez-vous cela dans votre besace intellectuelle ?

Merci pour votre aide, je galère avec les moteurs de recherche pour chercher du texte variable, indéfini ou inconnu dans des macros avec variables.

Antoine

Bonjour,

Je l'utilise sur Word, et pas sur Excel, mais bon, cela reste du VBA et de la macro Office.

Oui et non, c'est effectivement du VBA mais chaque logiciel a ses particularités (objets, propriétés et méthodes) comme par exemple "ActiveDocument" tu ne le trouveras pas dans Excel ni même dans Access de même que "Replacement", etc...

Donc, il faut savoir si tu veux utiliser ce code dans Excel ou dans Word, si c'est dans Excel, il te faut activer la référence à l'objet Word --> "Microsoft Word xx.0 Object Library" où xx est le numéro de version mais si le document cible est un Word, il vaut mieux voir sur un forum Word pour trouver des intervenants plus spécialisés Word que Excel

bonjour,

une proposition d'adaptation de ton code

Sub Nettoyer_Annonce()
'
' Nettoyer_Annonce Macro
'
'
    Dim i as Long
    Dim balise(0 To 3) '<- à adapter en fonction du nombre de balises à prendre en compte

    balise(0) = ""
    balise(1) = "<span style=" & Chr(34) & "font-size: 12px;" & Chr(34) & ">"
    balise(2) = "</strong>"
    balise(3) = "<span xml:lang=" & Chr(34) & "en" & Chr(34) & " lang=" & Chr(34) & "en" & Chr(34) & ">"

    With ActiveDocument.Range.Find

        For i = LBound(balise) To UBound(balise) Step 2
            .Text = balise(i + 1)
            .Replacement.Text = balise(i)
            .Forward = True
            .ClearFormatting
            .Wrap = wdFindContinue
            .Execute Replace:=wdReplaceAll
        Next i
    End With

End Sub

Oui et non, c'est effectivement du VBA mais chaque logiciel a ses particularités (objets, propriétés et méthodes) comme par exemple "ActiveDocument" tu ne le trouveras pas dans Excel ni même dans Access de même que "Replacement", etc...

Hello,

Ok, merci, je ne savais pas pour les particularités. Je pensais que le langage pouvait être le même, avec des commandes différentes utilisées vu que les différents logiciels de la suite office ne font effectivement pas les mêmes choses.

Bon, ceci dit, ma question reste entière, et ne concerne pas les commandes utilisées dans ma macro (qui fonctionne avec des chaînes strictement définies) mais la question est :

J'aimerais en effet supprimer (de la même manière que ci-dessus ou d'une autre mais dans la même macro ce serait bien) des balises de ce type :

<span title="texte1">

<span title="texte2">

Je cherche simplement la syntaxe pour remplacer texte1 et texte2, qui se trouvent à l'intérieur de guillemets, par une variable, type * ou ce genre de chose en général utilisée lors de recherche générique.

cela pourrait donner dans mon code :

Balise1 = "<span title=" & Chr(34) & * & Chr(34) & ">"

Bon, sauf que ce code ne fonctionne pas bien entendu (sinon je ne serais pas ici ) mais c'est juste pour vous montrer ce que je recherche. je pense que ce type de remplacement lors d'une recherche est la même sous Excel que Word.

Qu'utilise t-on, sous Excel par exemple, lorsque l'on veut faire une telle recherche de caractères ?

Sur le net, et sur ce forum, j'ai vu plein de modèles, mais cela ne correspond jamais à mon cas, il s'agit toujours d'une chaîne de caractère bien définie, ou qui commence ou se termine par tel ou tel caractère.

Merci.

Antoine

bonjour, une proposition d'adaptation de ton code

Merci h2so4, c'est très sympa ! C'est plus propre ainsi c'est vrai, ça m'évitera de faire une longue suite de commande comme je le faisais avant (j'ai une bonne quarantaine de balises pour l'instant) !

J'ai testé ta macro sur mon Word, cela ne fonctionne pas. Je veux dire la macro ne présente pas d'erreur (elle me semblait d'ailleurs tout à fait logique), mais ne remplace pas le texte par du vide, il affiche brièvement la fenêtre "remplacement en cours", mais rien ne se passe. Je n'arrive pas à saisir pourquoi, j'ai tenté diverses choses pour arriver à un résultat. En vain.

Mais ne te prends surtout pas la tête à tenter de résoudre le schmilblick, je sais que je suis sur un forum Excel, et si j'apprécie beaucoup ton assistance pour améliorer mon code, l'important pour moi et d'arriver à résoudre mon souci de variable. Je n'aurai pas des centaines ou milliers de balises différentes à supprimer, et n'utiliserai cette macro que sur mon ordi (qui supportera très bien cette tâche). Donc, merci, si j'arrive à trouver pourquoi il ne remplace pas le texte pourtant bien orthographié, tant mieux, sinon je continuerai avec mon code tout lourd, même si ça pique les yeux des joyeux programmeurs comme vous qui ont bien raison d'optimiser leur travail !

comme je disais restons focus sur ma question initiale.

Mais encore merci quand même !

Antoine

Bonsoir,

je me rends compte que je n'avais pas bien compris ta demande. Je regarde dès que je peux.

Bonjour,

Avec une petite fonction qui supprime le titre de la balise :

Sub Test()

    Dim Balise1 As String

    Balise1 = "<span title=""texte1"">"

    MsgBox SupprimeBalise(Balise1, "title")

End Sub

Function SupprimeBalise(BL As String, Titre As String) As String

    'recherche dans la balise le mot "title", si trouvé supprime le texte
    If InStr(BL, Titre) <> 0 Then SupprimeBalise = Left(BL, InStr(BL, "=") - 1) & ">"

End Function

Il faut passer deux arguments à la fonction, le premier est le texte de la balise complet et le second le titre cherché. Dans ton cas, on chercher le mot "title" donc, si la balise contient ce mot, le texte sera supprimé.

Voici le résultat avec ma fonction <span title> il te suffit d'adapter et étoffer la fonction pour qu'elle puisse fonctionner pour toutes les balises.

Reviens avec plus d'explications sur le résultat attendu pour que nous puissions mieux t'aider

Bonjour, Avec une petite fonction qui supprime le titre de la balise :

Bonjour Theze,

Merci aussi pour cette réflexion et ce code, mais voilà, je ne veux pas supprimer le texte de la balise, je veux supprimer toute la balise dans son ensemble !

Si j'ai <span title="texte1"> , j'aimerais que la macro supprime toute la ligne <span title="texte1">, et pas seulement texte1.

Le problème pour moi est que dans mes différents fichiers à traiter, ce fameux texte1 n'est jamais le même. D'où la nécessité d'un code qui me supprime toute la ligne <span title="texteX">, quel que soit le texteX en question.

Et c'est ça mon problème, c'est que je ne sais pas par quoi remplacer ce fameux texteX dans ma ligne de commande pour que la macro traite l'ensemble de la ligne quel que soit le texte contenu dans les guillemets.

en résumé, j'aimerais une commande du type : Supprimer ligne <span title="*"> ou Remplacer ligne <span title="*"> par rien.

Est-ce plus clair ainsi ?

En tout cas, encore merci, j'ai du mal à m'en sortir avec cette simple ligne de commande...

Antoine

bonjour,

as-tu essayé ceci, (non testé)

With ActiveDocument.Range.Find

            .Text = "<span title=""*"">"
            .Replacement.Text =""
            .Forward = True
            .ClearFormatting
            .Wrap = wdFindContinue
            .Execute Replace:=wdReplaceAll

    End With

Et bien il te suffit de contrôler si dans la balise il y a le mot "title" et supprimer la ligne :

Sub Test()

    Dim Balise1 As String

    Balise1 = "<span title=""texte1"">"

    MsgBox "Début de la balise : '" & Balise1 & "' fin de la balise !"

    If InStr(Balise1, "title") <> 0 Then Balise1 = ""

    MsgBox "Début de la balise : '" & Balise1 & "' fin de la balise !"

End Sub

bonjour,

une solution avec excel

Sub aargh()
'choix du fichier à corriger
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .Title = "fichier html à ouvrir "
        .Filters.Clear
        .Filters.Add "html files", "*.htm*,*.txt"

        If .Show = True Then
            lmf = .SelectedItems(1)
        Else
            MsgBox "pas de fichier sélectionné"
            Exit Sub
        End If
    End With

    'ouverture du fichier et lecture du fichier
    Set fso = CreateObject("scripting.filesystemobject")
    Set ts = fso.OpenTextfile(lmf)
    r = ts.readall
    ts.Close

        ' chargement en A1 sur onglet actif
    Cells(1, 1) = r
    'remplacement
    Cells(1, 1).Replace "<span title=""*"">", ""

    ' ecriture des modifications dans un nouveau fichier
    r = Cells(1, 1)
    Cells(1, 1) = ""
    Set ts = fso.createTextfile("fichiercorrigé.html", True)
    ts.write r
    ts.Close
End Sub
12corrigehtml.xlsm (15.58 Ko)

bonjour,

as-tu essayé ceci, (non testé)

With ActiveDocument.Range.Find

.Text = "<span title=""*"">"

.Replacement.Text =""

.Forward = True

.ClearFormatting

.Wrap = wdFindContinue

.Execute Replace:=wdReplaceAll

End With

Bonjour h2so4,

Ben non, merci beaucoup, mais cela ne fonctionne pas. Tes commandes fonctionnent si je remplace l'* par la vraie valeur. Par exemple, si j'écris : .Text = "<span title=""h2so4"">" et que dans mon fichier j'ai la ligne <span title="h2so4"> alors cela fonctionne. Mais il ne prend pas l'* comme variable pour remplacer n'importe quelle ligne. Je n'ai pas d'erreur, mais il ne se passe rien.

Antoine

Et bien il te suffit de contrôler si dans la balise il y a le mot "title" et supprimer la ligne :

Sub Test()

    Dim Balise1 As String

    Balise1 = "<span title=""texte1"">"

    MsgBox "Début de la balise : '" & Balise1 & "' fin de la balise !"

    If InStr(Balise1, "title") <> 0 Then Balise1 = ""

    MsgBox "Début de la balise : '" & Balise1 & "' fin de la balise !"

End Sub

Alors merci aussi Theze. Si je n'ai pas d'erreur non plus avec cette macro, il ne se passe rien non plus, hélas.

J'ai essayé en me basant sur ta macro de la simplifier encore (j'ai supprimé les MsgBox je n'en voyais pas trop l'utilité) :

Sub test()
    Dim Balise1 As String
    Balise1 = "toto"
    If InStr(Balise1, "toto") <> 0 Then Balise1 = ""
End Sub

J'ai écris toto dans mon fichier word, et pourtant, rien ne se passe. Pourtant, elle me semble simple et juste ta méthode. Y-a-t'il un bug dans mon word ?Je ne vois pourtant pas où est l'erreur qui fait que rien ne se passe avec le mot toto.

Cela dit, dans ton exemple, Balise 1 semble définie de manière rigoureuse <span title="texte1">, or dans mes annonces ce n'est jamais le même titre (d'où ma requête pour remplacer le texte1 par une variable type *.

Arg.... décidément, moi qui croyait que ma question, quel symbole type * pour mettre entre les guillemets, serait plus ou moins simple à résoudre, je vois que c'est plus complexe que je ne pensais.

Antoine

bonjour,

une solution avec excel

Sub aargh()
'choix du fichier à corriger
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .Title = "fichier html à ouvrir "
        .Filters.Clear
        .Filters.Add "html files", "*.htm*,*.txt"

        If .Show = True Then
            lmf = .SelectedItems(1)
        Else
            MsgBox "pas de fichier sélectionné"
            Exit Sub
        End If
    End With

    'ouverture du fichier et lecture du fichier
    Set fso = CreateObject("scripting.filesystemobject")
    Set ts = fso.OpenTextfile(lmf)
    r = ts.readall
    ts.Close

        ' chargement en A1 sur onglet actif
    Cells(1, 1) = r
    'remplacement
    Cells(1, 1).Replace "<span title=""*"">", ""

    ' ecriture des modifications dans un nouveau fichier
    r = Cells(1, 1)
    Cells(1, 1) = ""
    Set ts = fso.createTextfile("fichiercorrigé.html", True)
    ts.write r
    ts.Close
End Sub

Fouchtra! Merci pour tout ce code, h2so4, je n'en demandais pas tant. Si je m'y attendais, d'ailleurs, j'aurais d'ailleurs de suite précisé qu'en fait toutes mes annonces ne sont pas contenues dans différents fichiers HTML, mais sur une seule base de données SQL. Je pourrais l'exporter et l'ouvrir ensuite en CSV sur Excel, pour la traiter en entier d'un seul coup. Mais toutes ces suppressions et nettoyage de code que je fais modifient aussi la mise en page de mes annonces et je préfère passer sur celles-ci une à une, via l'interface de gestion de mon e-commerce, sur Prestashop. Si j'applique une telle macro sur l'ensemble de ma base, ma boutique ne ressemblera plus à rien, du moins les annonces sur celles-ci. Bon, bref, tout ça pour dire que je ne traite pas des fichiers un à un, mais des fiches produits sur une base de données.

Merci pour tout ce début de code qui semble bien efficace, et qui servira peut-être à autrui.

J'ai par contre testé la ligne de ton code qui m'interresse :

Sub aargh()
    Cells(1, 1).Replace "<span title=""*"">", ""
End Sub

Oui, j'ai légèrement simplifié ta macro

Et là, je suis dégouté, ou content, car ça fonctionne. Excel reconnaît bien la phrase : <span title=""*""> et me supprime (enfin, remplace par du vide) toutes les balises titres quel que soit ce dernier, alors que Word, non. Theze parlait de différences entre word et Excel sur certains points, en voici effectivement la preuve.

Il est tard et je suis fatigué, mais je sens que je vais vite basculer l'ensemble de ma macro sur Excel, et l'utiliser pour modifier mes produits.

Je suis pas loin de passer ce sujet en Résolu, vous avez déjà bien assez travaillé dessus (et encore vraiment merci pour ce temps passé), et je vois la réponse poindre à l'horizon.

Bonne nuit à tous et à très bientôt... Je mettrai tout ça au propre ce WE.

Antoine

Hello,

Bon, désolé du temps pris pour le retour sur votre aide.

Je suis donc finalement passé sous Excel, les commandes utilisées me convenaient mieux, et en plus, ça tombe bien, autant j'ai tjs Excel ouvert car je l'utilise pour d'autres choses, autant je n'utilisais que rarement Word.

Ma macro finale est finalement toute simple. La méthode utilisée aussi, c'est très basique.

Sous Prestashop, j'ouvre la page du produit que je veux modifier, j'affiche son code html.

Ctrl-A (tout sélectionner), Ctrl-C (copier) [bon, en fait, je fais Cmd-A et Cmd-C car je suis sur mac, mais je vais parler en PC, on comprendra mieux! ]

Je passe sur mon fichier Excel, vide.

Je clique sur la cellule A1, directement dans le champs de saisie (je ne fais pas un Coller directement car sinon il me met une ligne de code html par ligne excel)

J'appuie sur Enter pour valider la saisie, le curseur se place sur la cellule A2

Je remonte avec la flèche sur la cellule A1 pour qu'elle soit sélectionnée.

Je clique sur le bouton que j'ai placé sur la barre d'outil qui active la macro suivante

Sub Nettoyer_Annonce()Cells(1, 1).Replace "<span xml:lang=""*""*>", ""
Cells(1, 1).Replace "<span class=""*"">", ""
Cells(1, 1).Replace "<span id=""*"">", ""
End Sub

Bon, des lignes "Cells(1,1)..." il y en a beaucoup plus, je remplace beaucoup de lignes de code, par du vide ou par d'autres choses.

Ensuite, une fois la macro appliquée, je réappuie sur Enter, ce qui me fait aller à la cellule A2 (si je fais un Copier directement sur la cellule A1 à ce stade, Excel n'a pas rafraichi le contenu de la cellule et me copiera l'ancienne version de celle-ci, je ne sais pas pourquoi car la macro a pourtant été effectivement appliquée [je le vois dans le champ de saisie de la cellule qui se trouve sous les barres d'outils]).

J'appuie donc sur Enter, et puis de nouveau sur la flèche du haut, pour retourner sur la cellule A1.

Je sélectionne en cliquant et en faisant glisser la souris sur le code sur le champs de saisie de la cellule (Oui, car si je fais un Ctrl-C directement sur la cellule A1, quand je retourne dans Prestashop pour y coller le code, il me place automatiquement un guillemet " en début et fin de code, je ne sais pas pourquoi il a copié ces caractères qui ne sont pourtant pas là. Donc, je dois cliquer sur le champs de saisie et faire une sélection par cliquer-glisser sur tout le texte à l'intérieur de celle-ci puis un Ctrl-C.

Et ensuite, enfin, je peux retourner dans Prestashop (Ctrl-Tab pour passer d'une appli à l'autre) pour coller le code modifié !

Bon, écris, cela peut sembler très long, car j'ai détaillé chaque étape. Concrètement, tous ces cliques et appuis sur clavier sont relativement rapides et cela ne prend que quelques secondes pour chaque étape.

J'économise tout de même du temps par rapport à la version précédente (où je faisais un rechercher-remplacer pour chaque balise à remplacer sur un éditeur de texte simple).

J'imagine que la chose pourrait encore être, bien entendu, simplifiée, avec une fenêtre de saisie dans laquelle coller le code initial, puis un bouton qui applique la macro et Copie directement le nouveau code dans le Presse-papier. Mais, et d'une, je ne sais pas faire cela, deuzio, vous m'avez déjà bien aidé et je m'en sortirai avec la méthode actuelle.

Voilà, merci de m'avoir orienté vers Excel, c'est déjà bien mieux qu'avec Word, et cela correspond plus à mon utilisation habituelle.

Merci spécialement à h2so4 et Theze pour votre assistance.

Passez tous une belle journée et à bientôt !

Antoine

Bonjour,

une ébauche de programme

Sub aargh()
    dl = Cells(Rows.Count, "J").End(xlUp).Row 'dl dernière ligne en colonne J (table de remplacement)
    Range("A3") = Range("A2") 'copie A2 en A3 (texte à convertir en A2, résultat conversion en A3)
    With Range("A3") 'on travaille sur A3
        For i = 3 To dl 'pour chaque ligne de la table de remplacement
            Initial = Cells(i, "J") 'on prend le texte initial
            Final = Cells(i, "K") 'on prend le texte final
            .Replace Initial, Final, lookat:=xlPart 'on remplace initial  par final
        Next i
        .Copy ' on copie A3 dans le presse-papier
    End With
End Sub
14coullalier.xlsm (14.77 Ko)

Hello,

Je viens de procéder à des essais avec ton programme. Tout d'abord, merci beaucoup pour ce dernier, c'est très sympa d'avoir pris du temps pour le réaliser.

J'étais en formation la semaine dernière, voilà pourquoi j'ai pris un peu de temps pour répondre.

Ton code fonctionne bien, merci.

Je rencontre néanmoins un souci, en effet, tous les guillemets sont doublés lors du Coller, et Excel en place un au début et à la fin du bloc de texte collé.

J'en reviens donc à ma manip précédemment décrite, c'est à dire que je colle le texte initial dans la zone de saisie de la cellule A2 (je ne peux le faire directement sur la cellule sinon il met une ligne de code par ligne dans le tableau excel), et une fois que j'ai cliqué sur le bouton "Remplacer" de ta macro, je sélectionne manuellement le texte dans la zone de saisie pour faire un copier-coller manuel, qui se fait alors sans ces ajouts de guillemets.

Vois-tu ce que je veux dire ou veux-tu que je fasse une vidéo de la manip ?

Je ne sais pas si je devrais aller ouvrir ce fichier texte et procéder à un copier-coller. Je ne gagnerai pas de temps à faire tout cela, autant continuer avec la manip actuelle (avec ta macro ou la mienne, c'est pareil). Si le problème vient des saut de ligne dans la cellule (Alt-Entrée), je peux difficilement les ôter, car ce serait bien trop fastidieux à faire sur chacune de mes annonces avant chaque opération de coller-remplacement-copier-coller.

Bon, retour au point de départ donc, ou presque, car j'ai quand même maintenant deux macros qui fonctionnent pour faire du remplacement de texte !

Mais j'ai le souci du Coller de ce texte modifié si je procède à un copier automatique et pas manuel.

Tu as le droit de laisser tomber, j'imagine que tu as bien autre chose à faire et tu as déjà bien assez fait par rapport à ma demande initiale. Je te remercie déjà pour le boulot réalisé, il servira sûrement, en l'état, à d'autres aussi.

Sinon, je reste ouvert à toutes suggestion, et suis disponible si besoin pour répondre à toute demande.

Belle fin de journée à tous,

Antoine

Bonjour,

je n'ai pas ce problème de guillemets. le contenu du presse-papier est bien identique à ce que je trouve dans la cellule excel. tu peux vérfier en faisant un copier-coller dans notepad par exemple.

ben moi, si, j'ai ce souci, même quand je fais un coller sur un éditeur de texte simple. Idem si je tente un coller sur ce forum (je n'ai fait sans valider sur ce message). En fait, les guillemets sont bien dans le presse-papier, même s'ils n'apparaissent pas dans la cellule copiée.

Voici le résultat dans Excel avec ta macro, tout semble parfait

capture d ecran 2019 09 16 a 14 48 02

Et voici le même une fois collé dans un éditeur de texte, je n'ai rien fait entre les deux.

capture d ecran 2019 09 16 a 14 48 19

C'est peut-être dû à la version Excel que j'utilise (2011 pour Mac), mais il est vrai que le gars sur generation-nt l'avait aussi sur excel 2003 pour PC.

Pas facile de résoudre un problème qui ne se produit pas chez soi, c'est sûr.

Antoine

Rechercher des sujets similaires à "supprimer balise html guillemets texte variable"