2016-04-06 1 views
0

J'ai ouvert une nouvelle connexion ADODB et définir un nouveau jeu d'enregistrements qui ont des dates dans le premier champ et des valeurs dans le deuxième champ.Excel VBA, connexion ADO, renvoie la date si elle existe ou la date disponible précédente

  • 01/01/2016
  • 02/01/2016
  • 04/01/2016
  • 05/01/2016

Je vais construire la fonction myfunction(mydate) qui devrait renvoyer la date disponible maximale qui est égale ou inférieure (plus tôt) à mydate:

myfunction(mydate as date) 
Dim CurrentDate as Date 

Set rst = cn.Execute("SELECT * FROM tbl1 ORDER BY dates;") 
CurrentDate = worksheetfunction.INDEX(rst.Fields(0),worksheetfunction.MATCH(CDate(CurrentDate),rst.Fields(0), 1)) 

myfunction = CurrentDate 
end function 

Les résultats devraient être

  • myfunction ("01/02/2016") = 01/02/2016
  • myfunction ("01/03/2016") = 02/01/2016

Cela fonctionne sur Excel Speadsheet, mais il donne une erreur "Impossible d'obtenir la propriété Match de WorksheetFunction". Existe-t-il un autre moyen d'obtenir le résultat en utilisant ce tableau?

+0

Vous pouvez utiliser une clause WHERE dans votre SQL? Et peut-être un TOP? –

+0

Le problème est que le jeu d'enregistrements devrait être utilisé pour plusieurs fonctions, donc je ne peux pas utiliser WHERE .. Ceci est la version courte de mon code. –

+0

En ce moment, vous ne passez qu'une seule valeur (Fields (0) en tant que second paramètre de Match où un tableau de valeur est attendu, c'est peut-être pourquoi le message –

Répondre

1

Vous pouvez essayer si vous faites plusieurs enregistrements:

Function myfunction(mydate as date) as date 
    Dim CurrentDate as Date 
    Set rst = cn.Execute("SELECT TOP 1 * FROM tbl1 WHERE (dates<=" & Format(mydate, "#mm/dd/yyyy#") & ") ORDER BY tbl1.dates DESC;") 
    if not rst.EOF then 
     CurrentDate = rst.Fields(0) 
    else 
     'No record found 
    endif 
    myfunction = CurrentDate 
end function 
+0

C'est bon .. Merci !!! –

+0

Mais j'ai une question: si j'ouvre une connexion et que j'exécute tout le jeu d'enregistrements, et que j'utilise le filtre en fonction, est-ce que ce serait plus rapide que si j'exécute des données à chaque fois? –

0

Vous pouvez essayer la méthode de recherche recordset:

rst.movefirst 
rst.find "datecolumnname >= " & mydate 
If rst.BOF = false then 
    myfunction = rst.fields(0) 
Else 
    Set myfunction = nothing 
Endif 
+0

La méthode 'Find' veut que la capacité soit reculée, ce qui donne une erreur" Rowset ne supporte pas le défilement arrière ", bien que j'aie mis le jeu d'enregistrements en mode dynamique:' rst.CursorType = adOpenDynamic' –