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
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
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
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 ?
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
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
Ca je l'avais deviné...
;-) (Et yé m'en doutais un peu)
"AV" <alain.vallon@wanadoo.fr> a écrit dans le message de
news:e5nwxumcEHA.1644@tk2msftngp13.phx.gbl...
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
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
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
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
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
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
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
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
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
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, ç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
** 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 !
** 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 !
** 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
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
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 ?
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
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
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