XL 2019 Textbox <=> Cells <=> Array/Dictionary, comment gérer une possible date ? Format International vs US ? dd/mm/yy vs mm/dd/yy

Charly88

XLDnaute Occasionnel
Bonjour,
Je suis à la recherche d'un fil de référence / solution passe partout pour gérer au mieux les transitions de date/format international vs américain entre VBA et les cellules excel.

Dans mon cas pratique, je demande à l'utilisateur de nommer la "version" d'un fichier qu'il vient de choisir dans une textbox d'une userform. Je laisse un choix libre mais souvent il voudra désigner ces versions par une date. Cette donnée est ensuite promenée entre cellulles excel et array / dictionary VBA.
Quelle recommandation pour essayer de préserver ce qu'a voulu indiquer l'utilisateur ?

L'utilisateur peut être en Europe ou Etats-Unis mais ça n'est pas même pas mon problème actuel.
Application.Range("Vers_SourceM").Value = USF_ImpSce.TextNomM.Value
Je suis en paramètres régionaux FR mais dans la cellule il réinterprète la date en mm/dd/yy. Le 1er Sept devient le 9 Janvier.

J'ai d'abord tenté transformer la valeur du textbox en string via cstr, ou cdate, pour finalement mettre des conditions en partant du peu fiable isdate(). J'arrive à livrer correctement le 1er Sept. Mais dès que je le repompe en array/dictionary, je ne fais que reporter les problèmes en aval parce qu'il réinterprète systématiquement en US.

Faute de mieux, je serais ok pour un compromis et gérer l'information comme du texte pur mais même ça je ne semble pas capable d'y arriver.

Sur ce sujet probablement aussi vieux que VBA (mais impossible à rechercher sur le net tant les termes sont génériques), quelqu'un aurait-il une solution / recommandation générale ?
 

laurent950

XLDnaute Barbatruc
Bonjour @Charly88 , @chris

VB:
Sub test()
Dim Vers_SourceM As Range
Set Vers_SourceM = [A1]
Vers_SourceM.Clear
Dim Tdate() As String
Tdate = Split("01/09/2021", "/")
For i = LBound(Tdate) To UBound(Tdate)
    If i = LBound(Tdate) Then
        Vers_SourceM.Value = Vers_SourceM.Value & CStr(Tdate(i)) & "/"
    ElseIf i = UBound(Tdate) Then
        Vers_SourceM.Value = "'" & Vers_SourceM.Value & CStr(Tdate(i))
    Else
        Vers_SourceM.Value = Vers_SourceM.Value & CStr(Tdate(i)) & "/"
    End If
Next i
End Sub
 
Dernière édition:

laurent950

XLDnaute Barbatruc
Re @Charly88 , @chris,

Utilisation d'un découpage de chaine de caractères avec de Multi séparateur, Cela pourrait aussi faire l'objet de fonction personnalisé.

Split avec Mutli Séparateur a l'aide d'une Regex.

Les Séparateurs :
"01/09/2021" = "[/]"
Ou
"01/09-2021" = "[/-]"
Ou
"01/09\2021" = "[\/\-\\]" découpage avec / Ou - Ou \
Etc. a définir

Il faut définir le patern
StrPattern = "[/-]"
Remplacer par des vides = reg.Replace("01/09-2021", " ") ' " "
Dimenssioner la variable Tableau = ReDim Tdate(Matches.Count)
Utilisé Joindre = Join(Tdate, "/")

VB:
Option Explicit
Sub test()
Dim Vers_SourceM As Range
    Set Vers_SourceM = [A1]
    Vers_SourceM.Clear
Dim Tdate() As String
Dim Separateurdate As String

Dim Match As Object
Dim Matches As Object
Dim StrPattern As String
Dim reg As Object
        Set reg = CreateObject("VBScript.RegExp")
    StrPattern = "[/-]"
    reg.Pattern = StrPattern
    reg.MultiLine = True: reg.IgnoreCase = False: reg.Global = True
        Set Matches = reg.Execute("01/09-2021")
        ReDim Tdate(Matches.Count)
            For Each Match In Matches
                Debug.Print "source >>", Match.Value
                Separateurdate = reg.Replace("01/09-2021", " ")
            Next Match
        Tdate = Split(Separateurdate, " ")
        Vers_SourceM = "'" & Join(Tdate, "/")
    
' libération d'objets
    Set Matches = Nothing
    Set Match = Nothing
    Set reg = Nothing
    Erase Tdate
    Set Vers_SourceM = Nothing
    Separateurdate = Empty
End Sub
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonsoir
c'est vieux comme le monde
la raison est tres simple
vous confondez le string d'une date a une date
si je fait [A1]="06/08/2021" je vais me retrouver avec une date US dans la cellule "08/06/2021"
par contre si je fait [A1]=Cdate("06/08/2021") là je l'aurais au format paramétré dans excel
alors on peut utiliser aussi datevalue("06/08/2021") ou dateserial (2021,08,06)
c'est pas compliqué ;)
 

Statistiques des forums

Discussions
315 132
Messages
2 116 598
Membres
112 800
dernier inscrit
charly1785