Cas particulier: chaîne de caractere

djamat Messages postés 33 Statut Membre -  
djamat Messages postés 33 Statut Membre -
Bonjour à tous,

Je suis debutant en Vba et je rencontre quelques soucis mon code:

Projet: récupérer des chaines de caractères d'un fichier Word vers excel à laide de balises en vba.

Actuel: j'arrive bien à récupérer mes chaines quand le texte se présente comme ci dessous:
[balise] blablabla [/balise]

Problème1: les chaines se présentent de temps en temps du type:
[balise]
blablabla
[/balise]
De cette manière mon code ne récupère pas la chaîne.

Je pensais résoudre ce soucis en changeant un opérateur logique (en rajoutant '=' ou 'OR'):

If InStr(1, Txt, "[& Bal & "]") >= 0 Then


mais le compilateur me donne une erreur 3 lignes en dessous;

Problème2: les chaines se présentent de temps en temps du type:
[balise]
blablabla [textTech] blablabla [/balise]
Dans ce cas, mon code ne récupère pas la chaîne car il y a d'autres [] entre le début et la fin de la balise. [textTech]= fait partie de la chaîne à récupérer avec blabla;

voici une partie de mon code:

For Each Paragraphe In WordDoc.Paragraphs
         'pour chaque paragraphe on verifie si il y a un [ et un ]
         Txt = Paragraphe.Range.Text
         Deb = InStr(1, Txt, "[")
         Fin = InStr(1, Txt, "]")
 
         If Deb > 0 And Fin > 0 Then
            Bal = Mid(Txt, Deb + 1, Fin - 2)
            If InStr(1, Txt, "[& Bal & "]") > 0 Then
               Deb = InStr(1, Txt, "[" & Bal & "]") + Len("[" & Bal & "]")
               Fin = InStr(1, Txt, "[& Bal & "]") - Len("[& Bal & "]")
               Txt = Mid(Txt, Deb, Fin)


FYI: les balises ne s'appellent pas toujours 'balise' c'est pour ça que je me base sur [ et [/

Merci par avance pour votre aide.

6 réponses

  1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    Bonjour,

    Pour écrire sur la première ligne libre du tableau (au lieu de la colonne), remplaces la ligne :
          freeLine = .Cells(.Rows.Count, C.Column).End(xlUp).Row + 1
    Par:
          freeLine = .UsedRange.Rows.Count + 1


    Et pour les titres, remplaces :
            C.Value = Bal
    Par :
            C.Value = UCase(Bal)

    Cordialement
    Patrice
    1
  2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonsoir,

    Pas forcément simple ton truc.
    Tu ne veux pas fournir un .doc avec une chaine correcte et 2 avec tes anomalies, ainsi que ton .xls ?
    Déposer les fichiers sur cjoint.com et coller ici le lien fourni.

    eric
    0
  3. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    Pour le texte encadré par la première balise :

      Txt = Paragraphe.Range.Text
      Deb = 1
      Deb = InStr(Deb, Txt, "[") + 1
      Fin = InStr(Deb, Txt, "]")
      If Deb > 0 And Fin > 0 Then
        Bal = Mid(Txt, Deb, Fin - Deb)
        Deb = Fin + 1
        Fin = InStrRev(Txt, "& Bal & "")
        If Fin > 0 Then
          Txt = Mid(Txt, Deb, Fin - Deb)
        End If
      End If
     


    PS : cette ligne n'apparait pas correctement (à cause des balises) :
        Fin = InStrRev(Txt, "& Bal & "")

    voici le texte visible dans lequel il faut remplacer { et } par [ et ]
        Fin = InStrRev(Txt, "{/" & Bal & "}")

    Cordialement
    Patrice
    0
  4. djamat Messages postés 33 Statut Membre 28
     
    Fichier contenant 3 cas differents de balises, 1 qui fonctionne et 2 autres qui ne focntionnent pas
    <a href="https://www.casimages.com/f.php?f=130521111827734063.doc" target="_blank">Lien vers mon fichier</a>

    Document .txt, contenant ma macro
    <a href="https://www.casimages.com/f.php?f=130521111729432861.txt" target="_blank">Lien vers mon fichier</a>

    Merci pour votre aide

    @patrice je vais tester ta solution
    0
    1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
       
      C'est normal que tu aies des problèmes avec certains de tes exemples car tu traites les paragraphes séparément un par un, alors que certaines balises englobent plusieurs paragraphes.

      Tu dois traiter le texte dans sa globalité.

      Pour mémoire, dans Word, un nouveau paragraphe est créé chaque fois que tu tapes Entrée (cela provoque un retour à la ligne normal).

      L'exemple que le t'ai fourni suppose que la balise d'ouverture et la balise de fermeture ne sont présentes qu'une seule fois dans le texte, si plusieurs balises peuvent être imbriquées, il faut procéder différemment.
      0
    2. djamat Messages postés 33 Statut Membre 28
       
      ok je comprends mieux
      Donc il faut que l'user évite de taper sur 'Entrer' :)
      Ou que je revois entièrement mon code :(

      Mais je ne vois pas comment je peux parcourir le texte autrement que par paragraphe...
      0
    3. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
       
      Essaies ce code :
      Sub test()
         
      ' Ajouter la référence à Microsoft Word XX.X Object Library
      
      Dim WordApp As New Word.Application
      Dim WordDoc As Word.Document
      Dim C As Range
      Dim Doc As String, Txt As String, Bal As String
      Dim Deb As Long, Fin As Long
      Dim freeLine As Long
         
      'le document Word est supposé fermé avant le lancement de la macro
      With Sheets("Feuil4")
        .Cells.Clear
        'chemin fichier word en entrée choisis par l'user
        fichier = ThisWorkbook.Path & "\test.doc"
        'ouverture du fichier Word
        Set WordDoc = WordApp.Documents.Open(fichier)
        Doc = WordDoc.Range
        'initialisation pointeur
        Deb = 1
        'chercher les textes balisés
        Do
          Deb = InStr(Deb, Doc, "[") + 1
          Fin = InStr(Deb, Doc, "]")
          If Deb = 1 Or Fin = 0 Then Exit Do
          Bal = Mid(Doc, Deb, Fin - Deb)
          Deb = Fin + 1
          Fin = InStr(Deb, Doc, "& Bal & "")
          If Fin > 0 Then
            Txt = Mid(Doc, Deb, Fin - Deb)
            'entete de colonne cad bal
            Set C = .Rows(1).Find(Bal, , , xlWhole)
            If C Is Nothing Then
              If .Cells(1, 1) = "" Then
                Set C = .Cells(1, 1)
              Else
                Set C = .Cells(1, .Columns.Count).End(xlToLeft).Offset(, 1)
              End If
              'on copie l'entete dans une cellule
              C.Value = Bal
            End If
            freeLine = .Cells(.Rows.Count, C.Column).End(xlUp).Row + 1
            .Cells(freeLine, C.Column) = Txt
          End If
        Loop
        .Columns.AutoFit
      End With
         
      WordDoc.Close
      WordApp.Quit
      Set WordDoc = Nothing
      Set WordApp = Nothing
         
      End Sub
      0
    4. djamat Messages postés 33 Statut Membre 28
       
      Merci Patrice, ca à l'air de fonctionner. Je continue à adapter ton code au mien et ca devrait etre bon.

      Merci pour ton aide!!
      0
    5. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
       
      Il est préférable de refermer le document aussitôt lu :

        'ouverture du fichier Word
        Set WordDoc = WordApp.Documents.Open(fichier)
        Doc = WordDoc.Range
        WordDoc.Close
        WordApp.Quit
        Set WordDoc = Nothing
        Set WordApp = Nothing
        'initialisation pointeur
        ......
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. djamat Messages postés 33 Statut Membre 28
     
    J'aurai un petit dernier service à vous demander:

    Je dois inserer mes chaines de textes dans differentes cellule selon la position de la derniere.
    Cad si on a ecrit en B2, et que l'on recuperer une chaine à mettre en C alors la chaine sera en C3 et non sur la premiere ligne vide de la colonne. Et la je bug.
    Un exemple en attachement du rendu souhaite.

    <a href="https://www.casimages.com/f.php?f=130522104242423699.xls" target="_blank">Lien vers mon fichier</a>

    Si vous auriez une idee, je suis preneur.

    PS: je rappelle que mon niveau en VBA nest pas extraordinaire ...
    0
  7. djamat Messages postés 33 Statut Membre 28
     
    Merci Patrice, jetais parti dans des compteur de ligne oups ...

    Effectivement cela fonctionne parfaitement, je te remercie et en esperant pouvoir te rendre la meme un jour !!
    0