Problème conversion date ddj/mm/yyyy macro VBA
Bonjour,
J'ai un soucis sur les conversions des dates je m'explique:
J'extrais d'un fichier excel, des dates sous ce format:
| 12-FEV-20 |
| 05-FEV-20 |
| 05-FEV-20 |
| 10-DEC-19 |
| 12-FEV-20 |
Lorsque je lance l'enregistrement je converti en format date la colonne
je fais recherche F remplace FEV par 02 puis DEC par 12...
Lorsque je fais tourner la macro, il inverse le format en mm/dd/yyyy.
au lieu d'obtenir 12/02/2020 il me donne 02/12/2020.
j'ai essayé de modifier selection.NumberFormat à l'origine en "m/d/yyyy" en mettant à la place "dd/mm/yyyy"
mais cela ne fonctionne pas. Au pire quand j'essaie d'enregistrer il me dit cette commande va arrêter le débogueur.
Dans ce cas la je fais outils > continuer puis je réaffecte la macro je refais tourner mais rien ne change
voir le codage:
Je commence tout juste à mettre le nez dans les macros c'est encore très obscur pour moi qquun aurait il la gentillesse de m'aider sur ce sujet?
Merci beaucoup
Bonjour,
Un essai :
Option Explicit
Option Base 0
Sub ConvertirDates()
Dim Lig As Long, Mois As Variant, Mo As Variant
Mois = Array("JAN", "FEV", "MAR", "AVR", "MAI", "JUN", "JUL", "AOU", "SEP", "OCT", "NOV", "DEC")
With Sheets("mise en page")
For Lig = 1 To .Range("A" & Rows.Count).End(xlUp).Row
For Mo = 0 To 11
If .Range("A" & Lig) Like "*" & Mois(Mo) & "*" Then Exit For
Next Mo
If .Range("A" & Lig) Like "##-???-##" Then
.Range("A" & Lig) = DateSerial(Split(.Range("A" & Lig), "-")(2) + 2000, Mo + 1, Split(.Range("A" & Lig), "-")(0))
End If
Next Lig
End With
End SubMerci de vérifier que l'orthographe des mois dans le code correspond bien à vos données (pas de caractères spéciaux notamment).
Bonjour,
un fichier excel joint aurait été parfait !
en VBA, la règle c'est le format US quand excel peut ... c'est-à-dire que si le premier nombre est inférieur à 12 excel le considérera comme le mois, sinon il considérera la date comme du texte !
il y a plusieurs solutions
- traiter en amont dans la feuille avant de passer en VBA ... par exemple remplacer FEV par fév ou 02, DEC par déc ou 12 au sein même de la feuille par une formule utilisant CNUM et STXT
- traiter dans le code VBA en inversant systématiquement les 2 premiers nombres (pas très propre mais c'est efficace)
- utiliser CDate ou DateSerial
- etc.
Si tu as un fichier, on peut voir cela plus concrètement.
edit : Voir l'une des solutions mise en pratique par Pedro que je salue
Bonjour!!
Merci beaucoup Pedro, ton code à fonctionné à merveille au top!!
Pour une profane comme moi ce langage s'apparente à du chinois mais c'est c'est magique sa fonctionne :))).
et Merci à Steelson également pour tes conseils
Pour une profane comme moi ce langage s'apparente à du chinois mais c'est c'est magique sa fonctionne :))).
Bonjour,
Une version commentée :
Option Explicit 'Oblige à déclarer les variables utilisées
Option Base 0 'Le premier élément d'un tableau est l'élément 0
Sub ConvertirDates()
Dim Lig As Long, Mois As Variant, Mo As Variant 'Déclaration des variables
Mois = Array("JAN", "FEV", "MAR", "AVR", "MAI", "JUN", "JUL", "AOU", "SEP", "OCT", "NOV", "DEC") 'Création d'un tableau contenant les abréviations des mois
With Sheets("mise en page") 'Tout élément commençant par "." se rattache à cette feuille
For Lig = 1 To .Range("A" & Rows.Count).End(xlUp).Row 'Boucle sur les lignes de la feuille (de 1 à la dernière)
For Mo = 0 To 11 'Boucle de 0 à 12 (pour parcourir le tableau des mois)
If .Range("A" & Lig) Like "*" & Mois(Mo) & "*" Then Exit For 'Si correspondance, on sort de la boucle
Next Mo
If .Range("A" & Lig) Like "##-???-##" Then 'Si la cellule A contient une date à convertir
.Range("A" & Lig) = DateSerial(Split(.Range("A" & Lig), "-")(2) + 2000, Mo + 1, Split(.Range("A" & Lig), "-")(0)) 'On remplace le contenu par une date valide (AA = partie du texte après 2ème "-" ; MM = dernière valeur de la variable Mo + 1 : JJ = partie du texte avant le 1er "-")
End If
Next Lig
End With
End Sub