OVH Cloud OVH Cloud

Repost tri dates antérieures à 1900 ?

19 réponses
Avatar
ibsen
Bonjour,
J'ai eu un problème et j'ai perdu tous les questions et les réponses sur ce
Forum jusqu'au 18 inclus. Mais le pire impossible de les télécharger à
nouveau.Même en supprimant l'abonnement et en s'abonnant de nouveau !!
Donc je me permets de reposer ma question au cas où certains auraient eu la
bonne idée de se "pencher" sur mon problème de généalogie.
Excel 2003. Col A date de naissance en chiffres, Col B mois de naissance en
lettres, Col C année de naissance en chiffres.
Quelle est la formule magique qui permet d'arriver à un tri ? Je sais le
faire avec tout en chiffres dans une seule colonne, mais là je sèche.
Si vous avez des idées. Merci pour votre aide

--
ibsen
anti-spam enlever99
remplacer @paris.com par @club-internet.fr

9 réponses

1 2
Avatar
ibsen
Y-a d'la magie dans l'air !
Quand j'ai ouvert ton exemple : dito. rien pour avant 1900.#VALEUR J'ai
RE-vérifié, et à nouveau j'avais "" au lieu de " ". Rectif et tout est OK.
Merci mille fois.
Ibsen

"AV" a écrit dans le message de
news:%239LsqTx$
Si ça marche très bien mais tu as eu un problème de copier/coller de la
formule

: la partie TROUVE(" "; etc... a du se tranformer en TROUVE("";A2 (il
manque

l'espace !)
Exemple là :
http://cjoint.com/data/busxggOYLi_dates1900.xls

AV




Avatar
ROCHE Pierre
Bonsoir,
Pour résoudre ton problème de tri de dates < 1900, il te faut dans une
colonne de travail, transformer tes dates au format texte (c'est la seule
solution) avec ABSOLUMENT l'ordre suivant dans tes cellules (ANNEE puis MOIS
puis JOUR) toujours sur le même nombre de caractères.
Le tri sur du texte respecte les tables de codes ASCII (les 10 chiffres de
la base 10 sont déjà triés ) entre autres et donc ton tri se fait tout à
fait normalement.
Pour ton exemple,
- les jours seront extraits par la gauche sur 2 caractères
- les années par la droite sur 4 caractères
- les mois devront être extraits après repérage du premier blanc (à priori
toujours en position 3), du second blanc (variable => recherche faite à
partir du quatrième caractère), de la récupération du texte contenu entres
les 2 blancs puis par la transformation de ces lettres de mois en nombre sur
2 caractères via une table correspondance.
- le tri se fera sur cette colonne nouvellement créée

Cela donne sur ton exemple :

Colonne A Colonne B
15 mai 2005 =DROITE(A1;4)&RECHERCHEV(STXT(A1;4;TROUVE("
";A1;4)-4);$E$1:$F$12;2;FAUX)&GAUCHE(A1;2)
12 avril 1645 =DROITE(A2;4)&RECHERCHEV(STXT(A2;4;TROUVE("
";A2;4)-4);$E$1:$F$12;2;FAUX)&GAUCHE(A2;2)
25 décembre 1822 =DROITE(A3;4)&RECHERCHEV(STXT(A3;4;TROUVE("
";A3;4)-4);$E$1:$F$12;2;FAUX)&GAUCHE(A3;2)
14 janvier 2004 =DROITE(A4;4)&RECHERCHEV(STXT(A4;4;TROUVE("
";A4;4)-4);$E$1:$F$12;2;FAUX)&GAUCHE(A4;2)
15 mai 1901 =DROITE(A5;4)&RECHERCHEV(STXT(A5;4;TROUVE("
";A5;4)-4);$E$1:$F$12;2;FAUX)&GAUCHE(A5;2)
15 mai 1900 =DROITE(A6;4)&RECHERCHEV(STXT(A6;4;TROUVE("
";A6;4)-4);$E$1:$F$12;2;FAUX)&GAUCHE(A6;2)
15 mai 1899 =DROITE(A7;4)&RECHERCHEV(STXT(A7;4;TROUVE("
";A7;4)-4);$E$1:$F$12;2;FAUX)&GAUCHE(A7;2)

Table de correspondance en colonnes E et F (toutes 2 au format texte) :
Colonne E Colonne F
janvier 01
février 02
mars 03
avril 04
mai 05
juin 06
juillet 07
août 08
septembre 09
octobre 10
novembre 11
décembre 12

Tu sélectionnes ton groupe à trier et tu réalises le tri sur la colonne B
dans le sens que tu veux.

Garanti testé : OK

Cela répond-il à ton problème ?

Modifications possibles :
Si tes jours ne sont pas toujours sur 2 caractères : il te faudra donc
rechercher le premier blanc à partir de la position 1 de la colonne A puis
rechercher le second blanc à partir de la position du premier blanc + 1
Si tes mois ne sont pas tous en minuscule : il te faudra après extraction du
mois en toute lettre les forcer en majuscule ou minuscule au choix et avoir
alimenté ta table de correspondance en fonction de ton choix ou même des 2 .
L'idéal est de mettre dans ta table de correspondance tous les cas de mois
avec des accents soit en majuscule, soit en minuscule pour ne pas trop la
charger. Tu devrais avoir une table de 15 lignes maximum

Cordialement

"ibsen" a écrit dans le message de news:
%23Kf1VKx$
Bonjour,
La longueur de la formule fait peur, mais elle fonctionne. Seul hiatus,
elle
est récalcitrante pour les dates antérieures à 1900, voici un petit
exemple
:
15 mai 2005 20050515
12 avril 1645 #VALEUR!
25 décembre 1822 #VALEUR!
14 janvier 2004 20040114
15 mai 1901 19010515
15 mai 1900 19000515
15 mai 1899 #VALEUR!

Si tu vois une solution. Merci par avance. Ibsen

"AV" a écrit dans le message de
news:eHdSFek$
Si tes données ont toujours le même format (espace entre jour et mois et
entre

mois et année) et sous réserve de respecter l'orthographe des mois en
littéral

(ex : août et non aout)
Avec tes dates en A2:Ax (étiquettes en A1 et B1)
En B2 et recopie --> Bx

=SI(ESTNUM(A2);ANNEE(A2)&TEXTE(MOIS(A2);"00")&TEXTE(JOUR(A2);"00");TEXTE(STX

T(A2
;TROUVE(" ";A2;4)+1;4);"0000")&TEXTE(MOIS("1/"&STXT(A2;TROUVE("
";A2)+1;TROUVE("

";A2;4)+1-TROUVE(" ";A2)+1-2)&"/1");"00")&TEXTE(GAUCHE(A2;TROUVE("
";A2)-1);"00"))
Tu tries ensuite croissant ou décroissant sur la colonne B et tu
supprimes(ou

masques la colonne B)

AV







Avatar
GD
ROCHE Pierre a affirmé :
il te faut dans une colonne de travail, transformer tes dates au format
texte

c'est la seule solution
???????????


;o))) Pfffff.....
montre en main : 30 secondes !!!!
via l'enregistreur de macro
moins de temps qu'il ne faut pour l'écrire ;o)))

Sub Macro1()
' Macro enregistrée le 20/01/2005 par un autre
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited,
_
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True,
_
Semicolon:úlse, Comma:úlse, Space:=True, Other:=True,
OtherChar:= _
"=", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1),
Array(4, 1), Array(5, 1), _
Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1),
Array(11, 1), Array(12, 1) _
), TrailingMinusNumbers:=True
Range("D1").Select
ActiveCell.FormulaR1C1 = "=MONTH(""01 ""&RC[-2])"
Selection.AutoFill Destination:=Range("D1:D100")
Range("D1:D100").Select
Range("D1").Select
Range("A1:L100").Sort Key1:=Range("C1"), Order1:=xlAscending,
Key2:=Range( _
"D1"), Order2:=xlAscending, Key3:=Range("A1"), Order3:=xlAscending,
_
Header:=xlGuess, OrderCustom:=1, MatchCase:úlse, Orientation:= _
xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal,
_
DataOption3:=xlSortNormal
End Sub

@+
;o)))
"AV" a écrit dans le message de
news:eHdSFek$
Si tes données ont toujours le même format (espace entre jour et
mois et entre mois et année) et sous réserve de respecter
l'orthographe des mois en littéral (ex : août et non aout)
Avec tes dates en A2:Ax (étiquettes en A1 et B1)
En B2 et recopie --> Bx



=SI(ESTNUM(A2);ANNEE(A2)&TEXTE(MOIS(A2);"00")&TEXTE(JOUR(A2);"00");TEXTE(STX


T(A2
;TROUVE(" ";A2;4)+1;4);"0000")&TEXTE(MOIS("1/"&STXT(A2;TROUVE("
";A2)+1;TROUVE(" ";A2;4)+1-TROUVE("
";A2)+1-2)&"/1");"00")&TEXTE(GAUCHE(A2;TROUVE(" ";A2)-1);"00"))
Tu tries ensuite croissant ou décroissant sur la colonne B et tu
supprimes(ou masques la colonne B)

AV






Avatar
ROCHE Pierre
Certes mais avec macro
Ici c'est sans ;o)))


"GD" a écrit dans le message de news:
uwcPNjz$
ROCHE Pierre a affirmé :
il te faut dans une colonne de travail, transformer tes dates au format
texte

c'est la seule solution
???????????


;o))) Pfffff.....
montre en main : 30 secondes !!!!
via l'enregistreur de macro
moins de temps qu'il ne faut pour l'écrire ;o)))

Sub Macro1()
' Macro enregistrée le 20/01/2005 par un autre
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"),
DataType:=xlDelimited,
_
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True,
Tab:=True,
_
Semicolon:úlse, Comma:úlse, Space:=True, Other:=True,
OtherChar:= _
"=", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1),
Array(4, 1), Array(5, 1), _
Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1),
Array(11, 1), Array(12, 1) _
), TrailingMinusNumbers:=True
Range("D1").Select
ActiveCell.FormulaR1C1 = "=MONTH(""01 ""&RC[-2])"
Selection.AutoFill Destination:=Range("D1:D100")
Range("D1:D100").Select
Range("D1").Select
Range("A1:L100").Sort Key1:=Range("C1"), Order1:=xlAscending,
Key2:=Range( _
"D1"), Order2:=xlAscending, Key3:=Range("A1"), Order3:=xlAscending,
_
Header:=xlGuess, OrderCustom:=1, MatchCase:úlse, Orientation:= _
xlTopToBottom, DataOption1:=xlSortNormal,
DataOption2:=xlSortNormal,
_
DataOption3:=xlSortNormal
End Sub

@+
;o)))
"AV" a écrit dans le message de
news:eHdSFek$
Si tes données ont toujours le même format (espace entre jour et
mois et entre mois et année) et sous réserve de respecter
l'orthographe des mois en littéral (ex : août et non aout)
Avec tes dates en A2:Ax (étiquettes en A1 et B1)
En B2 et recopie --> Bx



=SI(ESTNUM(A2);ANNEE(A2)&TEXTE(MOIS(A2);"00")&TEXTE(JOUR(A2);"00");TEXTE(STX


T(A2
;TROUVE(" ";A2;4)+1;4);"0000")&TEXTE(MOIS("1/"&STXT(A2;TROUVE("
";A2)+1;TROUVE(" ";A2;4)+1-TROUVE("
";A2)+1-2)&"/1");"00")&TEXTE(GAUCHE(A2;TROUVE(" ";A2)-1);"00"))
Tu tries ensuite croissant ou décroissant sur la colonne B et tu
supprimes(ou masques la colonne B)

AV










Avatar
AV
T'as essayé la solution que j'ai proposée ?

Ta solution a qques difficultés avec les exemples suivants :
6 janvier 2005 - 21 janvier 800

AV
Avatar
Modeste
Bonsour®
l'enregistreur de macro ne fait que mémoriser la
succession des opérations effectuées à la mimine !!!!
et ne fait que détailler la solution (simple) proposée
par moi-même dans ce fil le 19 !!!!
solution qui de toute évidence à échappée à votre
lecture !
;o)))

-----Message d'origine-----
Certes mais avec macro
Ici c'est sans ;o)))


"GD" a écrit dans le message de
news:

uwcPNjz$
ROCHE Pierre a affirmé :
il te faut dans une colonne de travail, transformer
tes dates au format



texte
c'est la seule solution
???????????


;o))) Pfffff.....
montre en main : 30 secondes !!!!
via l'enregistreur de macro
moins de temps qu'il ne faut pour l'écrire ;o)))

Sub Macro1()
' Macro enregistrée le 20/01/2005 par un autre
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"),
DataType:=xlDelimited,
_
TextQualifier:=xlDoubleQuote,
ConsecutiveDelimiter:=True,


Tab:=True,
_
Semicolon:úlse, Comma:úlse, Space:=True,
Other:=True,


OtherChar:= _
"=", FieldInfo:=Array(Array(1, 1), Array(2, 1),
Array(3, 1),


Array(4, 1), Array(5, 1), _
Array(6, 1), Array(7, 1), Array(8, 1), Array(9,
1), Array(10, 1),


Array(11, 1), Array(12, 1) _
), TrailingMinusNumbers:=True
Range("D1").Select
ActiveCell.FormulaR1C1 = "=MONTH(""01 ""&RC[-2])"
Selection.AutoFill Destination:=Range("D1:D100")
Range("D1:D100").Select
Range("D1").Select
Range("A1:L100").Sort Key1:=Range("C1"),
Order1:=xlAscending,


Key2:=Range( _
"D1"), Order2:=xlAscending, Key3:=Range("A1"),
Order3:=xlAscending,


_
Header:=xlGuess, OrderCustom:=1,
MatchCase:úlse, Orientation:= _


xlTopToBottom, DataOption1:=xlSortNormal,
DataOption2:=xlSortNormal,
_
DataOption3:=xlSortNormal
End Sub

@+
;o)))
"AV" a écrit dans le
message de




news:eHdSFek$
Si tes données ont toujours le même format (espace
entre jour et





mois et entre mois et année) et sous réserve de
respecter





l'orthographe des mois en littéral (ex : août et
non aout)





Avec tes dates en A2:Ax (étiquettes en A1 et B1)
En B2 et recopie --> Bx



=SI(ESTNUM(A2);ANNEE(A2)&TEXTE(MOIS(A2);"00")&TEXTE


(JOUR(A2);"00");TEXTE(STX


T(A2
;TROUVE(" ";A2;4)+1;4);"0000")&TEXTE(MOIS("1/"&STXT
(A2;TROUVE("





";A2)+1;TROUVE(" ";A2;4)+1-TROUVE("
";A2)+1-2)&"/1");"00")&TEXTE(GAUCHE(A2;TROUVE
(" ";A2)-1);"00"))





Tu tries ensuite croissant ou décroissant sur la
colonne B et tu





supprimes(ou masques la colonne B)

AV








.







Avatar
AV
Y-a d'la magie dans l'air !
Quand j'ai ouvert ton exemple : dito. rien pour avant 1900.#VALEUR J'ai
RE-vérifié, et à nouveau j'avais "" au lieu de " ". Rectif et tout est OK.


Ben oui, je vois pas à quoi c'est du .....
L'important est que tu aies compris d'où venait la possible erreur de résultat
Autre tentative de transmission là :
http://cjoint.com/?bvjYe4Phmh

AV

Avatar
AV
Si, dans ce même fil, tu lis "l'éclaircissement" donné par Ibsen le 19/01/05
17:23, il ne t'échappera pas que les données d'origine ne sont pas saucissonnées
comme tu les utilises dans ta réponse du 19/01/05 22:21
Elles se présentent sous la forme : 15 mai 1645 - 27 septembre 2003,
ce qui suppose donc qques formules supplémentaires ou un "données/convertir"
Alors que avec une seule formule....
;-)
C'était pour le smilblick !
AV
Avatar
Modeste
Oui AV ;o)))
c'est justement le schmilblick qui m'attire dans ce forum,
et je suis toujours impatient de lire les solutions, avec
une attirance particulière pour celle marquée AV ;o)))

ta vision formuliste est toujours pour moi une
alternative digne d'interet, pour ne pas dire didactive
(si tu nous permettait d'en découvrir toute la subtile
finesse parfois à l'aide de quelques explications)
;o)))

l'éclaicissement ????
ibsen ne dit pas explicitement dans une seule colonne !!!
alors que dans le message d'origine 19/01 16:24
Col A date de naissance en chiffres, Col B mois de
naissance en lettres, Col C année de naissance en
chiffres.
l'ambiguité tu l'avais bien relevée en demandant : date
de naissance en chiffres ???
;o)))
si Ibsen avait déja fait la séparation mois, année
la colonne A pouvait à juste titre etre traduite par jour
de naissance ...
Sinon, alors oui la phase Données > convertir est sous-
entendue !

mais Ibsen a effectivement testé nos deux réponses et de
toute évidence su adapter le contexte. ;o)))

j'adore le schmilblick !!!!
@+

-----Message d'origine-----
Si, dans ce même fil, tu lis "l'éclaircissement" donné
par Ibsen le 19/01/05

17:23, il ne t'échappera pas que les données d'origine
ne sont pas saucissonnées

comme tu les utilises dans ta réponse du 19/01/05 22:21
Elles se présentent sous la forme : 15 mai 1645 - 27
septembre 2003,

ce qui suppose donc qques formules supplémentaires ou
un "données/convertir"

Alors que avec une seule formule....
;-)
C'était pour le smilblick !
AV


.



1 2