OVH Cloud OVH Cloud

Solution de comparaison de dates en VB

12 réponses
Avatar
Llew
Bonjour,

pour info, voici le code que j'ai écrit en VB pour un fichier excel :
comparaison d'une liste de dates avec une date saisie par l'utilisateur

la comparaison de date n'est pas très friendly sous VB, dans les listes
de news j'ai trouvé des fonctions plus ou moins simples et rapides,

alors pourquoi ne pas prendre le problème dans l'autre sens et comparer
des string "yyyymmdd" d'autant que les fonctions de comparaisons de
string sous VB foisonnent ?

solution adoptée dans mon programme, sans ligne de code supplémentaire
et très efficace

(S0 et S1 variables non déclarées : donc string par défaut sous VB)

' récupération date via une fenetre
S0 = UserForm2.CBoxYear.Value + UserForm2.CBoxMonth.Value +
UserForm2.CBoxDay.Value

' lecture des lignes de valeurs en colonne B
' (valeur dd/mm/yyyy affichage personnalisé "dd mmm yyyy")
' jusqu'à récupération de celle correspondant à la date recherchée
L0 = 3
S1 = Format(Cells(L0, 2).Value, "yyyymmdd")
While Cells(L0, 2).Value <> "" And StrComp(S0, S1) > -1
L0 = L0 + 1
S1 = Format(Cells(L0, 2).Value, "yyyymmdd")
Wend


--- Llew ---

10 réponses

1 2
Avatar
AV
Mais quelle est la question ?

AV
Avatar
LeSteph
Bonjour AV ,
je crois que c'est une réponse, mais à quelle question
car cela n'est plus guère usité le format yymmdd...

"AV" a écrit dans le message de
news:
Mais quelle est la question ?

AV




Avatar
AV
je crois que c'est une réponse,


Ca je l'avais deviné... ;-)
mais une recherche de date "rapide" qui utilise While ...Wend .... hum....
C'est la raison pour laquelle je demandais (un poil provocateur) quelle était la
question ?

AV

Avatar
LeSteph
Ca je l'avais deviné...
;-) (Et yé m'en doutais un peu)



"AV" a écrit dans le message de
news:
je crois que c'est une réponse,


Ca je l'avais deviné... ;-)
mais une recherche de date "rapide" qui utilise While ...Wend .... hum....
C'est la raison pour laquelle je demandais (un poil provocateur) quelle
était la

question ?

AV





Avatar
Llew
OK, finalement j'ai bien fait d'en toucher 2 mots,
donc éclairez ma lanterne et qu'y a-t-il de plus rapide pour ma boucle ?
je doit lire la colonne B pour trouver la date qui me convient

merci d'avance,
Llew
Avatar
AV
je doit lire la colonne B pour trouver la date qui me convient


Une soluce pour chercher (la ligne) dans la colonne B:B
* de la date contenue en A1
MsgBox Application.Match([A1] * 1, [B:B], 0)
* de la date x
x = DateSerial(2004, 7, 26)
MsgBox Application.Match(x * 1, [B:B], 0)


PS : les formats de la plage de recherche et/ou de la date à chercher n'ont pas
d'importance
PS bis : je te laisse gérer l'erreur si la date est non trouvée

AV

Avatar
Llew
MsgBox Application.Match(x * 1, [B:B], 0)
ou

MsgBox Application.Match([A1] * 1, [B:B], 0)



merci, ça pourrait aller, sauf que ... j'obtient "Erreur d'exécution 13 :
type incompatible"

je veux comparer une date avec ma colonne B (dates chronologiques)
¤ si elle la contient, je prend les valeurs de la ligne,
¤ sinon, je prend les valeurs de la ligne dont la date dans le passé est la
plus proche (<=)

de plus : la colonne B comprend 2 lignes d'entête avec texte (=/= format
date)

malheureusement, je bug sur VBAXL8.hlp et donc je n'ai pas d'info sur
Application.Match

1- quelles sont les valeurs pour Application.Match qui renvoient un < je suppose que l'on remplace le 0 par 1, -1 ? ou n'est-ce pas possible ?
2- peut-on récupérer l'indice de ligne pour accéder aux infos de la ligne ?

avec mon exemple, je démarre ma boucle à 3 à cause de l'entête et je
récupère l'indice qu'il me faut en (L0 - 1) et ainsi mes données
correspondantes

merci pour le coup de pouce
Llew

Avatar
AV
MsgBox Application.Match(x * 1, [B:B], 0)
MsgBox Application.Match([A1] * 1, [B:B], 0)
merci, ça pourrait aller, sauf que ... j'obtient "Erreur d'exécution 13 :

type incompatible"


** Il n'y a pas d'erreur de syntaxe !
** Pour connaitre la cause il faudrait que tu montres une partie du code qui
précéde plus qques précisions notamment sur x ou A1

je veux comparer une date avec ma colonne B (dates chronologiques)
¤ si elle la contient, je prend les valeurs de la ligne,
¤ sinon, je prend les valeurs de la ligne dont la date dans le passé est la
plus proche (<=)


** Si tes dates sont classées chronologique, pour avoir la ligne de l'occurrence
exacte ou la plus proche au-dessous :
MsgBox Application.Match(x * 1, [B:B], 1)
Le 1° argument de la fonction Match (x * 1 ou [A1]*1) est, évidemment, à
adapter à ton cas !

AV


Avatar
Llew
parfait !!

i = Application.Match(DateSerial(UserForm2.CBoxYear.Value,
UserForm2.CBoxMonth.Value, UserForm2.CBoxDay.Value) * 1, [B:B], 1)

sauf que ... bon j'abuse, mais ...

j'ai un premier tableau des lignes 1 à 200, rempli jusqu'à la ligne 100
environ puis du blanc, les dates sont chronologiques et vont de 1998 à 2005
ensuite j'ai un second tableau en dessous, même type de données, avec une
extrapolation sur les 12 derniers mois, soit 12 lignes de août 2003 à
juillet 2004

tant que je choisis une date inférieure à août 2003, no bug, mais si je
choisis une date supérieure à août 2003, il ne me choisit plus la date la
plus proche, en absolu, mais la plus proche dans le second tableau (ex. : je
demande le 20/07/2004, je devrais trouver le 18/07/2004 du premier tableau,
mais il me retourne le 30/06/2004 du second tableau)

bien sûr, je peux déplacer mon second tableau, mais il y a déjà pas mal de
programmation dessus, des graphes associés sur d'autres feuilles, etc ...

est-il possible de faire un [B:B] en excluant une série de lignes ?
ou y a-t-il une autre solution ?

encore merci pour l'aide
Llew
Avatar
AV
est-il possible de faire un [B:B] en excluant une série de lignes ?


Tu peux changer la plage d'examen en fonction de la date mais bon.. comme je ne
perçois pas très bien la logique de ton organisation

AV

1 2