Inversion jour/mois VBA
Bonjour,
Pour commencer un grand merci aux personnes qui prendront le temps de lire ce post et d'y répondre.
Ensuite, vous m'en voyez navrée, j'ai bien vu que le sujet avait déjà été abordé à de nombreuses reprises mais malgré la lecture et le test de plusieurs solutions je n'ai pas réussi à faire fonctionner mon programme.
Pour rentrer dans le vif du sujet:
-J'utilise un mac avec la version LTSC Standard for Mac 2021
-J'ai un programme servirait à deux choses:
-En cliquant sur un bouton d'affiche en A2 la date + un certains nombres de jours définis via la cellule B14
-Vérification via une MsgB de si la date est correcte
-Si oui elle est affichée en A2
- Sinon, un inputbox demande à l'utilisateur de rentrer une date autre (future ou passée) au format DD/MM/YYYY
Le soucis:
-Pas de soucis lorsque mon jour > 13 mais pour des jours entre 1 et 12 il y a inversion du jour et du mois.
Tentatives de résolution:
-Essayer de forcer la cellule en format texte (affiche la date sous son "code date" ex:48190)
-Essayer de stocker la variable text de l'inputbox > la convertir en date et indiquer le Format(dd/mm/yyyy) -> Pas concluant..
-Remplacer les "/" par "." ça fonctionne mais comme je suis obligée d'avoir des "/" à d'autres endroit du code je ne peux utiliser cette solution.
Bonjour Palo
Avec l'aide de ma fonction ConvDateFR( xtexte ). xtexte est un texte (censé représenter une date à la française) qui sera converti en date Excel. Si la conversion est impossible, la fonction renvoie la chaine vide "". La fonction peut aussi s'utiliser sur une feuille de calcul. Voir une utilisation de cette fonction appliquée à votre demande dans la procédure Sub ladate(). Un exemple d'utilisation sur une feuille de calcul se trouve dans la colonne H.
Avec cette fonction, votre code peut s'écrire :
Sub ladate()
Dim D1 As Date, x As String, y As Variant
D1 = Date + Worksheets("Feuil1").Range("B14")
If MsgBox("La date: " & D1 & " est elle correcte?", vbYesNo) = vbNo Then
On Error Resume Next
x = InputBox("Rentrez la date au format: J/M/AA ou J/M/AAAA")
y = ConvDateFR(x) ' conversion du texte (format date FR) en date Excel
If y = "" Then MsgBox x & " est une date incorrecte." Else Worksheets("Feuil1").Range("A2").Value = y
Else
Worksheets("Feuil1").Range("A2").Value = D1
End If
End SubLe code de la fonction ConvDateFR :
remarque : Le texte à convertir peut être assez varié : 29/2/2024, 29/2/2025, 18 2 24, 18 - 4 - 1978, 1 ++ 5 *// 32 qui seront respectivement convertis en 29 février 2024, en "" (car le 29 février 2025 n'existe pas), en 18 février 2024, en 18 avril 1978, en 1er mai 2032.
Function ConvDateFR(ByVal xtexte As String)
' xtexte est un texte censé représenter une date à la française
' La saisie peut comporter des séparateurs mais l'ordre de saisie de gauche à droite est:
' jour, séparateur1, mois, séparateur2, année, séparateur3
' l'année est soit sur 2 chiffres soit sur 4 chiffres. L'année est obligatoire !
' les séparateurs peuvent être tous différents ou égaux au sein d'une expression, ils
' ne doivent pas comporter de chiffres
' Le résultat est une date représentant un numéro de série de date Excel
' ou bien la chaine vide si le texte n'a pas pu être interprété comme une date
' On ne retient que les dates sup. ou égales au 1 janvier 1904 et inf ou = au 31/12/9999
Const chiffres = "0123456789"
Dim JMA$, a#, b#, i&, c$, y$, blocs, n&, max&
Dim jour, mois, annee, heure, minute, seconde
If Trim(xtexte) = "" Then ConvDateFR = "": Exit Function
' on épure le texte d'éventuels caractères parasites à une date
' les chiffres sont gardés, le reste devient espace
For i = 1 To Len(xtexte)
c = Mid(xtexte, i, 1)
If InStr(chiffres, c) > 0 Then y = y & c Else y = y & " "
Next i
y = Trim(y) ' pas d'espace ni en tête et ni en queue de y
' on remplace les espaces consécutifs par un seul espace
Do: i = Len(y): y = Replace(y, " ", " "): Loop Until i = Len(y)
' on prend toujours 3 paquets de chiffres(jour mois année)
blocs = Split(y & " 0 0 0"): ReDim Preserve blocs(0 To 2)
If Len(blocs(2)) = 3 Or Len(blocs(2)) >= 5 Then ConvDateFR = "": Exit Function
' on passe en nombre
ReDim t(1 To 3): For i = 0 To 2: t(i + 1) = Val(blocs(i)): Next
' Validité de la saisie comme une date
' on commence par la vérification de l'année
If t(3) >= 0 And t(3) <= 99 Then t(3) = t(3) + 2000 ' ajout de 2000 si année sur 2 chiffres
' l'année doit être supérieure ou égale à 1904
If Not (t(3) >= 1904 And t(3) <= 9999) Then ConvDateFR = "": Exit Function
' vérification du mois
If Not (t(2) >= 1 And t(2) <= 12) Then ConvDateFR "": Exit Function
' validité du jour (en fonction du mois)
If t(1) = 0 Then ConvDateFR "": Exit Function
Select Case t(2)
Case 1, 3, 5, 7, 8, 10, 12 ' mois à 31 jours
If t(1) > 31 Then ConvDateFR = "": Exit Function
Case 4, 6, 9, 11 ' mois à 30 jours
If t(1) > 30 Then ConvDateFR = "": Exit Function
Case 2 ' février -> mois à 28 ou 29 jours
If t(1) > IIf(Month(DateSerial(t(3), 2, 29)) = 3, 28, 29) Then ConvDateFR = "": Exit Function
End Select
' résultat = date (en numéro de série)
ConvDateFR = DateSerial(t(3), t(2), t(1))
End FunctionIncroyable !!! Merci beaucoup, ça fonctionne parfaitement. Je suis en train d'essayer de comprendre ta fonction de conversion, je bloque encore sur le passage :
' on prend toujours 3 paquets de chiffres(jour mois année)
' on passe en nombre
mais je comprends la logique du reste. Je vais continuer de potasser ça. Encore merci et bonne journée