XL 2021 VBA - Est-ce que le format d'une cellule est un format de type Date (quelconque)

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Dudu2

XLDnaute Barbatruc
Bonjour,

Est-ce que cette fonction répond de manière sûre à la question ?
VB:
Function FormatCellIsDate(Cell As Range) As Boolean
    If IsDate(Format(0, Cell.NumberFormat)) Then
        'Return Value
        FormatCellIsDate = True
    End If
End Function
 
Solution
Voilà le code ChatGPT de @sylvanu corrigé des quotes et backslashes. Suis pas mécontent de lui en mettre une petite à ChatGPT 😎
VB:
'---------------------------------------------------
'Returns True if the Cell format is of any Date type
'---------------------------------------------------
Function IsDateFormat(Cell As Range) As Boolean
    Dim CellNumberFormat As String
    Dim CellCleanNumberFormat As String
    Dim OnQuote As Boolean
    Dim iQuote As Integer
    Dim iBackSlash As Integer
    Dim i As Integer
 
    CellNumberFormat = LCase(Cell.NumberFormat)
 
    i = 1
    iQuote = 0
    iBackSlash = -1
 
    For i = 1 To Len(CellNumberFormat)
        'Quote
        If Mid(CellNumberFormat, i, 1) = """" Then...
perso j'ai du mal a te comprendre des fois
tu considère que "d" c'est un format date ?
tu considère que "jed\o\rsdebb\out" c'est un format date ?

dans ce cas là pourquoi pas "y" ou "m" ou "h" ou "n"
et pourquoi pas aussi "le d mon de minuit/ se cache sous le lit de -yvan"
et pourquoi pas "d/u d/u2"
je crois que la petite que tu lui a mis à chatgpt n'est en fait qu'une illusion

ça n'a pas de sens ton truc
enfin moi ce que j'en dit tu fait ce que tu veux
j'imagine le gars qui passe derrière toi en train de te maudire

mais je comprends pas je met une date et ca me fait n'importe quoi
il me dit que c'est une date mais en fait ca n'en est pas une
au secours help me !!!!

je pense que tu devrais ralentir le schnaps
😉 🤪 🤣 🤣 🤪 😉

tu va rester sage oui !!
 
Moi je ne considère rien du tout. C'est Excel qui considère.

Un jour, un mois, un année, ça reste une date et on peut avoir besoin d'afficher 6 pour le 6 juillet 2025.

<j> en français ou <d> en anglais c'est le jour (sur 1 caractère sauf si le jour est > 9 alors c'est le jour sur 2 caractères.
La preuve:
1751837504534.png


Pour Excel, c'est bien une date (IsDateValue = VRAI) et le format est bien un format Date (IsDateFormat = VRAI)
Et il a raison. Ton code n'aime pas ce format, mais c'est le problème de ton code, pas celui d'Excel.

Et je savais d'avance que ça tournerait à la polémique avec personnalisation de l'argumentation
1751837773854.gif

Mais pas moi.
 
Autre exemple plus complexe:

1751838275448.png


Je serais bien incapable en 2mn de traduire le format <jed\o\rsdebb\out> en date et en l'occurrence ça ne m'intéresse pas spécialement.
Mais Excel lui le fait. Il trouve même que la valeur est bien une date (IsDateValue = VRAI) et mon code (enfin celui de ChatGPT / @sylvanu amélioré) trouve que c'est bien un format Date. Contrairement à ton code.

Edit: D'ailleurs dans les 2 cas, si on part d'une date (06/07/2025) et qu'on lui applique un format. Si le résultat est reconnu par Excel comme une date (IsDateValue = VRAI basée sur IsDate() VBA) c'est que le format est obligatoirement un format Date.
 
Dernière édition:
Bonjour à tous,
Oui bien sûr, on ne doit travailler qu'avec le NumberFormat, la valeur n'est en rien déterminante pour le format.

Mais dans cette proposition:
Edit: D'ailleurs dans les 2 cas, si on part d'une date (06/07/2025) et qu'on lui applique un format. Si le résultat est reconnu par Excel comme une date (IsDateValue = VRAI basée sur IsDate() VBA) c'est que le format est obligatoirement un format Date.
la valeur est juste là pour témoigner, pas pour déterminer.

D'ailleurs, dans le doute, je me suis posé la question de la véracité de cette proposition à propos d'une date en format Texte ('06/07/2025) pour laquelle IsDate() retourne True alors que le format Texte n'est pas un format Date.
Mais dans ce cas, on ne part pas d'une date (06/07/2025) mais d'un texte ('06/07/2025), donc la proposition n'est pas satisfaite sur son hypothèse initiale de partir d'une date. Elle reste donc vraie... jusqu'à démonstration du contraire.
 
Bonjour @Dudu2
c'est bien la que réside le problème
faire la différence entre le numberformat le .value et le .text voir même le value2
sans parler de l'automatisme d'excel (voir exemple cells(3,1))
demonstration:
VB:
'patricktoulon
'quasiment tout les formats de date sont détectés
'dd/mm/yyyy

'dd -mm - yyyy
'dd mm yyyy ? ? espace
'yyyy.mm.dd
'd m yy
'd -mmm - yyyy
'yyyy , mm, dd
'dd mmm (date partielle)
'mmm yyyy
'etc....
'etc....
Sub test()
    Cells(1, 1) = "Toto"
    Cells(1, 1).NumberFormat = "dd/mm/yyyy"
    MsgBox Cells(1, 1).Text & vbCrLf & Cells(1, 1).NumberFormat & "  : " & EstFormatDate(Cells(1, 1)) & vbCrLf & " est une date :" & IsDate(Cells(1, 1))
    
    
    Cells(2, 1).NumberFormat = "@"
    Cells(2, 1) = "06/07/2025"
    MsgBox Cells(2, 1).Text & vbCrLf & Cells(2, 1).NumberFormat & "  : " & EstFormatDate(Cells(2, 1)) & vbCrLf & " est une date :" & IsDate(Cells(2, 1))
    
    
    Cells(3, 1).NumberFormat = "General"
    Cells(3, 1) = "07/07/2025"
    MsgBox Cells(3, 1).Text & vbCrLf & Cells(3, 1).NumberFormat & "  : " & EstFormatDate(Cells(3, 1)) & vbCrLf & " est une date :" & IsDate(Cells(3, 1))
     
End Sub

Function EstFormatDate(cel As Range) As Boolean
    Dim nbF As String
    nbF = LCase(cel.NumberFormat)
    'suppression des caractères genants utilisé éventuellement dans le pattern
    ' sauf le separateur de date bien sur!!!, lui on l'échappe dans le pattern
    nbF = Replace(Replace(Replace(nbF, """", ""), "$", ""), "€", "")
    With CreateObject("VBScript.RegExp")
        .IgnoreCase = True
        .Global = False
        ' On cherche au moins deux composantes (d, m, y) parmi les trois, séparées par des séparateurs
        .Pattern = "\b(?:d{1,4}|m{1,4}|y{2,4})([\s\/\-,\.]*)" & _
                    "(?:d{1,4}|m{1,4}|y{2,4})(\1?(?:d{1,4}|m{1,4}|y{2,4}))?\b"
        EstFormatDate = .test(nbF)
    End With
End Function
 
Dernière édition:
allez on ajoute un autre test
VB:
Cells(4, 1).NumberFormat = "0"
    Cells(4, 1) = CDate("07/07/2025")
    MsgBox Cells(4, 1).Value2 & vbCrLf & Cells(4, 1).NumberFormat & "  : " & EstFormatDate(Cells(4, 1)) & vbCrLf & " est une date :" & IsDate(Cells(4, 1).Value2)
tu l'aura compris mon but est bien de te montrer qu'il n' est pas possible dans tout les cas
de faire la corrélation entre le numberFormat et le value
 
Bonjour.
Précision.
La propriété Value d'un Range d'une cellule est renvoyée comme un Variant/Date si la valeur de la cellule est un nombre (stocké en Double) et si son format de cellule le conduit, pour affichage, à l'interpréter comme une date, éventuellement assortie d'une heure.
L'affectation d'un Variant/Date à la Value d'une cellule peut contraindre Excel à modifier le format de la cellule de telle sorte qu'il la renverrait aussi sous cette forme ultérieurement.
 
La propriété Value d'un Range d'une cellule est renvoyée comme un Variant/Currency si la valeur de la cellule est un nombre (stocké en Double) et si son format de cellule le conduit, pour affichage, à l'interpréter comme un montant, une donnée monétaire ou comptable.
L'affectation d'un Currency à la Value d'une cellule peut contraindre Excel à modifier le format de la cellule de telle sorte qu'il la renverrait aussi sous cette forme ultérieurement.
 
si on part d'une date (06/07/2025) et qu'on lui applique un format. Si le résultat est reconnu par Excel comme une date (IsDateValue = VRAI basée sur IsDate() VBA) c'est que le format est obligatoirement un format Date.
Dans ce cas, tu sauvegardes le contenu de ta cellule à tester, puis tu mets une date dans ladite cellule, tu regardes si c'est un format date, puis tu remets la valeur sauvegardée. Nan ?
 
Dernière édition:
Dans ce cas, tu sauvegardes le contenu de ta cellule à tester, puis tu mets une date dans ladite cellule, tu regardes si c'est un format date, puis tu remets la valeur sauvegardée. Nan ?
Déjà ça fait des manips sur cellules et pour les codes qui utilisent les évènements Change() c'est pas terrible, faut désactiver préalablement.
Et ensuite si je mets une date dans la cellule de format Standard, ça va en changer le format en Date.

Edit: car comme le dit @Dranreb, c'est par le format qu'Excel reconnait une date. Sinon c'est un nombre.
 
Dernière édition:
re
je rappelle pour les lecteurs le titre de la question
vba-est-ce-que-le-format-dune-cellule-est-un-format-de-type-date-quelconque.

rien a voir avec la valeur a l’intérieur

a ce que je constate la question aurait du être

vba est-ce-que je peux déterminer en toute circonstances si la valeur (dans la cellule) est une date

ce n'est pas la même chose
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
250
Retour