Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

+ split et vlookup

10 réponses
Avatar
Lionel
Suite,
en fait j'ai ceci dans une macro :
Print #1, " " + RColonne
je voudrais faire un découpage d'une chaîne de caractères sur ce
résultat et aller chercher (l'élément découpé 1) dans une matrice
A1:C6500;2;0 d'un fichier valeurs.xls et renvoyer le résultat dans un
fichier res.txt, id. pour l'élément 2, etc.

10 réponses

Avatar
Daniel
Bonjour.
Si les données à découper sont en colonne E sur la même feuille que la
matrice :

Sub EcrisFichierTexte()
Dim c As Range, Var
Const Chemin = "e:donneesdanielmpfe"
Open Chemin & "res.txt" For Output As #1
For Each c In Range("E1", Range("E65536").End(xlUp))
For Each Item In Split(c)
Var = Application.VLookup(Item, Range("A1:C6500"), 2, 0)
If Not Application.IsNA(Var) Then
Print #1, Var
End If
Next Item
Next c
Close #1
End Sub

Cordialement.
Daniel
"Lionel" a écrit dans le message de news:

Suite,
en fait j'ai ceci dans une macro :
Print #1, " " + RColonne
je voudrais faire un découpage d'une chaîne de caractères sur ce résultat
et aller chercher (l'élément découpé 1) dans une matrice A1:C6500;2;0 d'un
fichier valeurs.xls et renvoyer le résultat dans un fichier res.txt, id.
pour l'élément 2, etc.


Avatar
L
Merci Daniel,
cela fonctionne très bien. Toutefois, je souhaiterais l'implémenter
comme ceci sachant que mon code me permet d'écrire un fichier xml à
partir d'un fichier excel

Option Explicit

Sub createXmlFile()
Dim RBase As Range, RLigne As Range, RColonne As Range
Dim tagName As String

Set RBase = Range("BaseTableau") ' nommer la première colonne du
tableau "BaseTableau"

Open "C:Documents and SettingsLionelBureau4xml.xml" For Output As 1
Print #1, "<?xml version=""1.0"" encoding=""UTF-8""?>"
' Print ou Print #1 provoque par défaut un retour chariot en find
d'écriture
' pour l'éviter et avoir une présentation tabulée il faut mettre un
point-virgule ";"
' pour mettre des guillemets dans une chaîne de caractère il faut
les doubler ""bla"" donne "bla" ou Chr(34)
' note les ; à la fin empêchent de revenir à la ligne
Print #1, "<retranscription>"
' balayer les lignes
For Each RLigne In Range(RBase.Offset(1), RBase.End(xlDown))
'nom du node
Print #1, "<retranscription>"
' valeur du node
' attention la valeur 2 à Mid(Rligne, 1) fait disparaître un
caractère, je l'ai mise à 1
Print #1, " " + Mid(RLigne, 1)
' ecriture des childnodes
For Each RColonne In Range(RLigne.Offset(0, 1),
RLigne.End(xlToRight))
' Si cellule vide, on ignore
If RColonne <> "" Then
' le nom de la balise est pris sur la premiere ligne
tagName = Intersect(RBase.EntireRow, RColonne.EntireColumn)
Print #1, " <attribute name="; Chr(34) & "" + tagName +
Chr(34) & " >"
If IsNumeric(RColonne) Then
Print #1, " " + Str(RColonne)
Else
Print #1, " " + RColonne

c'est le résultat de cette insertion je souhaiterais spliter faire un
vlookup (sur uine matrice se trouvant dans un autre fichier)sur l'item
et renvoyer le résultat à écrire dans mon fichier xml.

For Each c In Range("E1", Range("E65536").End(xlUp))
For Each Item In Split(c)
Var = Application.VLookup(Item, Range("A1:C6500"), 2, 0)
If Not Application.IsNA(Var) Then
Print #1, Var
End If
Next Item
Next c
ensuite je ferme le tag

End If
Print #1, " </" + tagName + ">"
End If
Next
Print #1, "</s>"
Next
Print #1, "</retranscription>"
Print #1, "<!-- tout semble s'être bien passé -->"
Close 1
End Sub

D'avance merci,
Lionel


Cordialement.
Daniel
"Lionel" a écrit dans le message de news:

Suite,
en fait j'ai ceci dans une macro :
Print #1, " " + RColonne
je voudrais faire un découpage d'une chaîne de caractères sur ce résultat
et aller chercher (l'élément découpé 1) dans une matrice A1:C6500;2;0 d'un
fichier valeurs.xls et renvoyer le résultat dans un fichier res.txt, id.
pour l'élément 2, etc.






Avatar
Daniel
c'est le résultat de cette insertion je souhaiterais spliter faire un
vlookup (sur uine matrice se trouvant dans un autre fichier)sur l'item et
renvoyer le résultat à écrire dans mon fichier xml.


J'ai du mal à comprendre ce que tu appelles "résultat de cette insertion".
Pour le fichier externe, au lieu de :
Range("A1:C6500")
il faut coder :
Workbooks("toto.xls").sheets("Feuiln").Range("A1:C6500")

Daniel

Avatar
L
c'est le résultat de cette insertion je souhaiterais spliter faire un
vlookup (sur uine matrice se trouvant dans un autre fichier)sur l'item et
renvoyer le résultat à écrire dans mon fichier xml.


J'ai du mal à comprendre ce que tu appelles "résultat de cette insertion".
Je me suis mal exprimé.

Print #1, " " + RColonne
m'écrit dans mon fichier ce qui se trouve dans la cellule pour l'instant.
Pour le fichier externe, au lieu de :
Range("A1:C6500")
il faut coder :
Workbooks("toto.xls").sheets("Feuiln").Range("A1:C6500")
ok


Daniel


Si je m'explique mieux cela pourrait donner ça :
- pour l'ensemble des collones A, B, C de ma feuille
- conserver ça
For Each RColonne In Range(RLigne.Offset(0, 1),
RLigne.End(xlToRight))
' Si cellule vide, on ignore
If RColonne <> "" Then
' le nom de la balise est pris sur la premiere ligne
tagName = Intersect(RBase.EntireRow, RColonne.EntireColumn)
Print #1, " <attribute name="; Chr(34) & "" + tagName +
Chr(34) & " >"
If IsNumeric(RColonne) Then
Print #1, " " + Str(RColonne)
Else
Print #1, " " + RColonne
- pour une collone donnée D par exemple
- lire le contenu de la cellule D2
- si elle n'est pas vide découper le contenu
- item 1, 2, ... n (on l'appellera "item")
- je cherche dans toto.xls la matrice A:1C650;2;0 (on l'appellera "res")
- le résultat est écrit comme ceci <attribute name="res1">item1</attribute>
- passer au suivant <attribute name="res2">item2</attribute>
- etc.
- passer à la cellule D3
- lorsque c'est fini continuer pour la colonne E comme pour les colonnes
A, B, C


Lionel





Avatar
Daniel
Si j'ai compris, le traitement de la colonne D peut se voir comme suit :

Workbooks.Open "c:temptoto.xls"
ThisWorkbook.Activate
For Each c In Range("D2", Range("D65536").End(xlUp))
For Each Item In Split(c)
res = Application.VLookup(Item, _
Workbooks("toto.xls").Sheets("Feuil1").Range("res"), 2, 0)
If Not Application.IsNA(res) Then
Enrgt = "<attribute name=""" & res & """" & _
Item & "</attribute>"
Print #1, Enrgt
End If
Next Item
Next c
Workbooks("toto.xls").Close
(non testé)

Daniel
"L" a écrit dans le message de news:



c'est le résultat de cette insertion je souhaiterais spliter faire un
vlookup (sur uine matrice se trouvant dans un autre fichier)sur l'item
et renvoyer le résultat à écrire dans mon fichier xml.


J'ai du mal à comprendre ce que tu appelles "résultat de cette
insertion".
Je me suis mal exprimé.

Print #1, " " + RColonne
m'écrit dans mon fichier ce qui se trouve dans la cellule pour l'instant.
Pour le fichier externe, au lieu de :
Range("A1:C6500")
il faut coder :
Workbooks("toto.xls").sheets("Feuiln").Range("A1:C6500")
ok


Daniel


Si je m'explique mieux cela pourrait donner ça :
- pour l'ensemble des collones A, B, C de ma feuille
- conserver ça
For Each RColonne In Range(RLigne.Offset(0, 1),
RLigne.End(xlToRight))
' Si cellule vide, on ignore
If RColonne <> "" Then
' le nom de la balise est pris sur la premiere ligne
tagName = Intersect(RBase.EntireRow, RColonne.EntireColumn)
Print #1, " <attribute name="; Chr(34) & "" + tagName +
Chr(34) & " >"
If IsNumeric(RColonne) Then
Print #1, " " + Str(RColonne)
Else
Print #1, " " + RColonne
- pour une collone donnée D par exemple
- lire le contenu de la cellule D2
- si elle n'est pas vide découper le contenu
- item 1, 2, ... n (on l'appellera "item")
- je cherche dans toto.xls la matrice A:1C650;2;0 (on l'appellera "res")
- le résultat est écrit comme ceci <attribute
name="res1">item1</attribute>
- passer au suivant <attribute name="res2">item2</attribute>
- etc.
- passer à la cellule D3
- lorsque c'est fini continuer pour la colonne E comme pour les colonnes
A, B, C


Lionel






Avatar
L
vraiment merci Daniel, mais j'ai bien du mal à le mettre en place vu que
je n'y connais pas grand chose en VBA. je suis un poil perdu là ! en
même temps j'essaie de mettre cela dans une macro existante (ceci
explique peut-être cela !?)

En bref, voici mon code :

Sub createXmlFile()
Dim RBase As Range, RLigne As Range, RColonne As Range
Dim tagName As String

Set RBase = Range("BaseTableau") ' nommer la première colonne du
tableau "BaseTableau"

Open "C:Documents and SettingsLionelBureau2xml.xml" For Output As 1
Print #1, "<mon_document>"
' balayer les lignes
For Each RLigne In Range(RBase.Offset(1), RBase.End(xlDown))
'nom du node
Print #1, "<sujet>"
' valeur du node
Print #1, " " + Mid(RLigne, 2)
' ecriture des childnodes
For Each RColonne In Range(RLigne.Offset(0, 1),
RLigne.End(xlToRight))
' Si cellule vide, on ignore
If RColonne <> "" Then
' le nom de la balise est pris sur la premiere ligne
tagName = Intersect(RBase.EntireRow, RColonne.EntireColumn)
Print #1, " <" + tagName + ">"
If IsNumeric(RColonne) Then
Print #1, " " + Str(RColonne)
Else
Print #1, " " + RColonne
End If
Print #1, " </" + tagName + ">"
End If
Next
Print #1, "</s>"
Next
Print #1, "</mon_document>"
Close 1
End Sub

cela fonctionne bien et me donne un truc du genre
<?xml version="1.0" encoding="ISO-8859-1"?>
<mon_document>
<s>
SB
<Pilote>
P
</Pilote>
<tour>
t
</tour>
<comptage>
compt
</comptage>
<trl>
ah ça a bougé c' est ça ?
</trl>
etc ...
</mon_document>
pour "s", "pilote, "tour", "comptage" et "trl" les étiquettes en A1, B1,
C1 et D1 de mes colonnes. Ce que j'aimerais faire maintenant c'est pour
la colonne D (et uniquement celle_là) qui donne le résultat
<trl>
ah ça a bougé c' est ça ?
</trl>

faire en plus un découpage de la chaîne, tel que :

ah - et aller chercher dans une matrice
ça - et aller chercher dans une matrice
a - et aller chercher dans une matrice
bougé - et aller chercher dans une matrice
c' - et aller chercher dans une matrice
ça - et aller chercher dans une matrice
? - et aller chercher dans une matrice

puis écrire à la fois l'item et le résultat de la recherche (vlookup())
pour un résultat attendu du genre :

<mot>
ah
<resultat>
interjection
</résultat>
</mot>
<mot>
ça
<resultat>
pronom_demonstratif
</résultat>
</mot>

ou bien :

<mot attribute="interjection">
ah
</mot>
<mot attribute="pronom_démonstratif">
ça
</mot>
etc ...

ensuite il continue à traiter les autres colonnes comme avant.
Je n'ai pas pu tester ta proposition puisque je n'arrive pas à
l'implémenter dans le bout de code que j'ai (c'est pourquoi il est plus
simple que je mette directement ce bout de code).

Lionel


Si j'ai compris, le traitement de la colonne D peut se voir comme suit :

Workbooks.Open "c:temptoto.xls"
ThisWorkbook.Activate
For Each c In Range("D2", Range("D65536").End(xlUp))
For Each Item In Split(c)
res = Application.VLookup(Item, _
Workbooks("toto.xls").Sheets("Feuil1").Range("res"), 2, 0)
If Not Application.IsNA(res) Then
Enrgt = "<attribute name=""" & res & """" & _
Item & "</attribute>"
Print #1, Enrgt
End If
Next Item
Next c
Workbooks("toto.xls").Close
(non testé)

Daniel
"L" a écrit dans le message de news:


c'est le résultat de cette insertion je souhaiterais spliter faire un
vlookup (sur uine matrice se trouvant dans un autre fichier)sur l'item
et renvoyer le résultat à écrire dans mon fichier xml.
J'ai du mal à comprendre ce que tu appelles "résultat de cette

insertion".
Je me suis mal exprimé.

Print #1, " " + RColonne
m'écrit dans mon fichier ce qui se trouve dans la cellule pour l'instant.
Pour le fichier externe, au lieu de :
Range("A1:C6500")
il faut coder :
Workbooks("toto.xls").sheets("Feuiln").Range("A1:C6500")
ok

Daniel
Si je m'explique mieux cela pourrait donner ça :

- pour l'ensemble des collones A, B, C de ma feuille
- conserver ça
For Each RColonne In Range(RLigne.Offset(0, 1),
RLigne.End(xlToRight))
' Si cellule vide, on ignore
If RColonne <> "" Then
' le nom de la balise est pris sur la premiere ligne
tagName = Intersect(RBase.EntireRow, RColonne.EntireColumn)
Print #1, " <attribute name="; Chr(34) & "" + tagName +
Chr(34) & " >"
If IsNumeric(RColonne) Then
Print #1, " " + Str(RColonne)
Else
Print #1, " " + RColonne
- pour une collone donnée D par exemple
- lire le contenu de la cellule D2
- si elle n'est pas vide découper le contenu
- item 1, 2, ... n (on l'appellera "item")
- je cherche dans toto.xls la matrice A:1C650;2;0 (on l'appellera "res")
- le résultat est écrit comme ceci <attribute
name="res1">item1</attribute>
- passer au suivant <attribute name="res2">item2</attribute>
- etc.
- passer à la cellule D3
- lorsque c'est fini continuer pour la colonne E comme pour les colonnes
A, B, C


Lionel







Avatar
Daniel
Ce n'est pas facile du tout pour apprécier quand tu commences à traiter la
colonne E. Le mieux serait que tu mettes ton classeur ou, au moins la
feuille active, sur www.cjoint.com en effaçant les données confidentielles,
s'il y en a.
Daniel
"L" a écrit dans le message de news:

vraiment merci Daniel, mais j'ai bien du mal à le mettre en place vu que
je n'y connais pas grand chose en VBA. je suis un poil perdu là ! en même
temps j'essaie de mettre cela dans une macro existante (ceci explique
peut-être cela !?)

En bref, voici mon code :

Sub createXmlFile()
Dim RBase As Range, RLigne As Range, RColonne As Range
Dim tagName As String

Set RBase = Range("BaseTableau") ' nommer la première colonne du
tableau "BaseTableau"

Open "C:Documents and SettingsLionelBureau2xml.xml" For Output As 1
Print #1, "<mon_document>"
' balayer les lignes
For Each RLigne In Range(RBase.Offset(1), RBase.End(xlDown))
'nom du node
Print #1, "<sujet>"
' valeur du node
Print #1, " " + Mid(RLigne, 2)
' ecriture des childnodes
For Each RColonne In Range(RLigne.Offset(0, 1),
RLigne.End(xlToRight))
' Si cellule vide, on ignore
If RColonne <> "" Then
' le nom de la balise est pris sur la premiere ligne
tagName = Intersect(RBase.EntireRow, RColonne.EntireColumn)
Print #1, " <" + tagName + ">"
If IsNumeric(RColonne) Then
Print #1, " " + Str(RColonne)
Else
Print #1, " " + RColonne
End If
Print #1, " </" + tagName + ">"
End If
Next
Print #1, "</s>"
Next
Print #1, "</mon_document>"
Close 1
End Sub

cela fonctionne bien et me donne un truc du genre
<?xml version="1.0" encoding="ISO-8859-1"?>
<mon_document>
<s>
SB
<Pilote>
P
</Pilote>
<tour>
t
</tour>
<comptage>
compt
</comptage>
<trl>
ah ça a bougé c' est ça ?
</trl>
etc ...
</mon_document>
pour "s", "pilote, "tour", "comptage" et "trl" les étiquettes en A1, B1,
C1 et D1 de mes colonnes. Ce que j'aimerais faire maintenant c'est pour la
colonne D (et uniquement celle_là) qui donne le résultat
<trl>
ah ça a bougé c' est ça ?
</trl>

faire en plus un découpage de la chaîne, tel que :

ah - et aller chercher dans une matrice
ça - et aller chercher dans une matrice
a - et aller chercher dans une matrice
bougé - et aller chercher dans une matrice
c' - et aller chercher dans une matrice
ça - et aller chercher dans une matrice
? - et aller chercher dans une matrice

puis écrire à la fois l'item et le résultat de la recherche (vlookup())
pour un résultat attendu du genre :

<mot>
ah
<resultat>
interjection
</résultat>
</mot>
<mot>
ça
<resultat>
pronom_demonstratif
</résultat>
</mot>

ou bien :

<mot attribute="interjection">
ah
</mot>
<mot attribute="pronom_démonstratif">
ça
</mot>
etc ...

ensuite il continue à traiter les autres colonnes comme avant.
Je n'ai pas pu tester ta proposition puisque je n'arrive pas à
l'implémenter dans le bout de code que j'ai (c'est pourquoi il est plus
simple que je mette directement ce bout de code).

Lionel


Si j'ai compris, le traitement de la colonne D peut se voir comme suit :

Workbooks.Open "c:temptoto.xls"
ThisWorkbook.Activate
For Each c In Range("D2", Range("D65536").End(xlUp))
For Each Item In Split(c)
res = Application.VLookup(Item, _
Workbooks("toto.xls").Sheets("Feuil1").Range("res"), 2, 0)
If Not Application.IsNA(res) Then
Enrgt = "<attribute name=""" & res & """" & _
Item & "</attribute>"
Print #1, Enrgt
End If
Next Item
Next c
Workbooks("toto.xls").Close
(non testé)

Daniel
"L" a écrit dans le message de news:


c'est le résultat de cette insertion je souhaiterais spliter faire un
vlookup (sur uine matrice se trouvant dans un autre fichier)sur l'item
et renvoyer le résultat à écrire dans mon fichier xml.
J'ai du mal à comprendre ce que tu appelles "résultat de cette

insertion".
Je me suis mal exprimé.

Print #1, " " + RColonne
m'écrit dans mon fichier ce qui se trouve dans la cellule pour
l'instant.
Pour le fichier externe, au lieu de :
Range("A1:C6500")
il faut coder :
Workbooks("toto.xls").sheets("Feuiln").Range("A1:C6500")
ok

Daniel
Si je m'explique mieux cela pourrait donner ça :

- pour l'ensemble des collones A, B, C de ma feuille
- conserver ça
For Each RColonne In Range(RLigne.Offset(0, 1),
RLigne.End(xlToRight))
' Si cellule vide, on ignore
If RColonne <> "" Then
' le nom de la balise est pris sur la premiere ligne
tagName = Intersect(RBase.EntireRow,
RColonne.EntireColumn)
Print #1, " <attribute name="; Chr(34) & "" + tagName +
Chr(34) & " >"
If IsNumeric(RColonne) Then
Print #1, " " + Str(RColonne)
Else
Print #1, " " + RColonne
- pour une collone donnée D par exemple
- lire le contenu de la cellule D2
- si elle n'est pas vide découper le contenu
- item 1, 2, ... n (on l'appellera "item")
- je cherche dans toto.xls la matrice A:1C650;2;0 (on l'appellera "res")
- le résultat est écrit comme ceci <attribute
name="res1">item1</attribute>
- passer au suivant <attribute name="res2">item2</attribute>
- etc.
- passer à la cellule D3
- lorsque c'est fini continuer pour la colonne E comme pour les colonnes
A, B, C


Lionel









Avatar
L
OK, je mets le lien en MP,
merci
Lionel

Ce n'est pas facile du tout pour apprécier quand tu commences à traiter la
colonne E. Le mieux serait que tu mettes ton classeur ou, au moins la
feuille active, sur www.cjoint.com en effaçant les données confidentielles,
s'il y en a.
Daniel
"L" a écrit dans le message de news:

vraiment merci Daniel, mais j'ai bien du mal à le mettre en place vu que
je n'y connais pas grand chose en VBA. je suis un poil perdu là ! en même
temps j'essaie de mettre cela dans une macro existante (ceci explique
peut-être cela !?)

En bref, voici mon code :

Sub createXmlFile()
Dim RBase As Range, RLigne As Range, RColonne As Range
Dim tagName As String

Set RBase = Range("BaseTableau") ' nommer la première colonne du
tableau "BaseTableau"

Open "C:Documents and SettingsLionelBureau2xml.xml" For Output As 1
Print #1, "<mon_document>"
' balayer les lignes
For Each RLigne In Range(RBase.Offset(1), RBase.End(xlDown))
'nom du node
Print #1, "<sujet>"
' valeur du node
Print #1, " " + Mid(RLigne, 2)
' ecriture des childnodes
For Each RColonne In Range(RLigne.Offset(0, 1),
RLigne.End(xlToRight))
' Si cellule vide, on ignore
If RColonne <> "" Then
' le nom de la balise est pris sur la premiere ligne
tagName = Intersect(RBase.EntireRow, RColonne.EntireColumn)
Print #1, " <" + tagName + ">"
If IsNumeric(RColonne) Then
Print #1, " " + Str(RColonne)
Else
Print #1, " " + RColonne
End If
Print #1, " </" + tagName + ">"
End If
Next
Print #1, "</s>"
Next
Print #1, "</mon_document>"
Close 1
End Sub

cela fonctionne bien et me donne un truc du genre
<?xml version="1.0" encoding="ISO-8859-1"?>
<mon_document>
<s>
SB
<Pilote>
P
</Pilote>
<tour>
t
</tour>
<comptage>
compt
</comptage>
<trl>
ah ça a bougé c' est ça ?
</trl>
etc ...
</mon_document>
pour "s", "pilote, "tour", "comptage" et "trl" les étiquettes en A1, B1,
C1 et D1 de mes colonnes. Ce que j'aimerais faire maintenant c'est pour la
colonne D (et uniquement celle_là) qui donne le résultat
<trl>
ah ça a bougé c' est ça ?
</trl>

faire en plus un découpage de la chaîne, tel que :

ah - et aller chercher dans une matrice
ça - et aller chercher dans une matrice
a - et aller chercher dans une matrice
bougé - et aller chercher dans une matrice
c' - et aller chercher dans une matrice
ça - et aller chercher dans une matrice
? - et aller chercher dans une matrice

puis écrire à la fois l'item et le résultat de la recherche (vlookup())
pour un résultat attendu du genre :

<mot>
ah
<resultat>
interjection
</résultat>
</mot>
<mot>
ça
<resultat>
pronom_demonstratif
</résultat>
</mot>

ou bien :

<mot attribute="interjection">
ah
</mot>
<mot attribute="pronom_démonstratif">
ça
</mot>
etc ...

ensuite il continue à traiter les autres colonnes comme avant.
Je n'ai pas pu tester ta proposition puisque je n'arrive pas à
l'implémenter dans le bout de code que j'ai (c'est pourquoi il est plus
simple que je mette directement ce bout de code).

Lionel


Si j'ai compris, le traitement de la colonne D peut se voir comme suit :

Workbooks.Open "c:temptoto.xls"
ThisWorkbook.Activate
For Each c In Range("D2", Range("D65536").End(xlUp))
For Each Item In Split(c)
res = Application.VLookup(Item, _
Workbooks("toto.xls").Sheets("Feuil1").Range("res"), 2, 0)
If Not Application.IsNA(res) Then
Enrgt = "<attribute name=""" & res & """" & _
Item & "</attribute>"
Print #1, Enrgt
End If
Next Item
Next c
Workbooks("toto.xls").Close
(non testé)

Daniel
"L" a écrit dans le message de news:

c'est le résultat de cette insertion je souhaiterais spliter faire un
vlookup (sur uine matrice se trouvant dans un autre fichier)sur l'item
et renvoyer le résultat à écrire dans mon fichier xml.
J'ai du mal à comprendre ce que tu appelles "résultat de cette

insertion".
Je me suis mal exprimé.

Print #1, " " + RColonne
m'écrit dans mon fichier ce qui se trouve dans la cellule pour
l'instant.
Pour le fichier externe, au lieu de :
Range("A1:C6500")
il faut coder :
Workbooks("toto.xls").sheets("Feuiln").Range("A1:C6500")
ok

Daniel
Si je m'explique mieux cela pourrait donner ça :

- pour l'ensemble des collones A, B, C de ma feuille
- conserver ça
For Each RColonne In Range(RLigne.Offset(0, 1),
RLigne.End(xlToRight))
' Si cellule vide, on ignore
If RColonne <> "" Then
' le nom de la balise est pris sur la premiere ligne
tagName = Intersect(RBase.EntireRow,
RColonne.EntireColumn)
Print #1, " <attribute name="; Chr(34) & "" + tagName +
Chr(34) & " >"
If IsNumeric(RColonne) Then
Print #1, " " + Str(RColonne)
Else
Print #1, " " + RColonne
- pour une collone donnée D par exemple
- lire le contenu de la cellule D2
- si elle n'est pas vide découper le contenu
- item 1, 2, ... n (on l'appellera "item")
- je cherche dans toto.xls la matrice A:1C650;2;0 (on l'appellera "res")
- le résultat est écrit comme ceci <attribute
name="res1">item1</attribute>
- passer au suivant <attribute name="res2">item2</attribute>
- etc.
- passer à la cellule D3
- lorsque c'est fini continuer pour la colonne E comme pour les colonnes
A, B, C


Lionel












Avatar
Daniel
Alors, il faut enlever les "Z" de l'adresse.
Daniel
"L" a écrit dans le message de news:

OK, je mets le lien en MP,
merci
Lionel

Ce n'est pas facile du tout pour apprécier quand tu commences à traiter
la colonne E. Le mieux serait que tu mettes ton classeur ou, au moins la
feuille active, sur www.cjoint.com en effaçant les données
confidentielles, s'il y en a.
Daniel
"L" a écrit dans le message de news:

vraiment merci Daniel, mais j'ai bien du mal à le mettre en place vu que
je n'y connais pas grand chose en VBA. je suis un poil perdu là ! en
même temps j'essaie de mettre cela dans une macro existante (ceci
explique peut-être cela !?)

En bref, voici mon code :

Sub createXmlFile()
Dim RBase As Range, RLigne As Range, RColonne As Range
Dim tagName As String

Set RBase = Range("BaseTableau") ' nommer la première colonne du
tableau "BaseTableau"

Open "C:Documents and SettingsLionelBureau2xml.xml" For Output As
1
Print #1, "<mon_document>"
' balayer les lignes
For Each RLigne In Range(RBase.Offset(1), RBase.End(xlDown))
'nom du node
Print #1, "<sujet>"
' valeur du node
Print #1, " " + Mid(RLigne, 2)
' ecriture des childnodes
For Each RColonne In Range(RLigne.Offset(0, 1),
RLigne.End(xlToRight))
' Si cellule vide, on ignore
If RColonne <> "" Then
' le nom de la balise est pris sur la premiere ligne
tagName = Intersect(RBase.EntireRow,
RColonne.EntireColumn)
Print #1, " <" + tagName + ">"
If IsNumeric(RColonne) Then
Print #1, " " + Str(RColonne)
Else
Print #1, " " + RColonne
End If
Print #1, " </" + tagName + ">"
End If
Next
Print #1, "</s>"
Next
Print #1, "</mon_document>"
Close 1
End Sub

cela fonctionne bien et me donne un truc du genre
<?xml version="1.0" encoding="ISO-8859-1"?>
<mon_document>
<s>
SB
<Pilote>
P
</Pilote>
<tour>
t
</tour>
<comptage>
compt
</comptage>
<trl>
ah ça a bougé c' est ça ?
</trl>
etc ...
</mon_document>
pour "s", "pilote, "tour", "comptage" et "trl" les étiquettes en A1, B1,
C1 et D1 de mes colonnes. Ce que j'aimerais faire maintenant c'est pour
la colonne D (et uniquement celle_là) qui donne le résultat
<trl>
ah ça a bougé c' est ça ?
</trl>

faire en plus un découpage de la chaîne, tel que :

ah - et aller chercher dans une matrice
ça - et aller chercher dans une matrice
a - et aller chercher dans une matrice
bougé - et aller chercher dans une matrice
c' - et aller chercher dans une matrice
ça - et aller chercher dans une matrice
? - et aller chercher dans une matrice

puis écrire à la fois l'item et le résultat de la recherche (vlookup())
pour un résultat attendu du genre :

<mot>
ah
<resultat>
interjection
</résultat>
</mot>
<mot>
ça
<resultat>
pronom_demonstratif
</résultat>
</mot>

ou bien :

<mot attribute="interjection">
ah
</mot>
<mot attribute="pronom_démonstratif">
ça
</mot>
etc ...

ensuite il continue à traiter les autres colonnes comme avant.
Je n'ai pas pu tester ta proposition puisque je n'arrive pas à
l'implémenter dans le bout de code que j'ai (c'est pourquoi il est plus
simple que je mette directement ce bout de code).

Lionel


Si j'ai compris, le traitement de la colonne D peut se voir comme suit
:

Workbooks.Open "c:temptoto.xls"
ThisWorkbook.Activate
For Each c In Range("D2", Range("D65536").End(xlUp))
For Each Item In Split(c)
res = Application.VLookup(Item, _
Workbooks("toto.xls").Sheets("Feuil1").Range("res"), 2, 0)
If Not Application.IsNA(res) Then
Enrgt = "<attribute name=""" & res & """" & _
Item & "</attribute>"
Print #1, Enrgt
End If
Next Item
Next c
Workbooks("toto.xls").Close
(non testé)

Daniel
"L" a écrit dans le message de news:

c'est le résultat de cette insertion je souhaiterais spliter faire
un vlookup (sur uine matrice se trouvant dans un autre fichier)sur
l'item et renvoyer le résultat à écrire dans mon fichier xml.
J'ai du mal à comprendre ce que tu appelles "résultat de cette

insertion".
Je me suis mal exprimé.

Print #1, " " + RColonne
m'écrit dans mon fichier ce qui se trouve dans la cellule pour
l'instant.
Pour le fichier externe, au lieu de :
Range("A1:C6500")
il faut coder :
Workbooks("toto.xls").sheets("Feuiln").Range("A1:C6500")
ok

Daniel
Si je m'explique mieux cela pourrait donner ça :

- pour l'ensemble des collones A, B, C de ma feuille
- conserver ça
For Each RColonne In Range(RLigne.Offset(0, 1),
RLigne.End(xlToRight))
' Si cellule vide, on ignore
If RColonne <> "" Then
' le nom de la balise est pris sur la premiere ligne
tagName = Intersect(RBase.EntireRow,
RColonne.EntireColumn)
Print #1, " <attribute name="; Chr(34) & "" + tagName
+ Chr(34) & " >"
If IsNumeric(RColonne) Then
Print #1, " " + Str(RColonne)
Else
Print #1, " " + RColonne
- pour une collone donnée D par exemple
- lire le contenu de la cellule D2
- si elle n'est pas vide découper le contenu
- item 1, 2, ... n (on l'appellera "item")
- je cherche dans toto.xls la matrice A:1C650;2;0 (on l'appellera
"res")
- le résultat est écrit comme ceci <attribute
name="res1">item1</attribute>
- passer au suivant <attribute name="res2">item2</attribute>
- etc.
- passer à la cellule D3
- lorsque c'est fini continuer pour la colonne E comme pour les
colonnes A, B, C


Lionel













Avatar
L
OK,

Alors, il faut enlever les "Z" de l'adresse.
Daniel
"L" a écrit dans le message de news:

OK, je mets le lien en MP,
merci
Lionel

Ce n'est pas facile du tout pour apprécier quand tu commences à traiter
la colonne E. Le mieux serait que tu mettes ton classeur ou, au moins la
feuille active, sur www.cjoint.com en effaçant les données
confidentielles, s'il y en a.
Daniel
"L" a écrit dans le message de news:

vraiment merci Daniel, mais j'ai bien du mal à le mettre en place vu que
je n'y connais pas grand chose en VBA. je suis un poil perdu là ! en
même temps j'essaie de mettre cela dans une macro existante (ceci
explique peut-être cela !?)

En bref, voici mon code :

Sub createXmlFile()
Dim RBase As Range, RLigne As Range, RColonne As Range
Dim tagName As String

Set RBase = Range("BaseTableau") ' nommer la première colonne du
tableau "BaseTableau"

Open "C:Documents and SettingsLionelBureau2xml.xml" For Output As
1
Print #1, "<mon_document>"
' balayer les lignes
For Each RLigne In Range(RBase.Offset(1), RBase.End(xlDown))
'nom du node
Print #1, "<sujet>"
' valeur du node
Print #1, " " + Mid(RLigne, 2)
' ecriture des childnodes
For Each RColonne In Range(RLigne.Offset(0, 1),
RLigne.End(xlToRight))
' Si cellule vide, on ignore
If RColonne <> "" Then
' le nom de la balise est pris sur la premiere ligne
tagName = Intersect(RBase.EntireRow,
RColonne.EntireColumn)
Print #1, " <" + tagName + ">"
If IsNumeric(RColonne) Then
Print #1, " " + Str(RColonne)
Else
Print #1, " " + RColonne
End If
Print #1, " </" + tagName + ">"
End If
Next
Print #1, "</s>"
Next
Print #1, "</mon_document>"
Close 1
End Sub

cela fonctionne bien et me donne un truc du genre
<?xml version="1.0" encoding="ISO-8859-1"?>
<mon_document>
<s>
SB
<Pilote>
P
</Pilote>
<tour>
t
</tour>
<comptage>
compt
</comptage>
<trl>
ah ça a bougé c' est ça ?
</trl>
etc ...
</mon_document>
pour "s", "pilote, "tour", "comptage" et "trl" les étiquettes en A1, B1,
C1 et D1 de mes colonnes. Ce que j'aimerais faire maintenant c'est pour
la colonne D (et uniquement celle_là) qui donne le résultat
<trl>
ah ça a bougé c' est ça ?
</trl>

faire en plus un découpage de la chaîne, tel que :

ah - et aller chercher dans une matrice
ça - et aller chercher dans une matrice
a - et aller chercher dans une matrice
bougé - et aller chercher dans une matrice
c' - et aller chercher dans une matrice
ça - et aller chercher dans une matrice
? - et aller chercher dans une matrice

puis écrire à la fois l'item et le résultat de la recherche (vlookup())
pour un résultat attendu du genre :

<mot>
ah
<resultat>
interjection
</résultat>
</mot>
<mot>
ça
<resultat>
pronom_demonstratif
</résultat>
</mot>

ou bien :

<mot attribute="interjection">
ah
</mot>
<mot attribute="pronom_démonstratif">
ça
</mot>
etc ...

ensuite il continue à traiter les autres colonnes comme avant.
Je n'ai pas pu tester ta proposition puisque je n'arrive pas à
l'implémenter dans le bout de code que j'ai (c'est pourquoi il est plus
simple que je mette directement ce bout de code).

Lionel


Si j'ai compris, le traitement de la colonne D peut se voir comme suit
:

Workbooks.Open "c:temptoto.xls"
ThisWorkbook.Activate
For Each c In Range("D2", Range("D65536").End(xlUp))
For Each Item In Split(c)
res = Application.VLookup(Item, _
Workbooks("toto.xls").Sheets("Feuil1").Range("res"), 2, 0)
If Not Application.IsNA(res) Then
Enrgt = "<attribute name=""" & res & """" & _
Item & "</attribute>"
Print #1, Enrgt
End If
Next Item
Next c
Workbooks("toto.xls").Close
(non testé)

Daniel
"L" a écrit dans le message de news:

c'est le résultat de cette insertion je souhaiterais spliter faire
un vlookup (sur uine matrice se trouvant dans un autre fichier)sur
l'item et renvoyer le résultat à écrire dans mon fichier xml.
J'ai du mal à comprendre ce que tu appelles "résultat de cette

insertion".
Je me suis mal exprimé.

Print #1, " " + RColonne
m'écrit dans mon fichier ce qui se trouve dans la cellule pour
l'instant.
Pour le fichier externe, au lieu de :
Range("A1:C6500")
il faut coder :
Workbooks("toto.xls").sheets("Feuiln").Range("A1:C6500")
ok

Daniel
Si je m'explique mieux cela pourrait donner ça :

- pour l'ensemble des collones A, B, C de ma feuille
- conserver ça
For Each RColonne In Range(RLigne.Offset(0, 1),
RLigne.End(xlToRight))
' Si cellule vide, on ignore
If RColonne <> "" Then
' le nom de la balise est pris sur la premiere ligne
tagName = Intersect(RBase.EntireRow,
RColonne.EntireColumn)
Print #1, " <attribute name="; Chr(34) & "" + tagName
+ Chr(34) & " >"
If IsNumeric(RColonne) Then
Print #1, " " + Str(RColonne)
Else
Print #1, " " + RColonne
- pour une collone donnée D par exemple
- lire le contenu de la cellule D2
- si elle n'est pas vide découper le contenu
- item 1, 2, ... n (on l'appellera "item")
- je cherche dans toto.xls la matrice A:1C650;2;0 (on l'appellera
"res")
- le résultat est écrit comme ceci <attribute
name="res1">item1</attribute>
- passer au suivant <attribute name="res2">item2</attribute>
- etc.
- passer à la cellule D3
- lorsque c'est fini continuer pour la colonne E comme pour les
colonnes A, B, C


Lionel