Cas particulier: chaîne de caractere
djamat
Messages postés
31
Date d'inscription
Statut
Membre
Dernière intervention
-
djamat Messages postés 31 Date d'inscription Statut Membre Dernière intervention -
djamat Messages postés 31 Date d'inscription Statut Membre Dernière intervention -
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'):
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:
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.
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.
A voir également:
- Cas particulier: chaîne de caractere
- Meilleur site de vente entre particulier - Guide
- Cas ram - Guide
- Chaque fichier en ligne sur le web a un chemin d’accès sur un serveur. c’est le cas du fichier du logo présent sur la page de cette ville. quel est le chemin de ce fichier à partir de la racine du site ? - Forum Graphisme
- Annuaire espagne gratuit particulier ✓ - Forum telephonie fixe
- Comment désactiver le schéma de verrouillage en cas d'oubli - Guide
6 réponses
Bonjour,
Pour écrire sur la première ligne libre du tableau (au lieu de la colonne), remplaces la ligne :
Et pour les titres, remplaces :
Cordialement
Patrice
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 + 1Par:
freeLine = .UsedRange.Rows.Count + 1
Et pour les titres, remplaces :
C.Value = BalPar :
C.Value = UCase(Bal)
Cordialement
Patrice
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
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
Pour le texte encadré par la première balise :
PS : cette ligne n'apparait pas correctement (à cause des balises) :
voici le texte visible dans lequel il faut remplacer { et } par [ et ]
Cordialement
Patrice
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
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
<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
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.
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.
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 ...
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 ...