Modification de date par macro

Bonjour a tous,

J'ai un soucis avec une macro faite par enregistreur.

J'ai dans mon fichier des dates qui comprennent des A en fin de date (pour indiquer si la tâche est terminée). Pour trier correctement mes données, j'ai donc fait un rechercher/remplacer sur les deux colonnes concernées, en demandant de supprimer mes A.

Une fois la macro enregistré, quand je l'utilise, une partie de mes dates prennent un format bizarre (Cf. image en pj), qui n'est plus reconnu par le TCD qui sert à agréger les données. Du coup, elles deviennent inutilisables.

En cherchant sur le net, le problème provient apparement de mon code, puisque la fonction replace renvoi une variable String, et que si je colle cette variable sur un format Date, vba le converti en format américain en le transférant sur Excel. Du coup, mes dates ne sont pas reconnu et plantent. Je pense que l'explication est correcte, puisque j'ai mon soucis de format de date uniquement sur les dates qui dépassent le 12 du mois.

Le code est en pj et ressemble à ça :

Columns("D:E").Select

Selection.Replace What:=" A", Replacement:="", LookAt:=xlPart, _

SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _

ReplaceFormat:=False

Selection.Replace What:="-", Replacement:="/", LookAt:=xlPart, _

SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _

ReplaceFormat:=False

Je me dit que pour régler le problème, il faudrait convertir les dates en format américain avant la manip, puis les reconvertir en format européen ensuite (puisque le reste du fichier travaille sous ce format). Mais je n'ai pas la moindre idée de comment faire ça.

Si quelqu'un à une solution plus simple aussi, je suis preneur. Le but est juste de supprimer les A dans mes dates, et de remplacer les - par des / (problèmes de notation de données dans les programme source, certains ne notent pas correctement les dates).

capture code modif date capture format modif date

Bonsoir,

un fichier comportant votre code et une partie des données "non transformées" serait des plus utiles, non ?

Article 6 de "comment utiliser le forum"

@ bientôt

LouReeD

Bonsoir, Salut LouReed !

Un minimum à savoir en matière de dates :

Dans Excel une date est stockée comme nombre, c'est pourquoi les dates se cadrent à droite dans la cellule, comme les nombres. L'affichage sous forme de date découle du format de cellule, on peut ainsi faire afficher comme date n'importe quel nombre positif (la limite d'affichage est 31/12/9999). Lorsqu'on saisit une date au clavier, c'est d'abord du texte, qu'Excel reconnaît comme étant une date et convertit en nombre, et applique à la cellule le format par défaut de date figurant aux paramètres régionaux de Windows (si celle-ci est au format Standard).

La reconnaissance comme date se fait également à partir des paramètres régionaux. En ce qui concerne les paramètres FR FR, le séparateur de date est le slash / . Cependant le tiret - est reconnu par Excel et VBA comme séparateur universel (applicable quels que soient les paramètres régionaux).

Pour le constater il suffit de taper une date dans une cellule quelconque, au format de cellule Standard, sous la forme par exemple : 17-01-2018, la saisie sera reconnue comme date valide et s'affichera dans la cellule : 17/01/2018 en application du format de date FR par défaut affecté par Excel à la cellule.

Le tiret n'empêche donc nullement la reconnaissance en tant que date, au contraire...

VBA reconnaît les dates à l'instar d'Excel mais sans directives particulières, sa reconnaissance se fait selon les règles américaines qui lui sont natives. Il faut donc lui donner des directives pour qu'il convertisse les dates... en dates selon les règles FR !

La conversion n'a rien à voir avec un format, il s'agit d'une conversion de type de données, conversion d'un texte ressemblant à une date en date. Pour cela on évite absolument l'utilisation de la fonction Format qui ne produit que du texte, lequel peut faire l'objet d'une conversion sauvage en date sans prise en compte des paramètres régionaux. Dès lors qu'on a un texte identifiable comme date, on le convertit au moyen de DateValue ou CDate selon le cas, la conversion explicite obligeant VBA à opérer selon les paramètres régionaux.

J'espère que c'est suffisamment clair pour conduire à cesser de mélanger les notions de format et de type de donnée Date...

Sub test()
    Dim c As Range, Plg As Range
    For Each c In Plg
        c.Value = DateValue(Replace(c, "A", ""))
    Next c
End Sub

Sous réserve d'y ajouter une ligne d'instruction pour y définir la plage à convertir, sous la forme :

Set Plg = ActiveSheet.Range("D2:D3000"), ce bout de code fera la conversion des dates afflublées d'un "A" de la plage indiquée.

Cordialement.

Merci pour les réponses, je n'avais pas le détail concernant la différence entre le format et le type de données, mais j'avais compris que ça ne venait pas de mon format (puisqu'en écrivant directement dans ma cellule, Excel reconnaissait une date directement) mais bien de la conversion de données dans VBA entre le replace et ma donnée d'entrée. Comme ma connaissance se limite à l'enregistreur, je ne connaissais pas DateValue ou CDate.

Mes connaissances étant d'ailleurs limitées (pour faire soft), je n'ai pas compris comment on ajoute la ligne d'instruction dont on parle. C'est tout bête, mais ça s'ajoute dans le code, autre part ? Je suppose que ce n'est pas dans le code directement, sinon ça aurait été ajouté d'entrée.

Manque de temps hier, et aussi je voulais modifier un peu plus les données pour éviter de laisser trainer un fichier avec des données facilement compréhensible. Du coup maintenant j'ai joint un fichier d'exemple avec les données et mon code.

29example.xlsm (18.49 Ko)

Bonjour,

C'est bien dans le code qu'il faut l'ajouter... Si tu dis : pour chaque cellule dans ma plage à traiter... il faut qu'avant de pouvoir le dire tu aies défini ta plage à traiter.

Voilà plus adapté à ton fichier :

Sub RétablirDates()
    Dim c As Range, Plg As Range
    With Worksheets("DATA")
        Set Plg = .Range("D2:E" & .Range("A1").SpecialCells(xlCellTypeLastCell).Row)
    End With
    Application.ScreenUpdating = False
    For Each c In Plg
        If InStr(1, c, "A") > 0 Then
            c.Value = DateValue(Trim(Replace(c, "A", "")))
        End If
    Next c
End Sub

On définit la plage à traiter, on teste si un "A", cela fera gagner du temps (Trim est une fonction qui élimine les espaces d'extrémités). Il y a des chances que l'on opère avec la feuille DATA, active, donc on désactive le rafraîchissement de l'affichage (qu'Excel rétablira automatiquement en fin de macro).

Par contre aucune raison de désactiver les messages d'alerte : il ne doit pas y en avoir, s'il y en avait, c'est une anomalie, il faut donc la connaître ! (Et comme ScreenUpdating, DisplayAlerts revient automatiquement à True.

Ni de basculer le calcul en manuel : il n'y en a quasiment jamais d'ailleurs (dans un fichier ultra-lourd bourré de milliers de formules, le recalcul gênera l'utilisation manuelle mais n'empêche pas une procédure de s'exécuter).

Cordialement.

Merci pour les info en plus, je le saurais pour la prochaine fois. Je pensais qu'il fallait explicitement remettre les paramètres en ordre.

La macro marche nickel, merci encore pour l'aide

De rien... ! Mais retiens surtout les bases, le reste en découle...

Rechercher des sujets similaires à "modification date macro"