XL 2019 date

RichardS

XLDnaute Junior
Bonjour,
Je mets à jour périodiquement un tableau des taux de change financier. Dans la liste, il y a des trous car les bourses ne fonctionnent pas tous les jours. Lorsque je veux convertir un taux, je recherche par match la date correspondante dans le tableau. Si la date n'existe pas, je souhaite prendre la date immédiatement inférieure. Par exemple, si la date recherchée est le 4/09/2021, la recherche doit me donner le 3/09/2021.
Ma recherche via match, qui fonctionne habituellement me sort une erreur 2042. J'ai chercher dans Excel-download une solution et j'ai trouvé la suivante :
Dim Lig%
On error resume next
Lig=Application.match([E2],[B:B],0)
if Lig=0 then exit sub
cells(Lig+16,"A").select
Je l'ai essayée et cela ne fonctionne toujours pas mais cela m'amène à plusieurs questions :
1) Pourquoi des crochets [ ] sur les arguments E2 et B:B, à quoi cela sert-il ?
2) Comme vous le voyez sur mes différents essais, j'obtiens toujours une erreur 2042 sauf pour Lig1 qui est 2 alors qu'il devrait donner 5. Pourquoi ?
3) Dans mon fichier d'origine, ci-joint, les dates de la colonne A étaient données avec minutes et secondes alors que mon argument de recherche n'en comporte pas. Cela a t-il une incidence sur la recherche ? Dans le doute, sur mon exemple, j'ai supprimé les minutes et secondes. Et cela ne fonctionne pas. J'aurai bien sur préféré ne pas avoir à le faire. Y a t-il une solution ?
ET SURTOUT comment faire pour que ma recherche fonctionne et que si l'argument n'existe pas, qu'il me donne la date immédiatement inférieure ?
Merci pour votre réponse car je boucle dessus depuis hier.
 

Pièces jointes

  • Exemple.xlsm
    42.4 KB · Affichages: 5
  • Résultat.docx
    267.5 KB · Affichages: 2

chris

XLDnaute Barbatruc
Bonjour

J'avoue ne pas comprendre ton problème

Dans le mesure où les dates sont chronologiques, en mettant ta plage de taux de change sous forme de tableau structuré nommé Tab_Change, un simple INDEX+EQUIV fonctionne : ici avec la colonne cloture

1652943872627.png


Si tes dates comportent un horaire tu peux
  • soit dupliquer la colonne date en récupérant sa valeur entière pour l'utiliser en lieu et place de la 1ère,
  • soit faire la recherche avec cette formule
    VB:
    =INDEX(Tab_Change[cloture];EQUIV(I3+86399/86400;Tab_Change[Date];1))
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour RicharS, chris,

1) Les crochets permettent d'évaluer une expression (ou une référence de plage) comme le fait la fonction Evaluate.

2) Les variables repérant des lignes peuvent dépasser 32767, déclarez-les As Long (&).

3) Avec Application.Match ou VLookup il faut convertir les dates en type Long :
VB:
Sub test()

Dim Dat As Long, Lig0&, Lig1&, Lig2&, Lch2#, Lch3#, LchX&, LchY&, LchZ&
Dat = DateValue("4/9/21")

On Error Resume Next
Lig0 = Application.Match(Dat, [A:A], 0): MsgBox "Lig0 = " & Lig0
Lig1 = Application.Match(Dat, [A:A], -1): MsgBox "Lig1 = " & Lig1
Lig2 = Application.Match(Dat, [A:A], 1): MsgBox "Lig2 = " & Lig2

Lch2 = Application.VLookup(Dat, Range(Cells(3, 1), Cells(50, 7)), 3, True): MsgBox "Lch2 = " & Lch2
Lch3 = Application.VLookup(Dat, Range(Cells(3, 1), Cells(50, 7)), 3, False): MsgBox "Lch3 = " & Lch3
LchX = Application.Match(Dat, Range(Cells(3, 1), Cells(50, 1)), -1): MsgBox "LchX = " & LchX
LchY = Application.Match(Dat, Range(Cells(3, 1), Cells(50, 1)), 0): MsgBox "LchY = " & LchY
LchZ = Application.Match(Dat, Range(Cells(3, 1), Cells(50, 1)), 1): MsgBox "LchZ = " & LchZ

End Sub
A+
 

Pièces jointes

  • Exemple(1).xlsm
    35.8 KB · Affichages: 2

RichardS

XLDnaute Junior
Bonjour RicharS, chris,

1) Les crochets permettent d'évaluer une expression (ou une référence de plage) comme le fait la fonction Evaluate.

2) Les variables repérant des lignes peuvent dépasser 32767, déclarez-les As Long (&).

3) Avec Application.Match ou VLookup il faut convertir les dates en type Long :
VB:
Sub test()

Dim Dat As Long, Lig0&, Lig1&, Lig2&, Lch2#, Lch3#, LchX&, LchY&, LchZ&
Dat = DateValue("4/9/21")

On Error Resume Next
Lig0 = Application.Match(Dat, [A:A], 0): MsgBox "Lig0 = " & Lig0
Lig1 = Application.Match(Dat, [A:A], -1): MsgBox "Lig1 = " & Lig1
Lig2 = Application.Match(Dat, [A:A], 1): MsgBox "Lig2 = " & Lig2

Lch2 = Application.VLookup(Dat, Range(Cells(3, 1), Cells(50, 7)), 3, True): MsgBox "Lch2 = " & Lch2
Lch3 = Application.VLookup(Dat, Range(Cells(3, 1), Cells(50, 7)), 3, False): MsgBox "Lch3 = " & Lch3
LchX = Application.Match(Dat, Range(Cells(3, 1), Cells(50, 1)), -1): MsgBox "LchX = " & LchX
LchY = Application.Match(Dat, Range(Cells(3, 1), Cells(50, 1)), 0): MsgBox "LchY = " & LchY
LchZ = Application.Match(Dat, Range(Cells(3, 1), Cells(50, 1)), 1): MsgBox "LchZ = " & LchZ

End Sub
A+
Merci pour votre réponse.
Tout d'abord les crochets dont je découvre l'utilisation et qui m'ont l'air bien pratique, il faudra que je creuse un peu.

Concernant les minutes et secondes, je n'en aurait pas besoin dans le reste de l'application donc autant les éliminer d’emblée en prenant l'entier de la date.

Et puis et surtout, quand on se perd dans la complexité d'un problème, on perd de vue l'essentiel. Il n'y avait pourtant que 3 possibilités dans le dernier argument de la fonction Match (-1,0 ou 1) et je l'ai mal testé.

J'ai testé l'ensemble de mon programme avec Lig = Application.Match(Dat, [A:A], 1) et cela fonctionne.

Un grand merci
 

Discussions similaires

Statistiques des forums

Discussions
312 103
Messages
2 085 312
Membres
102 860
dernier inscrit
fredo67