Cas particulier: chaîne de caractere
djamat
Messages postés
33
Statut
Membre
-
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'):
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
- Comment désactiver le schéma de verrouillage en cas d'oubli - Guide
- Annuaire espagne gratuit particulier - Forum Mobile
- Signature électronique gratuite pour particulier - Accueil - Confidentialité
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 ...