Inversion de date avec fonction convertir dans une macro
Salut le forum,
Dans le fichier que je vous joins, je souhaite convertir des données issues d'un fichier en .csv, quand je converti ces données en mode manuel tout se passe bien et le format de date est respecté.
Sauf que cette manip devra être faite chaque jour, donc j'ai crée un bouton "convertir" et j'y ai associé une macro que j'ai crée via le mode enregistrement.
Dans mon exemple j'ai extrait des données du 06/02/2017, lorsque je converti avec ma macro, la date apparaît en 02/06/2017.
C'est problématique car plus tard je vais sélectionner des données avec un TCD et ça va foutre le bordel.
Dans ma macro j'ai beau rajouté des lignes pour modifier le format de cellules mais rien n'y fait.
Les données brute issues du csv sont dans la première feuille.
Merci d'avance pour votre aide.
Bonjour,
Remplace ta macro par cette macro :
Sub galopin()
Dim a, b, i&, k%
Application.ScreenUpdating = False
a = [A1].CurrentRegion.Value
b = Split(a(1, 1), ";")
For i = 0 To UBound(b)
Cells(i + 1) = Replace(b(i), Chr(34), "")
Next
Columns(1).NumberFormat = "m/d/yyyy h:mm"
Columns(3).NumberFormat = "0"
For i = 2 To UBound(a)
b = Split(a(i, 1), ";")
Cells(i, 1).Value2 = CDate(Left(a(i, 1), 16))
For k = 1 To UBound(b)
Cells(i, k + 1).Value2 = b(k)
Next
Next
End SubA+
Super, merci.
Tu m'explique un peu si tu veux bien.
A+
bonjour,
Hum... C'est un petit peu compliqué !
Sub galopin()
Dim a, b, i&, k% ' & = As Long, % = As Integer (notation abrégée)
'a et b sont des Array (tableaux virtuels) ou VBA travaille beaucoup plus vite que sur la feuille de calcul
Application.ScreenUpdating = False 'on gèle l'affichage pour accélérer le traitement de la macro
a = [A1].CurrentRegion.Value 'On stocke dans a toutes les valeurs de la colonne A
'on stocke dans un Array (b) des valeurs de la cellule A1 "splitées" c'est à dire
'saucissonnées et débarassé des " ; "
'Par construction cet array commence à l'indice 0
b = Split(a(1, 1), ";") 'On s'occupe séparément de la ligne 1 (pour traiter les guillemets)
For i = 0 To UBound(b) 'on va boucler sur tous les éléments de l'array (ici UBound(b) = 4)
Cells(i + 1) = Replace(b(i), Chr(34), "") 'On commence par Cells(i+1) car Cells("zéro") n'existe pas...
Next 'la dernière cellule de la première ligne sera donc bien la Cells(5) car il y a 5 colonnes.
'On va formater la colonne A pour qu'Excel s'occupe de la conversion des données à venir
Columns(1).NumberFormat = "m/d/yyyy h:mm"
'On va formater la colonne C pour qu'Excel ne formate pas les données en notation scientifique
Columns(3).NumberFormat = "0"
'Et maintenant on va s'occuper des autres lignes
For i = 2 To UBound(a) 'De la ligne 2 à UBound(a) (la dernière ligne)
b = Split(a(i, 1), ";") 'on stocke dans un Array (b) des valeurs de la ligne i "splitées"
'On s'occupe séparément de la colonne 1 car on va faire un jeu complexe de conversion :
'On charge VBA de transformer en date le string de la première cellule mais...
'VBA va envoyer cette date dans la cellule sous forme de nombre à virgule flottante (de type "double")
'Car "Value2" ne gère pas les dates donc cette date sera auto-convertie en N° de série
'Ensuite, c'est Excel qui prendra le relais pour afficher la date sous le format précisé plus haut
Cells(i, 1).Value2 = CDate(b(0)) ' b(0) ou Left(a(i, 1), 16) : c'est la même chose...
For k = 1 To UBound(b) 'et on s'occupe maintenant des autres colonnes
Cells(i, k + 1) = b(k)
Next
Next 'et on passe à la ligne suivante !
End SubA+