Simplification du code "convertir" (vba)

8 réponses
Avatar
j-pascal
Bonjour,

Je souhaite convertir une colonne de dates du format (possiblement !)
américain, au format "européen".

Si je sélectionne la dite colonne, j'obtiens, par l'enregistrement
automatique, ceci :

'-------
Sub Macro4()

Columns("C:C").Select

Selection.TextToColumns Destination:=Range("C1"), _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
Tab:=True, _
FieldInfo:=Array(1, 4), _
TrailingMinusNumbers:=True
End Sub
'-------

J'ai déjà supprimé quelques lignes du code, mais, il y en a peut-être
encore d'autres inutiles pour mes besoins.

Comment puis-je adapter ce code, sachant que je veux que le format
s'applique strictement à ma colonne (je veux dire qu'il affecte les
dates là où elles sont ; sans transposition) ?

A priori, je pense qu'il ne faut garder que :

'-------
Sub Macro4()

Columns("C:C").TextToColumns Destination:=Range("C1"), _
FieldInfo:=Array(1, 4)

End Sub
'-------

Si oui, je ne sais que faire du "Destination: ..."


Merci pour votre aide,

JP

8 réponses

Avatar
isabelle
bonjour Jp,

Set plg = Range("C1:C" & Range("C65536").End(xlUp).Row)
plg.TextToColumns Destination:=Range("C1"), FieldInfo:=Array(1, 4)

isabelle

j-pascal a écrit :
Bonjour,

Je souhaite convertir une colonne de dates du format (possiblement !)
américain, au format "européen".

Si je sélectionne la dite colonne, j'obtiens, par l'enregistrement
automatique, ceci :

'-------
Sub Macro4()

Columns("C:C").Select

Selection.TextToColumns Destination:=Range("C1"), _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
Tab:=True, _
FieldInfo:=Array(1, 4), _
TrailingMinusNumbers:=True
End Sub
'-------

J'ai déjà supprimé quelques lignes du code, mais, il y en a peut-être
encore d'autres inutiles pour mes besoins.

Comment puis-je adapter ce code, sachant que je veux que le format
s'applique strictement à ma colonne (je veux dire qu'il affecte les
dates là où elles sont ; sans transposition) ?

A priori, je pense qu'il ne faut garder que :

'-------
Sub Macro4()

Columns("C:C").TextToColumns Destination:=Range("C1"), _
FieldInfo:=Array(1, 4)

End Sub
'-------

Si oui, je ne sais que faire du "Destination: ..."


Merci pour votre aide,

JP




Avatar
j-pascal
Bonjour Isabelle,

Je deviens fou !!

(Merci pour ton code, ça fonctionne dans l'absolu, mais pas pour mon
cas, desespéré ......)

Pb :

J'ai un classeur n°1 avec une colonne G contenant des dates (les
bonnes)

Via VBA, j'importe ce tableau dans une feuille "import". Les dates sont
modifiées !!!!

Si dans le classeur n° 1 j'ai 18/02/09, la date reste la même dans la
feuille import (j'ai compris qu'il n'y avait pas 18 mois dans l'année
;-) )

Si j'ai 04/03/09, ça devient 03/04/09 !!!!!!

Le pb, c'est que le résultat est inconstant (cf. ex. que je viens de
donner).

Dans l'import, j'ai essayé :

- Ton présent code
- de mettre au format standard (pour avoir un numéro de série)
Dans ce cas là, la date du 18/02/09 reste la même et le reste se met en
n° de série !
- etc, etc.

A ce stade, j'imagine que je peux ajouter une colonne et faire un test
conditionnel suivant que j'ai une date ou un numéro de série. Ca fait
usine à gaz !!

Sinon, penses-tu que je peux exécuter une formule matricielle (en vba)
qui me mettrait les numéros de série au format "européen" et laisserait
les "bonnes" dates en l'état ?

Merci pour ton aide,

JP

PS : je ne souhaite pas ajouter une colonne supplémentaire, sauf si
vraiment indispensable !
bonjour Jp,

Set plg = Range("C1:C" & Range("C65536").End(xlUp).Row)
plg.TextToColumns Destination:=Range("C1"), FieldInfo:=Array(1, 4)

isabelle

j-pascal a écrit :
Bonjour,

Je souhaite convertir une colonne de dates du format (possiblement !)
américain, au format "européen".

Si je sélectionne la dite colonne, j'obtiens, par l'enregistrement
automatique, ceci :

'-------
Sub Macro4()

Columns("C:C").Select

Selection.TextToColumns Destination:=Range("C1"), _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
Tab:=True, _
FieldInfo:=Array(1, 4), _
TrailingMinusNumbers:=True
End Sub
'-------

J'ai déjà supprimé quelques lignes du code, mais, il y en a peut-être
encore d'autres inutiles pour mes besoins.

Comment puis-je adapter ce code, sachant que je veux que le format
s'applique strictement à ma colonne (je veux dire qu'il affecte les dates
là où elles sont ; sans transposition) ?

A priori, je pense qu'il ne faut garder que :

'-------
Sub Macro4()

Columns("C:C").TextToColumns Destination:=Range("C1"), _
FieldInfo:=Array(1, 4)

End Sub
'-------

Si oui, je ne sais que faire du "Destination: ..."


Merci pour votre aide,

JP




Avatar
Modeste
Bonsour® j-pascal avec ferveur ;o))) vous nous disiez :

Je deviens fou !!
J'ai un classeur n°1 avec une colonne G contenant des dates (les
bonnes)



cela est d'abord à vérifier !!!!
est-ce que les dates sont convertibles en N° de série ????

Columns("C:C").NumberFormat = "0"

si tel est le cas ;o)))
l'import ne devrait rien y changer !!!
Avatar
j-pascal
Bonjour Modeste,

Dans le classeur n°1 les dates sont toutes convertibles en n° de série.
Elles sont dans le format que je souhaite :
03/04/09 pour 3 avr.
18/02/08 pour 18 fév.
etc.

Si je les récupère via macro dans une autre feuille, j'ai

04/03/09 pour le 3 avr.
18/02/08 pour le 18 fév.

Si je mets au format "normal" cette dernière feuille, j'ai

18/02/08 (pour 18 fév)
39876 (pour 3 avr)

etc.

Donc je suis en train de penser (à un truc nul) du genre :

=SI(NBCAR(A2)=5;TEXTE(A2;"mm/jj/aa");TEXTE(A2;"jj/mm/aa"))

D'apparence, ça le fait, sauf qu'il faudrait encore faire qqch pour que
ça soit une date car c'est encore du texte à ce stade.

Et si ça marche, il faudrai ensuite un petit code qui balaye toute les
cellules de la colonne et le convertisse, le cas échéant, avec cette
formule ...

JP


Bonsour® j-pascal avec ferveur ;o))) vous nous disiez :

Je deviens fou !!
J'ai un classeur n°1 avec une colonne G contenant des dates (les
bonnes)



cela est d'abord à vérifier !!!!
est-ce que les dates sont convertibles en N° de série ????

Columns("C:C").NumberFormat = "0"

si tel est le cas ;o)))
l'import ne devrait rien y changer !!!


Avatar
isabelle
bonjour Jp,

je pense comme geedee, il faudrait transformer les dates en format
standard avant l'importation et les remettre au format voulu par la suite.

isabelle

j-pascal a écrit :
Bonjour Isabelle,

Je deviens fou !!

(Merci pour ton code, ça fonctionne dans l'absolu, mais pas pour mon
cas, desespéré ......)

Pb :

J'ai un classeur n°1 avec une colonne G contenant des dates (les bonnes)

Via VBA, j'importe ce tableau dans une feuille "import". Les dates
sont modifiées !!!!

Si dans le classeur n° 1 j'ai 18/02/09, la date reste la même dans la
feuille import (j'ai compris qu'il n'y avait pas 18 mois dans l'année
;-) )

Si j'ai 04/03/09, ça devient 03/04/09 !!!!!!

Le pb, c'est que le résultat est inconstant (cf. ex. que je viens de
donner).

Dans l'import, j'ai essayé :

- Ton présent code
- de mettre au format standard (pour avoir un numéro de série)
Dans ce cas là, la date du 18/02/09 reste la même et le reste se met
en n° de série !
- etc, etc.

A ce stade, j'imagine que je peux ajouter une colonne et faire un test
conditionnel suivant que j'ai une date ou un numéro de série. Ca fait
usine à gaz !!

Sinon, penses-tu que je peux exécuter une formule matricielle (en vba)
qui me mettrait les numéros de série au format "européen" et
laisserait les "bonnes" dates en l'état ?

Merci pour ton aide,

JP

PS : je ne souhaite pas ajouter une colonne supplémentaire, sauf si
vraiment indispensable !
bonjour Jp,

Set plg = Range("C1:C" & Range("C65536").End(xlUp).Row)
plg.TextToColumns Destination:=Range("C1"), FieldInfo:=Array(1, 4)

isabelle

j-pascal a écrit :
Bonjour,

Je souhaite convertir une colonne de dates du format (possiblement
!) américain, au format "européen".

Si je sélectionne la dite colonne, j'obtiens, par l'enregistrement
automatique, ceci :

'-------
Sub Macro4()

Columns("C:C").Select

Selection.TextToColumns Destination:=Range("C1"), _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
Tab:=True, _
FieldInfo:=Array(1, 4), _
TrailingMinusNumbers:=True
End Sub
'-------

J'ai déjà supprimé quelques lignes du code, mais, il y en a
peut-être encore d'autres inutiles pour mes besoins.

Comment puis-je adapter ce code, sachant que je veux que le format
s'applique strictement à ma colonne (je veux dire qu'il affecte les
dates là où elles sont ; sans transposition) ?

A priori, je pense qu'il ne faut garder que :

'-------
Sub Macro4()

Columns("C:C").TextToColumns Destination:=Range("C1"), _
FieldInfo:=Array(1, 4)

End Sub
'-------

Si oui, je ne sais que faire du "Destination: ..."


Merci pour votre aide,

JP








Avatar
j-pascal
Bonjour Isabelle,

Effectivement, ça fonctionne. Il faut que je mette le fichier d'origine
(là où sont les données à exporter) au format standard !

With ActiveSheet.Cells '(le fichier d'extraction ouvert)
.NumberFormat = "General" 'modif 30/04
.Copy 'copie toutes les cellules de la feuille
End With

Et au fur et à mesure que j'étais en train de te répondre, j'ai modifié
le code comme ci-dessus pour intégrer le format standard dans la macro
afin de ne pas avoir à faire des bidouilles que l'utilisateur lambda
pourrait oublier ...

Un ENORME MERCI +++

jp


bonjour Jp,

je pense comme geedee, il faudrait transformer les dates en format standard
avant l'importation et les remettre au format voulu par la suite.

isabelle

j-pascal a écrit :
Bonjour Isabelle,

Je deviens fou !!

(Merci pour ton code, ça fonctionne dans l'absolu, mais pas pour mon cas,
desespéré ......)

Pb :

J'ai un classeur n°1 avec une colonne G contenant des dates (les bonnes)

Via VBA, j'importe ce tableau dans une feuille "import". Les dates sont
modifiées !!!!

Si dans le classeur n° 1 j'ai 18/02/09, la date reste la même dans la
feuille import (j'ai compris qu'il n'y avait pas 18 mois dans l'année ;-) )

Si j'ai 04/03/09, ça devient 03/04/09 !!!!!!

Le pb, c'est que le résultat est inconstant (cf. ex. que je viens de
donner).

Dans l'import, j'ai essayé :

- Ton présent code
- de mettre au format standard (pour avoir un numéro de série)
Dans ce cas là, la date du 18/02/09 reste la même et le reste se met en n°
de série !
- etc, etc.

A ce stade, j'imagine que je peux ajouter une colonne et faire un test
conditionnel suivant que j'ai une date ou un numéro de série. Ca fait usine
à gaz !!

Sinon, penses-tu que je peux exécuter une formule matricielle (en vba) qui
me mettrait les numéros de série au format "européen" et laisserait les
"bonnes" dates en l'état ?

Merci pour ton aide,

JP

PS : je ne souhaite pas ajouter une colonne supplémentaire, sauf si
vraiment indispensable !
bonjour Jp,

Set plg = Range("C1:C" & Range("C65536").End(xlUp).Row)
plg.TextToColumns Destination:=Range("C1"), FieldInfo:=Array(1, 4)

isabelle

j-pascal a écrit :
Bonjour,

Je souhaite convertir une colonne de dates du format (possiblement !)
américain, au format "européen".

Si je sélectionne la dite colonne, j'obtiens, par l'enregistrement
automatique, ceci :

'-------
Sub Macro4()

Columns("C:C").Select

Selection.TextToColumns Destination:=Range("C1"), _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
Tab:=True, _
FieldInfo:=Array(1, 4), _
TrailingMinusNumbers:=True
End Sub
'-------

J'ai déjà supprimé quelques lignes du code, mais, il y en a peut-être
encore d'autres inutiles pour mes besoins.

Comment puis-je adapter ce code, sachant que je veux que le format
s'applique strictement à ma colonne (je veux dire qu'il affecte les dates
là où elles sont ; sans transposition) ?

A priori, je pense qu'il ne faut garder que :

'-------
Sub Macro4()

Columns("C:C").TextToColumns Destination:=Range("C1"), _
FieldInfo:=Array(1, 4)

End Sub
'-------

Si oui, je ne sais que faire du "Destination: ..."


Merci pour votre aide,

JP








Avatar
isabelle
bonjour Jp,

3 avril, 2009 = 39906
4 mars, 2009 = 39876

dans l'exemple que tu donnes, 18/02/08 est considérer comme étant du
teste puisqu'il n'y a pas de 18 ème mois
03/04/09 = selon sont numéro serie (39876) à 4 mars 2009

dans le fichier original, ajoute une colonne et mets la formule ¡ et
mets cette nouvelle colonne au format jj-mmmm-aaaa,
est ce bien les dates correspondante ?

si d'après ce que tu voie, les mois et jour sont bien inversés tu peut
les remettre dans le bon ordre avec la formule suivante :

ÚTE("20"&STXT($A$1;7;2);STXT($A$1;4;2);STXT($A$1;1;2))

isabelle

j-pascal a écrit :
Bonjour Modeste,

Dans le classeur n°1 les dates sont toutes convertibles en n° de série.
Elles sont dans le format que je souhaite :
03/04/09 pour 3 avr.
18/02/08 pour 18 fév.
etc.

Si je les récupère via macro dans une autre feuille, j'ai

04/03/09 pour le 3 avr.
18/02/08 pour le 18 fév.

Si je mets au format "normal" cette dernière feuille, j'ai

18/02/08 (pour 18 fév)
39876 (pour 3 avr)

etc.

Donc je suis en train de penser (à un truc nul) du genre :

=SI(NBCAR(A2)=5;TEXTE(A2;"mm/jj/aa");TEXTE(A2;"jj/mm/aa"))

D'apparence, ça le fait, sauf qu'il faudrait encore faire qqch pour
que ça soit une date car c'est encore du texte à ce stade.

Et si ça marche, il faudrai ensuite un petit code qui balaye toute les
cellules de la colonne et le convertisse, le cas échéant, avec cette
formule ...

JP


Bonsour® j-pascal avec ferveur ;o))) vous nous disiez :
Je deviens fou !!
J'ai un classeur n°1 avec une colonne G contenant des dates (les
bonnes)



cela est d'abord à vérifier !!!!
est-ce que les dates sont convertibles en N° de série ????

Columns("C:C").NumberFormat = "0"

si tel est le cas ;o)))
l'import ne devrait rien y changer !!!






Avatar
j-pascal
Bonsoir Isabelle,

bonjour Jp,

3 avril, 2009 = 39906
4 mars, 2009 = 39876

dans l'exemple que tu donnes, 18/02/08 est considérer comme étant du teste
puisqu'il n'y a pas de 18 ème mois
03/04/09 = selon sont numéro serie (39876) à 4 mars 2009

dans le fichier original, ajoute une colonne et mets la formule ¡ et mets
cette nouvelle colonne au format jj-mmmm-aaaa,
est ce bien les dates correspondante ?



oui

C'est lorsque les dates sont exportées que le format s'inverse si les
deux premiers chiffres sont supérieurs à 12 ...

si d'après ce que tu voie, les mois et jour sont bien inversés tu peut les
remettre dans le bon ordre avec la formule suivante :



Si tout avait été inversé, ça aurait été plus simple ;-)

Je te remercie pour la formule suivante, qui me servira certainement un
jour. Dans le cas présent, ta dernière suggestion est tellement
efficace que je vais m'en tenir là.

Encore merci.

JP

ÚTE("20"&STXT($A$1;7;2);STXT($A$1;4;2);STXT($A$1;1;2))

isabelle

j-pascal a écrit :
Bonjour Modeste,

Dans le classeur n°1 les dates sont toutes convertibles en n° de série.
Elles sont dans le format que je souhaite :
03/04/09 pour 3 avr.
18/02/08 pour 18 fév.
etc.

Si je les récupère via macro dans une autre feuille, j'ai

04/03/09 pour le 3 avr.
18/02/08 pour le 18 fév.

Si je mets au format "normal" cette dernière feuille, j'ai

18/02/08 (pour 18 fév)
39876 (pour 3 avr)

etc.

Donc je suis en train de penser (à un truc nul) du genre :

=SI(NBCAR(A2)=5;TEXTE(A2;"mm/jj/aa");TEXTE(A2;"jj/mm/aa"))

D'apparence, ça le fait, sauf qu'il faudrait encore faire qqch pour que ça
soit une date car c'est encore du texte à ce stade.

Et si ça marche, il faudrai ensuite un petit code qui balaye toute les
cellules de la colonne et le convertisse, le cas échéant, avec cette
formule ...

JP


Bonsour® j-pascal avec ferveur ;o))) vous nous disiez :
Je deviens fou !!
J'ai un classeur n°1 avec une colonne G contenant des dates (les
bonnes)



cela est d'abord à vérifier !!!!
est-ce que les dates sont convertibles en N° de série ????

Columns("C:C").NumberFormat = "0"

si tel est le cas ;o)))
l'import ne devrait rien y changer !!!