XL 2016 Trouver un chaine de caractère par sa forme

R1-

XLDnaute Junior
Bonjour,

J'ai des fichiers dans lesquels je cherche à extraire une date toujours sous la forme "##/##/##" sauf que cette date peut se trouver n'importe ou sur la feuille et parfois même dans une case comportant d'autres caractères.
Il n'y a cependant qu'une seul date sur toute la feuille.
Vous trouverez un exemple en PJ.

Avez vous des idées sur comment je peux m'y prendre ?
 

Pièces jointes

  • BON_DE_COMMANDE.xlsx
    10.5 KB · Affichages: 8
Solution
@Lolote83 ... bonne piste
voici une fonction qui devrait fonctionner pour mettre la date cehrcher en M1 par exemple :
VB:
Sub TrouveDate()
'
Range("M1").Value = Right(Cells.Find(What:="??/??/??", _
                                       LookIn:=xlFormulas, _
                                       LookAt:=xlPart, _
                                       SearchOrder:=xlByRows, _
                                       SearchDirection:=xlNext, _
                                       MatchCase:=False, _
                                       SearchFormat:=False).Value _
                          , 8)
End Sub

R1-

XLDnaute Junior
Je comptais effectivement utiliser le VBA, j'avais pensé à utiliser "like" qui est à ma connaissance la seule fonction capable d'identifier ce genre de chaine de caractères avec un "for Each" analysant les cellules les unes après les autres, mais cela me semble particulièrement lourd pour rechercher une date, je continue donc mes recherches.
 

Deadpool_CC

XLDnaute Accro
Dans ton VBA, tu peux pour chaque chaine à tester utiliser la fonction suivante :
VB:
Function RegExOk(Value As String, Pattern As String, _
  Optional GlobalSearch As Boolean, Optional IgnoreCase As Boolean, _
  Optional MultiLine As Boolean) As Boolean
  Dim re As Object
 
  Set re = CreateObject("VBScript.RegExp")
  With re
    .Pattern = Pattern
    .Global = GlobalSearch
    .IgnoreCase = IgnoreCase
    .MultiLine = MultiLine
    RegExOk = .Test(Value)
  End With
  Set re = Nothing
End Function

(ajout)
Je l'ai fait rapidement à partir de cette ressource : https://www.educba.com/vba-regex/
et pour tes dates le pattern sera [0-9]{2}/[0-9]{2}/[0-9]{2}
et le .global = false (une partie de la chaine ..; pas toute la chaine)
 
Dernière édition:

Lolote83

XLDnaute Barbatruc
Bonjour à tous,
En utilisant un simple CTRL+F et en recherchant /*/, je tombe sur la date en cellule I12
Du coup, une macro qui ferai cette recherche pourrait nous donner la cellule correspondante. Reste plus qu'a extraire la date.
Si celle-ci est toujours en fin de phrase, un droite(cellule,8) donnerait la date
1654780829914.png

Je regarde si le temps me le permet de cogiter à qqch
@+ Lolote83
 

Lolote83

XLDnaute Barbatruc
Re bonjour,
Si tes dates sont toujours au format "##/##/##" comme tu sembles le dire au debut
je cherche à extraire une date toujours sous la forme "##/##/##"
J'ai fait cette petite macro
VB:
Sub ChercheDate()
    '---------------------------------------- Recherche cellule contenant /*/
    Cells.Find(What:="/*/", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
   
    xValeur = ActiveCell.Value              'On récupère la valeur de la cellule
    xPos1 = InStr(1, xValeur, "/")          'On cherche la position du 1er caractère /
    xJour = Mid(xValeur, xPos1 - 2, 2)      'A partir de cette position, on extrait le jour
    xMois = Mid(xValeur, xPos1 + 1, 2)      'A partir de cette poistion, on extrait le mois
    xAnnee = Mid(xValeur, xPos1 + 4, 2)     'A partir de cette position, on extrait l'année
   
    xDateReconstituee = CDate(xJour & "/" & xMois & "/" & xAnnee)
End Sub
@+ Lolote83
 

Deadpool_CC

XLDnaute Accro
@Lolote83 ... bonne piste
voici une fonction qui devrait fonctionner pour mettre la date cehrcher en M1 par exemple :
VB:
Sub TrouveDate()
'
Range("M1").Value = Right(Cells.Find(What:="??/??/??", _
                                       LookIn:=xlFormulas, _
                                       LookAt:=xlPart, _
                                       SearchOrder:=xlByRows, _
                                       SearchDirection:=xlNext, _
                                       MatchCase:=False, _
                                       SearchFormat:=False).Value _
                          , 8)
End Sub
 

Lolote83

XLDnaute Barbatruc
Re bonjour @Deadpool_CC ,
J'étais aussi partie sur le fait que la date contenait 8 caractères et en extraire la partie droite, mais si la cellule contient du texte après la date est-ce que ta fonction marcherait ? Je n'ai pas testé.
D’où mon utilisation de la position du 1er caractère dans la chaine /
Exemple : Date de livraison 08/05/22 pour vérification
@+ Lolote83
 

Deadpool_CC

XLDnaute Accro
EN M1 si date apparait en anglais ajoute Range("M1").NumberFormat = "mm/dd/yyyy"

@Lolote83 ... en effet si date pas à la fin je suis HS
"Date de livraison 02/08/22 au petit matin" me met en M1 "it matin"
Donc ta solution est meilleur (Sniff)

le principal c'est qu'il est une solution qui fonctionne.
 

R1-

XLDnaute Junior
Parfait ça marche bien, bon malheureusement, la date n'est pas toujours en dernière position, mais en repérant la position des "/", avec la fonction "instr", puis en utilisant la fonction "mid", on peut retomber sur nos pates.

Voici le code que j'ai retenu :

VB:
Sub MEF()

Dim C_Date as string
Dim Date_cmp as string

C_Date = Cells.Find(What:="??/??/??", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Value

Date_cmp = Mid(C_Date, InStr(1, C_Date, "/", 8) - 2)

MsgBox Date_cmp

End sub

merci a tous pour votre aide

PS : Pour être honnête , il peut y avoir 3 dates différentes sur le document... mais bon ça ce sera pour une prochaine fois.
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 813
dernier inscrit
kaiyi