Aide macros conversion données
Bonjours tout le monde,
Je viens vous voir car j’ai besoin de votre aide pour réaliser deux macro de mise en forme de données. Je les ait réalisés avec l’enregistreur de macro, et je viens vous voir pour vous demander vos avis sur celles-ci (comment les améliorer …)
La première consiste à transformer ce qu’il y a dans la colonne I
<?xml version="1.0" encoding="ISO-8859-1"?><br/><xml_data><br/><var name="inv_civil">M.</var><br/><var name="dlv_civil">M.</var><br/><var name="inv_address1">3 rue alphonse de lamartine</var><br/><var name="dlv_address1">3 rue alphonse de lamartine</var><br/><var name="inv_lastname">DUPONT</var><br/><var name="dlv_lastname">DUPONT</var><br/><var name="inv_firstname">Jean</var><br/><var name="dlv_firstname">Jean</var><br/><var name="inv_town">Paris</var><br/><var name="dlv_town">Paris</var><br/><var name="inv_email">jean.dupont@neuf.fr</var><br/><var name="dlv_email">jean.dupont@neuf.fr</var><br/><var name="inv_codepost">101213</var><br/><var name="dlv_codepost">101213</var><br/><var name="inv_country">France </var><br/><var name="dlv_country">France </var><br/><var name="inv_tel">0678910111</var><br/><var name="dlv_tel">0678910111</var><br/></xml_data><br/>
En DUPONT Jean
Voilà la première macro que j’ai réalisée :
Sub Macro1()
Columns("I:I").Select
Selection.Cut
Range("W1").Select
ActiveSheet.Paste
Selection.TextToColumns Destination:=Range("W1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:=">"
Columns("W:AP").Select
Range("AP1").Activate
Selection.Delete Shift:=xlToLeft
Columns("Y:Y").Select
Selection.Delete Shift:=xlToLeft
Range("Z:AN,AO:DZ").Select
Range("AO1").Activate
Selection.ClearContents
Columns("W:W").Select
Selection.TextToColumns Destination:=Range("W1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:="<"
Columns("Y:Y").Select
Selection.TextToColumns Destination:=Range("Y1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:="<"
Range("AA2").Select
ActiveCell.FormulaR1C1 = "=RC[-4]&"" ""&RC[-2]"
Range("AA2").Select
Selection.AutoFill Destination:=Range("AA2:AA65536"), Type:=xlFillDefault
Columns("AA:AA").Select
Selection.Copy
Range("I1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Columns("W:AA").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
Range("A1").Select
End SubMon problème vient surtout de la lenteur de la macro (parce que le fichier fait 3000+ lignes, mais bon encore ca passe), et de la sélection des champs (car j'ai tout sélectionné à la main alors des lignes se rajouteront au fur et à mesure !)
(et elle marche pas pour tout, car des fois il y a des "adresses2"... mais c'est pas vraiment grave, y en a pas beaucoup donc je peux le faire à la main).
La seconde macro (je la trouve moins réussie) cherche à transformer le code suivant:
<?xml version="1.0" encoding="ISO-8859-1"?><br/><xml_data><br/><var name="prod0">01837|COR27#stylo |59.00|0.000|1</var><br/></xml_data><br/>
En : une colonne avec la référence (COR27) suivi de la colonne avec le prix (59). Il peut y avoir des comandes avec 1seul produit, ou des commandes avec 15 produits !
Sub Macro2()
'
Columns("H:H").Select
Selection.Cut Destination:=Columns("W:W")
Columns("W:W").Select
Selection.TextToColumns Destination:=Range("W1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:="|"
Columns("Y:Y").Select
Selection.Insert Shift:=xlToRight
Columns("AD:AD").Select
Selection.Insert Shift:=xlToRight
Columns("AH:AH").Select
Columns("AI:AI").Select
Selection.Insert Shift:=xlToRight
Columns("X:X").Select
Selection.TextToColumns Destination:=Range("X1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:="#"
Columns("AC:AC").Select
Selection.TextToColumns Destination:=Range("AC1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:="#"
Columns("AH:AH").Select
Selection.TextToColumns Destination:=Range("AH1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:="#"
Range("W:W,Y:Y,AA:AB,AD:AD,AF:AG,AI:AI,AK:AL").Select
Range("AK1").Activate
Selection.Delete Shift:=xlToLeft
Columns("V:AC").Select
Selection.Cut
Columns("H:H").Select
Selection.Insert Shift:=xlToRight
Range("A1").Select
End SubIci le problème vient surtout pour la sélection du bon nombre de colonne (pour la suppression des colonnes au début, ou pour faire le couper/coller à la fin), car dans certaines commandes, il y aura 1 produit ou dans d’autres 50 : donc je ne sais pas comment lui dire de, par exemple, supprimer la première colonne, puis une colonne sur 2. Pareil pour le copier coller dans le tableau, comment lui dire de sélectionner toutes les colonnes où il y a une cellule non-vide … ?
Voilà, j’espère que quelqu’un aura le courage de se pencher sur mon problème (*croise les doigts*).
Je vous joins un fichier-exemple avec la configuration de mon fichier-fichier.
(Si vous ne comprenez pas ce que je veux dire n’hésitez pas à poser la question)
Merci d’avance et à bientôt
Bonjour,
Ci-dessous un code à essayer en lieu et place de ton premier souci :
Sub Macro1()
'Macro wana07 - Modif Dan - 25/05/11
Dim dlg As Long
dlg = Range("I" & Rows.Count).End(xlUp).Row
Range("I1:I" & dlg).Cut Range("W1")
Range("W1:W" & dlg).TextToColumns Destination:=Range("W1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:=">"
Columns("W:AP").Delete Shift:=xlToLeft
Columns("Y:Y").Delete Shift:=xlToLeft
Columns("Z:DZ").Delete
Application.DisplayAlerts = False
Range("W1:W" & dlg).TextToColumns Destination:=Range("W1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:="<"
Range("Y1:Y" & dlg).TextToColumns Destination:=Range("Y1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:="<"
With Range("AA2")
.FormulaR1C1 = "=RC[-4]&"" ""&RC[-2]"
.AutoFill Destination:=Range("AA2:AA" & dlg), Type:=xlFillDefault
End With
Range("AA2:AA" & dlg).Copy
Range("I2").PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Columns("W:AA").Delete
Range("A1").Select
End SubSi ok, je ferai le deuxième sur base de celui là.
Amicalement
Salut Dan, merci pour ton aide.
J'ai essayé le code que tu m'as donné; et il marche trés bien!
Mais à ton avis, est ce que ce serait mieux de combiner ces deux macros en 1 ou il ne vaut mieux pas (pour éviter des bug?)
Re,
Voici le deuxième code :
Sub Macro2()
'Macro wana07 - Modif Dan - 26/05/11
Dim dlg As Long
Application.ScreenUpdating = False
dlg = Range("I" & Rows.Count).End(xlUp).Row
Columns("H:H").Cut Destination:=Columns("W:W")
Range("W1:W" & dlg).TextToColumns Destination:=Range("W1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar:="|"
Columns("Y:Y").Insert Shift:=xlToRight
Columns("AD:AD").Insert Shift:=xlToRight
Columns("AI:AI").Insert Shift:=xlToRight
Range("X1:X" & dlg).TextToColumns Destination:=Range("X1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar:="#"
Range("AC1:AC" & dlg).TextToColumns Destination:=Range("AC1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar:="#"
Range("AH1:AH" & dlg).TextToColumns Destination:=Range("AH1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar:="#"
Range("W:W,Y:Y,AA:AB,AD:AD,AF:AG,AI:AI,AK:AL").Delete Shift:=xlToLeft
Range("W2:AC" & dlg).Cut
Range("H2").Insert Shift:=xlToRight
Range("A1").Select
End SubAfin que les deux codes s'enchainent l'un à la suite de l'autre mets cette instruction à la fin du code 1 et ce, juste avant le END SUB. Cela donnerait ceci
Sub macro1()
'.....le code de la macro 1
Call Macro2
End SubUne autre chose que tu peux ajouter au début de la macro 1 (juste en desous de Dim....) --> Application.ScreenUpdating = False
Si ok, n'oublie pas de cliquer sur le V vert juste à coté du bouton Editer pour cloturer le fil.
Amicalement
Un grand merci à toi, ces macros fonctionnent super bien