Cas particulier: chaîne de caractere

Fermé
djamat Messages postés 31 Date d'inscription mercredi 4 mars 2009 Statut Membre Dernière intervention 23 mai 2013 - Modifié par djamat le 16/05/2013 à 11:00
djamat Messages postés 31 Date d'inscription mercredi 4 mars 2009 Statut Membre Dernière intervention 23 mai 2013 - 22 mai 2013 à 11:43
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

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
Modifié par Patrice33740 le 22/05/2013 à 11:26
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
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 239
20 mai 2013 à 20:23
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
Modifié par Patrice33740 le 21/05/2013 à 09:06
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
djamat Messages postés 31 Date d'inscription mercredi 4 mars 2009 Statut Membre Dernière intervention 23 mai 2013 28
21 mai 2013 à 11:19
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
21 mai 2013 à 12:10
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
djamat Messages postés 31 Date d'inscription mercredi 4 mars 2009 Statut Membre Dernière intervention 23 mai 2013 28
21 mai 2013 à 13:10
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
21 mai 2013 à 14:14
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
djamat Messages postés 31 Date d'inscription mercredi 4 mars 2009 Statut Membre Dernière intervention 23 mai 2013 28
21 mai 2013 à 15:06
Merci Patrice, ca à l'air de fonctionner. Je continue à adapter ton code au mien et ca devrait etre bon.

Merci pour ton aide!!
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
21 mai 2013 à 15:12
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

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

Posez votre question
djamat Messages postés 31 Date d'inscription mercredi 4 mars 2009 Statut Membre Dernière intervention 23 mai 2013 28
22 mai 2013 à 10:40
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
djamat Messages postés 31 Date d'inscription mercredi 4 mars 2009 Statut Membre Dernière intervention 23 mai 2013 28
22 mai 2013 à 11:43
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