Dates et paramètres régionaux

Bonzour à tous et à toutes !

J'ai un petit soucis qui me provoque d'énorme ennuis.

Le contexte : j'ai créé, et je finalise, un OAD pour mon centre de distribution. On ne va pas s'attarder sur les détails, retenons juste que les dates sont prédominantes et qu'une gestion parfaite de celles-ci est indispensable au fonctionnement de l'application.

Je termine mon apprentissage dans quelques semaines, et je dois leur laisser un outil pérenne mais surtout, qui pourra être maintenu par un utilisateur lambda sans connaissances particulières en VBA (eh oui, on y croit).

Quoi qu'il en soit, les dates étant au centre de l'application, pratiquement toutes les fonctionnalités y font appel - consolidation et traitement des heures travaillées, des absences, de l'activité réalisée, du budget, etc....

Mais mon excel me joue des tours !

La mise en situation, maintenant.

Dans mon tableau A, une consolidation annuelle des heures travaillées, dans lequel je souhaite renseigner les heures liées au "02/01/2015" que je trouverai dans mon tableau B (et assez souvent, dans un rapport BO).

Ma méthode FIND marchera un jour sur :

Set C1 = F1.Columns(3).Find(what:=cell, lookat:=xlWhole) (en l'occurrence, aujourd'hui)

Un autre jour sur :

Set C1 = F1.Columns(3).Find(what:=format(cell, "dd/mm/yyyy"), lookat:=xlWhole) (en l'occurrence, hier)

Encore un autre jour sur :

Set C1 = F1.Columns(3).Find(what:=datevalue(cell), lookat:=xlWhole) (en l'occurrence, avant hier)

Comprenez que ça m'agace énormément car en plus de passer pour un incompétent quand j'ai le bonheur de voir ceci se produire en réunion, je passe un temps fou à essayer de comprendre, sans succès.

Savez-vous d'où cela peut venir ? Des paramètres régionaux peut-être ? Il me semble que BO est en dd/mm/yyyy, mais qu'Excel nativement est en mm/dd/yyyy (quels c*ns, ces ricains et leurs systèmes). Mais quand bien même, cela n'explique pas que deux tableaux internes à l'entreprise formatés sous dd/mm/yyyy nécessite un reformatage (via le format() du Find ou le datevalue qui le met en mm/dd/yyyy).

Please, help !

Bonsoir,

Sans regarder de près les détails de ton problème, même en paramètres régionaux fr france, les problèmes d'interprétation de dates se posent assez souvent avec des inversions mois-jour...

Je pense que prélever la date à rechercher convertie en numéro de série date (avec DateSerial), puis mise au format des cellules de la plage de recherche, devrait offrir une garantie.

Sinon envisager de changer de méthode.

Cordialement

Ferrand

Bonsoir,

Je ne suis pas trop d'accord avec mon ami Ferrand, je pense que la recherche sur la mise en forme est plus que scabreuse ! mébon....

Normalement si la saisie est bien faite la recherche sur les DateSerial n'a aucune raison d'échouer...

A+

Hello galopin !

Je ne pense pas qu'il y ait de désaccord réel !! On connait tous les problèmes liés au passage de dates de VBA à Excel, du fait que VBA pense américain dès qu'on lui laisse une ouverture. Comme c'est le numéro de série qui définit la date (à partir du 1er mars 1900, de façon identique pour Excel et VBA), en s'y référant on arrive à lever les ambiguïtés. Les méthodes peuvent être diversifiées selon les goûts de chacun.

Il y a aussi l'utilisation de Find qui peut parfois révéler des surprises, mais au cas particulier, recherchant une chaîne, il semblerait que le problème de format de date soit prédominant.

Bien à toi. Content de te "voir".

Bye

Bonjour,

Éternel souci, cette recherche de Dates sur Excel, via VBA...

Perso, ça fait longtemps que j'ai opté pour une conversion en Long de la date cherchée, couplée à un Application.Match, style :

Sub essai_date()
Dim Cel
Dim Lig As Long
Dim F1 As Worksheet
Set F1 = Sheets("Feuil1")
Cel = Date
Lig = Application.Match(CLng(Cel), F1.Columns(3), 0)
End Sub

Ainsi, j'ai le numéro de la ligne comportant la date cherchée...

Mais, ceci n'est que AMHA (A Mon Humble Avis)

Bon W-E à tous

Salut à tous...

Perso j'ai renoncé depuis longtemps à utiliser Find ou Match pour parcourir des Arrays...

Je trouve que cette méthode génère par la suite des développements souvent plus efficaces (optimisés)...

La meilleure méthode étant certainement celle qu'on connait le mieux !!!

A+

PS : Pour Ferrand tu peux effacer le message en MP...

Bonsoir à tous !

Merci pour votre réactivité, tout d'abord

@Ferrand C'est intéressant comme idée ; je m'étais laissé tenter par cette méthode au début. Le problème c'est qu'avec le nombre de fichiers, venant de plusieurs sources (autres tableaux ou extraction de DB) et qui sont utilisés par plusieurs personnes, les formats sont susceptibles de changer. L'objectif c'est qu'il puisse durer au moins quelques années, donc j'ai la vision long terme ^^ et du coup, je pense que l'idée de cousinhub est moins risquée.

Par contre je n'utilise pas application match parce que je connais pas mais justement, je viens de chercher sur google (^^) et j'ai trouvé un comparatif entre Find, Match et Array https://fastexcel.wordpress.com/2011/10/26/match-vs-find-vs-variant-array-vba-performance-shootout/

Du coup, j'me tâte pour partir sur les arrays (avec la méthode du Long)

En tout cas, merci à tous !

La proposition de cousinhub est basée sur le même constat que le mien, que seul le numéro de série (c'est l'appellation officielle d'Excel) offre une garantie en matière d'identification de date.

Sa proposition est symétrique de celle que j'aurais éventuellement faite : appliquer au nombre-date le format prélevé sur la plage de recherche (ce qui évite de se tromper de format), ceci pour ne pas toucher à ta méthode de recherche avec Find.

Sa proposition peut présenter une plus grande fiabilité si l'homgénéité de format dans la plage de recherche n'est pas garantie...

A toi de tester différentes possibilités afin de voir ce qui s'adapte le mieux à ton contexte. Quelle que soit la méthode, il te faut prévoir le cas où la recherche est infructueuse.

Match c'est la fonction EQUIV. Find c'est la commande Rechercher d'Excel. J'avoue que je préfère travailler avec des méthodes proprement VBA, sauf quand il s'avère que les fonctions du tableur sont plus rapides ou plus simples à utiliser.

Bonne soirée.

Ferrand

Ferrand, excuse moi, j'avais mal compris ! En fait, il me manquait apparemment un truc évident...prélever le format. Quel naze

Et même double naze, parce que je peux aussi "dateserialer" la date cible. Mea culpa

Merci à tous pour ces solutions...j'ai plus que l'embarras du choix !

Bonjour,

C'est vrai que .find() est souvent une prise de tête pour les dates. 2 éléments ont été oubliés je pense.

1) .find utilise les paramètres de la boite Rechercher, donc si tu ne fixes pas les paramètres un jour un paramètre aura une valeur, le lendemain une autre selon les actions de l'utilisateur auparavant...

2) Tu n'utilises pas le paramètre LookIn qui peut prendre 2 valeurs : xlValues et xlFormulas.

xlValues cherche dans ce qui est affiché (.Text) et pas dans ce qu'on appelle d'habitude la valeur. Si demain l'affichage pour le 05/04/15 est 5 avril 2015 tu ne retrouves plus rien. Il faut que le format soit celui date courte des paramètres régionaux.

A se demander pourquoi xlValues a été inventé. Il suffit que qq'un réduise la colonne et que le nombre s'arrondisse ou que tu aies des ### pour ne plus rien retrouver...

Il faut utiliser LookIn:=xlFormulas pour rechercher dans la vraie valeur date.

Donc avec :

Set c = [A:A].Find(CDate([C2]), LookIn:=xlFormulas, lookat:=xlWhole)

tu augmentes tes chances.

Personnellement la méthode que j'ai trouvée avec des cas rebelles qui provenait justement de différentes sources c'est de mettre la colonne en Entier, faire la recherche avec

Set c = [A:A].Find(CLng(CDate([C2])), LookIn:=xlFormulas, lookat:=xlWhole))

Mais Match fonctionne bien

eric

Bonsoir à tous !

Finalement, vu la taille de l'input j'ai opté pour des arrays, For...Next et Clng(Cdate(#REF))

Donc j'ai réussi à fiabiliser mes importations ; et en plus de ça je les ai amélioré. Le processus devait durer 5-6 minutes avant contre une 30aine de secondes désormais

Rechercher des sujets similaires à "dates parametres regionaux"