Expressions régulières - Patterns pour RegExp

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Bonjour,
petit oubli dans la prise en compte des années bissextiles 1704, 1708, 1804, 1808 dû à un léger oubli dans le pattern.
Erreur maintenant rectifiée.
Fichier actualisé.
A+
 

Pièces jointes

  • Extraction_date_Roger2327_David84_XLD_02_02.xls
    257.5 KB · Affichages: 107

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Bonjour,
Toujours dans le cadre du traitement de chaînes de caractères de type dates, ci-joint une version Beta à tester d'une fonction permettant de retranscrire une chaîne de caractères comportant une date rédigée en lettres en format date (premier janvier mille sept cent quatre-vingt-deux=>01/01/1782).

Code:
Function DateLettreEnNbre(Cellule As Range) As String 'David84 http://www.excel-downloads.com/forum/148188-expressions-regulieres-patterns-pour-regexp-11.html#post1092727
Dim oRegExp, Match, Matches, Mois, Unités, Dizaines, Dizaine, Centaines, Milliers, i As Integer, MaChaine As String, ChaineInit As String, _
MonPattern As String, j As Byte, Item, jour, an, testUnit As Boolean, testMill As Boolean, testCent As Boolean, testDiz As Boolean, testDizs As Boolean, _
temp1 As Byte, temp2 As Byte, temp3 As Byte, temp4 As Byte, temp5 As Byte, antemp

If Cellule = "" Then Exit Function
MaChaine = LCase(Cellule.Value)
MaChaine = Replace(Replace(" " & MaChaine & " ", "premier", "un"), " mil ", " mille ")
Set oRegExp = CreateObject("vbscript.regexp")
With oRegExp
    .Global = True
    .IgnoreCase = True
    
Unités = Array("un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf")
Dizaine = Array("onze", "douze", "treize", "quatorze", "quinze", "seize", "dix sept", "dix huit", "dix neuf")
Dizaines = Array("dix", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante dix", "quatre vingt", "quatre vingt dix")
Mois = Array(" janvier ", " février ", " mars ", " avril ", " mai ", " juin ", " juillet ", " août ", " septembre ", " octobre ", " novembre ", " décembre ")
Centaines = Array("cent", "deux cent", "trois cent", "quatre cent", "cinq cent", "six cent", "sept cent", "huit cent", "neuf cent")
Milliers = Array("mille", "deux mille")

'traitement du mois
For i = LBound(Mois) To UBound(Mois)
    .Pattern = Mois(i)
        Set Matches = .Execute(MaChaine)
        If .Test(MaChaine) = True Then
            For j = 0 To Matches.Count - 1
                MaChaine = Replace(MaChaine, Matches.Item(j), " /" & Format(i + 1, "00") & "/ ")
            Next j
        End If
Next i

MaChaine = Replace(Replace(MaChaine, "-", " "), " et ", " ")
ChaineInit = MaChaine

'Traitement du jour
testDiz = False And testDizs = False And testUnit = False
jour = Left(MaChaine, InStr(1, MaChaine, "/") - 1)

For i = UBound(Dizaine) To LBound(Dizaine) Step -1
    .Pattern = Dizaine(i)
        Set Matches = .Execute(jour)
        If .Test(jour) = True Then
            For j = 0 To Matches.Count - 1
                temp1 = i + 11: testDiz = True
            Next j
        End If
        If testDiz = True Then Exit For
Next i

If testDiz = False Then
    For i = UBound(Dizaines) To LBound(Dizaines) Step -1
        .Pattern = Dizaines(i)
            Set Matches = .Execute(jour)
            If .Test(jour) = True Then
                For j = 0 To Matches.Count - 1
                    temp2 = (i + 1) * 10: testDizs = True
                Next j
            End If
            If testDizs = True Then Exit For
    Next i

    For i = UBound(Unités) To LBound(Unités) Step -1
        .Pattern = Unités(i)
            Set Matches = .Execute(jour)
            If .Test(jour) = True Then
                For j = 0 To Matches.Count - 1
                    temp3 = i + 1: testUnit = True
                Next j
            End If
            If testUnit = True Then Exit For
    Next i
End If
If testDiz = False And testDizs = False And testUnit = True Then MaChaine = Replace(MaChaine, jour, temp3, , 1): GoTo TraitementAnnée
If testDiz = True And testDizs = False And testUnit = False Then MaChaine = Replace(MaChaine, jour, temp1, , 1): GoTo TraitementAnnée
If testDiz = False And testDizs = True And testUnit = False Then MaChaine = Replace(MaChaine, jour, temp2, , 1): GoTo TraitementAnnée
If testDiz = False And testDizs = True And testUnit = True Then MaChaine = Replace(MaChaine, jour, Left(temp2, 1) & temp3, , 1): GoTo TraitementAnnée

'traitement de l'année
TraitementAnnée:
testMill = False
testCent = False
testDiz = False
testDizs = False
testUnit = False
temp1 = 0
temp2 = 0
temp3 = 0
temp4 = 0
temp5 = 0
an = Trim(Right(MaChaine, Len(MaChaine) - InStrRev(MaChaine, "/")))
antemp = an


For i = UBound(Milliers) To LBound(Milliers) Step -1
    .Pattern = Milliers(i)
        Set Matches = .Execute(antemp)
        If .Test(antemp) = True Then
            For j = 0 To Matches.Count - 1
                temp1 = i + 1: testMill = True
                antemp = Trim(Replace(antemp, Milliers(i), ""))
            Next j
        End If
        If testMill = True Then Exit For
Next i

For i = UBound(Centaines) To LBound(Centaines) Step -1
    .Pattern = Centaines(i)
        Set Matches = .Execute(antemp)
        If .Test(antemp) = True Then
            For j = 0 To Matches.Count - 1
                temp2 = i + 1: testCent = True
                antemp = Trim(Replace(antemp, Centaines(i), ""))
            Next j
        End If
        If testCent = True Then Exit For
Next i

For i = LBound(Dizaine) To UBound(Dizaine)
    .Pattern = Dizaine(i)
        Set Matches = .Execute(antemp)
        If .Test(antemp) = True Then
            For j = 0 To Matches.Count - 1
                temp4 = i + 11: testDiz = True
                antemp = Trim(Replace(antemp, Dizaine(i), ""))
            Next j
        End If
        If testDiz = True Then Exit For
Next i

For i = UBound(Dizaines) To LBound(Dizaines) Step -1
    .Pattern = Dizaines(i)
        Set Matches = .Execute(antemp)
        If .Test(antemp) = True Then
            For j = 0 To Matches.Count - 1
                temp3 = i + 1: testDizs = True
                antemp = Trim(Replace(antemp, Dizaines(i), ""))
            Next j
        End If
        If testDizs = True Then Exit For
Next i

For i = LBound(Unités) To UBound(Unités)
    .Pattern = Unités(i)
        Set Matches = .Execute(antemp)
        If .Test(antemp) = True Then
            For j = 0 To Matches.Count - 1
                temp5 = i + 1: testUnit = True
                antemp = Trim(Replace(antemp, Unités(i), ""))
            Next j
        End If
        If testUnit = True Then Exit For
Next i

If testMill = True And testCent = True And testDiz = False And testDizs = False And testUnit = True Then MaChaine = Replace(MaChaine, an, temp1 & temp2 & 0 & temp5): GoTo Fin
If testMill = True And testCent = True And testDiz = True And testDizs = False And testUnit = True Then MaChaine = Replace(MaChaine, an, temp1 & temp2 & 0 & temp5): GoTo Fin
If testMill = True And testCent = True And testDiz = False And testDizs = False And testUnit = False Then MaChaine = Replace(MaChaine, an, temp1 & temp2 & 0 & 0): GoTo Fin
If testMill = True And testCent = True And testDiz = False And testDizs = True And testUnit = False Then MaChaine = Replace(MaChaine, an, temp1 & temp2 & temp3 & temp4): GoTo Fin
If testMill = True And testCent = True And testDiz = True And testDizs = False And testUnit = False Then MaChaine = Replace(MaChaine, an, temp1 & temp2 & temp4): GoTo Fin
If testMill = True And testCent = True And testDiz = False And testDizs = True And testUnit = True Then MaChaine = Replace(MaChaine, an, temp1 & temp2 & temp3 & temp5): GoTo Fin 'vingt et un et ...
If testMill = True And testCent = True And testDiz = True And testDizs = True And testUnit = False Then MaChaine = Replace(MaChaine, an, temp1 & temp2 & temp3 + Left(temp4, 1) & Right(temp4, 1)): GoTo Fin 'soixante et onze ...
If testMill = True And testCent = False And testDiz = False And testDizs = False And testUnit = False Then MaChaine = Replace(MaChaine, an, temp1 & temp2 & temp3 & temp4): GoTo Fin 'deux mille ...
If testMill = True And testCent = False And testDiz = False And testDizs = False And testUnit = True Then MaChaine = Replace(MaChaine, an, temp1 & temp2 & temp3 & temp5): GoTo Fin 'deux mille un...
If testMill = True And testCent = False And testDiz = False And testDizs = True And testUnit = False Then MaChaine = Replace(MaChaine, an, temp1 & temp2 & temp3 & temp4): GoTo Fin 'deux mille dix...
If testMill = True And testCent = False And testDiz = True And testDizs = False And testUnit = False Then MaChaine = Replace(MaChaine, an, temp1 & temp2 & temp4): GoTo Fin 'deux mille onze...
If testMill = True And testCent = False And testDiz = False And testDizs = True And testUnit = True Then MaChaine = Replace(MaChaine, an, temp1 & temp2 & temp3 & temp5): GoTo Fin 'deux mille ving et un...
If testMill = True And testCent = False And testDiz = True And testDizs = True And testUnit = False Then MaChaine = Replace(MaChaine, an, temp1 & temp2 & temp3 + Left(temp4, 1) & Right(temp4, 1)): GoTo Fin 'deux mille soixante et onze...

Fin:
MaChaine = Trim(Replace(MaChaine, " ", ""))
If Len(MaChaine) = 9 Then MaChaine = 0 & MaChaine
.Pattern = "((0?[1-9]|[12]\d|3[01])[ /-](0?[13578]|1[02])|(0[1-9]|[12]\d|30)[ /-](0?[469]|11))[ /-]((1\d|2\d)\d\d)|(0[1-9]|1\d|2[0-8])[ /-]0?2[ /-]((1\d|2\d)\d\d)|29[ /-]0?2[ /-]((1[01345789]|2[1235679])0[48]|(1\d|2\d)([13579][26]|[2468][048])|(1[2604]|28)0[048])" '1000 à 2999

If .Test(MaChaine) = True Then DateLettreEnNbre = Format(MaChaine, "dd/mm/yyyy") Else DateLettreEnNbre = "Date non valide"

Set oRegExp = Nothing
Set Matches = Nothing
Set Item = Nothing
End With

End Function

Ci-joint un fichier test :
- tester à l'aide des menus déroulants en F2 et F4
- les dates en lettres colonne D
- les dates en format date colonne E
- une zone de test manuels colonne A
- contrôle de l'année colonne L
- emploi d'une fonction trouvée sur
permettant de retranscrire l'année chiffrée en année en lettres (cette fonction n'est utilisée que pour information et n'est pas liée à la fonction.
DateLettreEnNbre

Merci de me signaler les erreurs que vous pourriez déceler.

Lorsque cette fonction sera opérationnelle, nous verrons si possible comment l'inclure à la fonction ExtraireDate afin que les dates en lettres soient également (et dans la mesure du possible) extraites d'un texte.

NB :
- La plage de dates va du 1er janvier 1000 au 31 décembre 2999 et le format date ramené est de type Grégorien (les formats date antérieurs au 15 octobre 1582 sont donc ramenées en Grégorien alors que ce calendrier n'était pas alors en vigueur).

- Je n'ai pas trouvé de fonction permettant d'effectuer ce travail alors que le contraire existe (01/01/1900=>premier janvier mille neuf cent). C'est la raison pour laquelle j'effectue la tentative.
Si toutefois vous avez une fonction qui fait déjà ce travail dans vos archives, merci de me la communiquer.

A+
 

Pièces jointes

  • DateLettreEnNbre _XLD.xls
    498.5 KB · Affichages: 114

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Bonjour,
ci-joint la fonction ExtraireDate permettant l'extraction de chaînes de caractères au format dd/mm/aaaa.
Pour ceux qui n'ont pas suivi le fil : extraction de différentes chaînes de caractères de type date au sein d'un texte.
Les formats traités :

- les dates du calendrier Grégorien et leurs dérivés

- les formats de type
pour les mois de septembre à décembre

- les dates du calendrier Républicain grâce à la fonction de Roger 2327 pour le traitement de formats de type.
2 Vendémiaire An1

J'ai légèrement retouchée par la fonction initiale fournie par Roger2327 afin de traiter également les chaînes de type
2 Vendémiaire 1792
que l'on retrouve dans les registres lors du début de l'utilisation de ce calendrier (donc s'il y a des erreurs dans le traitement de ce format, c'est de ma faute:eek:)*.

- les dates écrites en toute lettres.

Je vous ai laissé les 3 onglets "Test" pour les dates Grégoriennes, Républicaines et en toute lettres et ai placé un onglet "Test général" permettant de mélanger ces différents formats.

Certains motifs ont été revus car des erreurs subsistaient (et il y en a sûrement encore).

Je propose aux personnes intéressées par ce sujet d'utiliser l'onglet "Test général" et de tester chacun une dizaine de dates puis de poster leurs tests afin de vérifier le bon fonctionnement de la fonction et mettre en évidence les erreurs éventuelles.
Pour plus de facilité, je vous propose la chose suivante : rentrer en colonne A la même date écrite différemment.
Ceci permet de mettre en évidence les erreurs de traitement (la même date au format dd/mm/aaaa doit être ramenée à chaque fois) de manière plus simple.

En l'absence de retour d'information ou du fait que je constate moi-même des erreurs, je considérerai ce sujet comme clos.
Je remercie Roger2327 pour sa précieuse contribution ainsi que les autres personnes ayant participé à cette discussion.
A+

*@Roger : je ne sais pas si cela se fait de retoucher une fonction proposée par un autre contributeur (j'ai très peu de vécu dans l'univers de la programmation et je ne connais pas les us et coutumes).
Si cela pose problème, merci de m'en avertir par MP.
Comme précisé dans mes messages antérieurs, je peux éventuellement voir comment traiter les formats de type
1er vendémiaire 1792
par RegExp.
 

Pièces jointes

  • Extraction_date_David84_Roger2327_07-02.xls
    548 KB · Affichages: 123

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Re
la MFC proposée pour repérer les erreurs était bancale : je l'ai simplifiée. Si la date extraite en colonne B à G n'est pas la même, la ligne se met en rouge.
A+
 

Pièces jointes

  • Extraction_date_David84_Roger2327_07_02.xls
    546.5 KB · Affichages: 108

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Bonsoir,
une légère modification du motif permet maintenant le traitement des dates écrites en lettres même s'il n'y a pas d'espace entre celles-ci et le reste de la chaîne de caractères.
essai un-vingt septembre mille neuf cent vingt et unxxxxxessai deuxvingt septembre mille neuf cent vingt et unxx
sont maintenant correctement traitées (la fonction ramène 20/09/1921).
A+
 

Pièces jointes

  • Extraction_date_David84_Roger2327_17_02.xls
    374 KB · Affichages: 132

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Bonjour,
comme promis ici, ci-joint une nouvelle version de la fonction ExtraireDate.

Pour ceux et celles qui prendraient le train en route, cette fonction permet d'extraire dans une chaîne de caractères la ou les dates présentes dans le texte, qu'elle(s) soi(en)t écrite(s) totalement ou en partie en chiffres et/ou en lettres pour les dates du calendrier Grégorien.

Grâce à la participation de Roger2327, cette fonction permet également de traduire les dates du calendrier Républicain en date Grégorienne.

Ainsi, la chaîne de caractères
les 15 fructidor an 2 et 15 fructidor an II et 1er septembre 1794 et premier septembre mille sept cent quatre vingt quatorze et 1-9-1794 et 1er sept. 1794
ramène 6 fois la date 01/09/1794.

Cette fonction permet maintenant ramener les dates extraites au format voulu : par défaut le format jj/mm/aaaa mais
peut donner par exemple
lundi 01 septembre 1794
ou
Pour cela, vous n'avez qu'à préciser dans le 2ème argument (optionnel) de la fonction le format voulu.

De plus, les dates traitées vont maintenant du 1er janvier de l'an 1 au 31 décembre 9999.

J'ai rendu cette nouvelle fonction matricielle afin d'en accélérer le traitement.

Cette nouvelle fonction est appelée ExtraireDateMat.
Si le texte à traiter comporte plusieurs dates à extraire, sélectionnez une plage de cellules et validez la fonction en matriciel (Ctrl, Maj et Entrée).
S'il n'y a qu'une seule date à extraire (ou uniquement la 1ère du texte), validez la fonction classiquement.

Je vous ai laissé 2 onglets pour tester la fonction :
- un onglet Test ExtraireDateMat dans lequel vous pouvez tester des chaînes de caractères comportant différentes dates sous différents formats.

- un onglet Test général dans lequel vous pouvez vous amuser à rentrer 6 fois la même date écrite de manière différente. Cela permet de tester les bugs éventuels.
Une MFC permet de se rendre compte si une ligne comporte différentes dates (normalement, une ligne doit comporter la même date).
Attention toutefois : si vous utilisez le format par défaut (jj/mm/aaaa),
trente et un aout deux mille onze
ramènera 31/08/2011 tandis que
ramènera 31/08/0011.
Ceci est logique puisque la fonction interprète l'année comme différente (voir les exemples placés dans Test général).
Par contre, si vous utilisez un format jjj jj mmm aaaa, toutes les dates ramenées seront identiques (mer. 31 août 2011) : Excel interprète alors classiquement 11 comme 2011.
C'est donc à vous de choisir le format voulu en fonction du type de traitement espéré.

Pour ceux qui préféreraient une fonction non matricielle qu'il faudrait tirer vers la droite pour obtenir les différentes dates, c'est bien entendu possible mais la vitesse de traitement n'est pas la même sur des plages conséquentes : faites-le moi savoir et je livrerai une version non matricielle.

Merci de me faire remonter les éventuels idées, remarques, plantages, etc.
A+
 

Pièces jointes

  • ExtraireDateMat.xls
    266 KB · Affichages: 100
  • ExtraireDateMat.xlsm
    120.7 KB · Affichages: 108
Dernière édition:

C@thy

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Carrément génial, maintenant on a tout ce qu'il faut, et même plus qu'espéré.

Merci David ;)

Bizzz

C@thy
 

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Bonjour,
Carrément génial, maintenant on a tout ce qu'il faut, et même plus qu'espéré.
Merci C@thy, c'est bien la première fois que j'entends une femme me dire qu'elle a tout ce qu'il faut et même plus qu'espéré.:eek:

Suite aux remarques de Tibo ici, ci-joint une nouvelle version de la fonction ExtraireDateMat.
Les nouvelles évolutions :
- l'année 0 ramène 2000
deux mars 0=>02/03/2000
- Traitement des années comprises entre 1 et 99 : ajout d'un 2ème argument optionnel permettant ou non le type de traitement par défaut utilisé par Excel.
Concernant une année comprise entre 1 et 29 par exemple la chaîne
premier janvier un
placée en B1:
=ExtraireDateMat(B1) ramène 01/01/0001
=ExtraireDateMat(B1;;1) ramène 01/01/2001
=ExtraireDateMat(B1;"jjjj jj mmmm aaaa") ramène lundi 01 janvier 0001
=ExtraireDateMat(B1;"jjjj jj mmmm aaaa";1) ramène lundi 01 janvier 2001

Concernant une année comprise entre 30 et 99 par exemple la chaîne
premier janvier trente
placée en B1:
=ExtraireDateMat(B1) ramène 01/01/0030
=ExtraireDateMat(B1;;1) ramène 01/01/1930
=ExtraireDateMat(B1;"jjjj jj mmmm aaaa") ramène mardi 01 janvier 0030
=ExtraireDateMat(B1;"jjjj jj mmmm aaaa";1) ramène mercredi 01 janvier 1930

A tester plus avant de votre côté (une feuille "test_argument" permet de le faire plus aisément).

Concernant l'idée émise par Tibo (pour ces dates comprises entre l'an 1 et 99) de "retourner le résultat suivi d'un ? ou dans un format particulier (en italique ou en couleur ou... au choix) de façon à indiquer que le résultat est à prendre avec prudence.", je vais y réfléchir : l'application d'une MFC dans le fichier peut être une possibilité facile à mettre en œuvre mais la possibilité d'intégrer directement à la fonction un format particulier peut également être un "plus" (qu'en pensez-vous ?).

N'hésitez pas à me faire remonter les éventuels plantages ou remarques.
A+
 

Pièces jointes

  • ExtraireDateMat_v2.xlsm
    149.6 KB · Affichages: 95
  • ExtraireDateMat_v2.xls
    442 KB · Affichages: 96

Tibo

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Salut David,

...mais la possibilité d'intégrer directement à la fonction un format particulier peut également être un "plus" (qu'en pensez-vous ?)...

Je suis d'accord avec toi sur ce point. Ça serait effectivement un plus.

Maintenant la question se place au niveau de la faisabilité. Je ne sais pas ce qui est possible ou ce que est le plus facile pour toi.

Je renouvelle mon bravo.

@+
 

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Re Tibo,

Je suis d'accord avec toi sur ce point. Ça serait effectivement un plus.

Maintenant la question se place au niveau de la faisabilité. Je ne sais pas ce qui est possible ou ce que est le plus facile pour toi.
A priori, vu le type de validation (matricielle) de cette fonction, je pense que le plus simple est l'idée du "?" que tu as suggérée et que l'on peut directement appliquer au format traité dans la fonction.

Dans le fichier ci-joint :
=ExtraireDateMat(B1) ramène 01/01/0001?
=ExtraireDateMat(B1;"jjjj jj mmmm aaaa") ramène lundi 01 janvier 0001?

Après, on peut faire autrement (par exemple 01/01/??01 ou 01/01/--01).

Par contre, si une fonction n'est pas à valider en matriciel (comme la fonction Date_AlphaNum), rien n'empêcherait a priori n'appliquer un format de type italique par exemple car alors, une seule cellule est concernée par le résultat de la fonction (je me demande d'ailleurs si je ne vais finalement pas traiter l'argument optionnel n°2 de la même manière dans la fonction Date_AlphaNum, comme cela l'utilisateur aurait également ce choix dans cette fonction et la remarque que tu avais soulevée serait réglée également dans cette fonction (qui a pour but initial de pouvoir être utilisée telle quelle et non obligatoirement avec ExtraireDateMat...).

Que penses-tu de tout cela ?
A+
 

Pièces jointes

  • ExtraireDateMat_v2bis.xlsm
    155.7 KB · Affichages: 84
  • ExtraireDateMat_v2bis.xlsm
    155.7 KB · Affichages: 109
  • ExtraireDateMat_v2bis.xlsm
    155.7 KB · Affichages: 102
  • ExtraireDateMat_v2bis.xls
    464 KB · Affichages: 92

Tibo

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

re,

Comme je l'indiquais dans ce post :

https://www.excel-downloads.com/thr...aracteres-alphabetiques-ou-numeriques.190909/

il est très peu probable qu'une année codifiée sur deux chiffres corresponde à une année du premier siècle de notre ère.

Je pense qu'une solution pourrait être de faire un mix entre ta version précédente et celle-ci, c'est-à-dire :

- Traiter les années de 1 à 29 comme 2001 à 2029 et celles de 30 à 99 comme 1930 à 1999

- Mais en ajoutant le ? pour alerter le lecteur, (ou mettre l'année entre guillemets ou formatage particulier en fonction de ce qui est possible pour toi)

Il est certain que j'interviens ici pour seulement donner des idées, car je suis bien incapable de mettre les mains dans le "cambouis".

Je te l'ai déjà dit, mais ce que j'apprécie le plus, c'est ta capacité à remettre cent fois sur le métier ton ouvrage, cherchant sans cesse à l'améliorer en visant l'excellence (même si au final, on n'y parvient jamais).

@+
 

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Re
- Traiter les années de 1 à 29 comme 2001 à 2029 et celles de 30 à 99 comme 1930 à 1999
Ben en fait, l'utilisateur a maintenant le choix : soit traiter les années entre 1 et 99 comme telle, soit les traiter comme tu le dis.
Je pense que c'est mieux d'avoir ces 2 possibilités (après il choisit en fonction du type de document qu'il a à traiter et du résultat souhaité).
- Mais en ajoutant le ? pour alerter le lecteur, (ou mettre l'année entre guillemets ou formatage particulier en fonction de ce qui est possible pour toi)
C'est ce que j'ai proposé dans le dernier fichier en utilisant le ? (mais c'est un exemple).
Préfères-tu cette solution ou t'ai-je mal compris ?
Si cette solution ne te semble pas efficace, que préconises-tu ?
Il est certain que j'interviens ici pour seulement donner des idées, car je suis bien incapable de mettre les mains dans le "cambouis".
Pas besoin de mettre "les mains dans le cambouis". J'ai surtout besoin de retour de personnes qui voient les choses d'un autre oeil (à force d'être "le nez dans le guidon", on a parfois du mal à prendre un peu de recul). Ta participation est donc grandement appréciée.

Je vais reprendre l'idée et l'adapter à la fonction Date_AlphaNum. Comme celle-ci ne ramène qu'une date (et non une plage de date avec validation en matriciel comme la fonction ExtraireDateMat), je pourrai adopter une autre manière de faire à la plage du "?" (l'année en italique ou en gras par exemple).
A+
 

Tibo

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

re,

L'idée était de reprendre ta version précédente avec le ? :

trente et un janvier 01
ou
trente et un janvier un

donnerait :

31/01/2001?

plutôt que :

31/01/0001?

lorsque le paramètre 1 n'est pas précisé.

@+
 

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Re
L'idée était de reprendre ta version précédente avec le ? :

trente et un janvier 01
ou
trente et un janvier un

donnerait :

31/01/2001?

plutôt que :

31/01/0001?

lorsque le paramètre 1 n'est pas précisé.
Mais à ce moment-là, tu te prives de la possibilité de ramener une date entre l'an 1 et 99 et je pensais personnellement que cette possibilité devait être proposée le cas échéant à l'utilisateur.
Toi tu penses que ce type de date ne peut pas se retrouver dans un document quelconque mais imagine que l'on recopie dans Excel un texte sur la naissance du christianisme et que l'on veuille récupérer toutes les dates inscrites dans ce texte, cette fonction doit être capable de faire le travail.
Or si tu modifies toutes les années 1 à 99 en 1930-1999 et 2001-2029, cela deviendra impossible.
Ceci-dit, il y a sûrement moyen de trouver une solution permettant d'arriver çà ce que tu préconises tout en laissant à l'utilisateur une palette d'option (peut-être donner 3 options au 2ème argument optionnel au lieu de 2 actuellement...).
Je vais y réfléchir de mon côté mais si tu as une idée, n'hésite pas.
A+
 

Tibo

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

rere,

Effectivement !

Dans ce cas, revenir à ce que tu proposais un peu plus tôt :

--01

Ainsi, plus besoin du ?

Les deux tirets me semblent suffisants pour alerter le lecteur.

C'est alors à lui en fonction du contexte d'appréhender ou de deviner la bonne année.

@+
 

Statistiques des forums

Discussions
312 228
Messages
2 086 418
Membres
103 205
dernier inscrit
zch