将参数传递给查询访问 VBA

Posted

技术标签:

【中文标题】将参数传递给查询访问 VBA【英文标题】:Pass parameters to a query Access VBA 【发布时间】:2016-10-18 17:09:55 【问题描述】:

之前有人问过这个问题。我根据我从对该主题的研究中了解到的内容调整了我的代码(如下)。但是,我的代码在下面以粗体显示。

我有一个表单 (PBCIncSum),用户可以在其中输入查询 RstName 的开始和结束日期条件。此函数用于计算查询RstName 中的数据的第 95 个百分位值。当我运行代码时,我得到一个运行时错误'3061:参数太少。预期 2. 我做错了什么?花了三天时间盯着这段代码没有任何解决方案。

Public Function PercentileRst(RstName As String, fldName As String, PercentileValue As Double) As Double
 'This function will calculate the percentile of a recordset.
 'The field must be a number value and the percentile has to
 'be between 0 and 1.
 If PercentileValue < 0 Or PercentileValue > 1 Then
    MsgBox "Percentile must be between 0 and 1", vbOKOnly
 End If
 Dim PercentileTemp As Double
 Dim dbs As DAO.Database
 Set dbs = CurrentDb
 Dim xVal As Double
 Dim iRec As Long
 Dim i As Long
 Dim RstOrig As DAO.Recordset
 Dim qdf As DAO.QueryDef
 Dim prm As DAO.Parameter

 Set qdf = dbs.QueryDefs(RstName)
 qdf.Parameters(0) = Forms!PBCIncSum!StDate
 qdf.Parameters(1) = Forms!PBCIncSum!EndDate

 For Each prm In qdf.Parameters
      prm = Eval(prm.Name)
 Next prm

 **Set RstOrig = CurrentDb.OpenRecordset(RstName, dbOpenDynaset)**
 RstOrig.Sort = fldName
 Dim RstSorted As DAO.Recordset
 Set RstSorted = RstOrig.OpenRecordset()
 RstSorted.MoveLast
 RstSorted.MoveFirst
 xVal = ((RstSorted.RecordCount - 1) * PercentileValue) + 1
 'x now contains the record number we are looking for.
 'Note x may not be     whole number
 iRec = Int(xVal)
 xVal = xVal - iRec
 'i now contains first record to look at and
 'x contains diff to next record
 RstSorted.Move iRec - 1
 PercentileTemp = RstSorted(fldName)
 If xVal > 0 Then
    RstSorted.MoveNext
    PercentileTemp = ((RstSorted(fldName) - PercentileTemp) * xVal) + PercentileTemp
 End If
 RstSorted.Close
 RstOrig.Close
 Set RstSorted = Nothing
 Set RstOrig = Nothing
 Set dbs = Nothing
 Set qdf = Nothing
 PercentileRst = PercentileTemp

结束函数

【问题讨论】:

我有一个后续问题。如何仅计算非 NULL 或非零值的百分位数? 【参考方案1】:

我做错了什么?

您正在尝试使用CurrentDb.OpenRecordset 运行查询。您已经创建了 QueryDef 对象qdf 并定义了它的参数,因此您需要使用该 QueryDef 对象的OpenRecordset 方法:

Set rstOrig = qdf.OpenRecordset

【讨论】:

戈德,感谢您的快速回复。当我按照您的建议进行操作时,它在同一行给我以下错误:运行时错误'3001':无效参数。苏尼尔。 我尝试了下面的代码,它成功了!!!谢谢你的帮助!!! :-) 设置 rstOrig = qdf.OpenRecordset()

以上是关于将参数传递给查询访问 VBA的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA - 将参数参数传递给 Sub

VBA ADO 将数组参数传递给存储过程

VBA 将日期参数传递给 SQL Server 存储过程

Excel VBA:将计算结果数组作为参数传递给函数

将函数参数传递给 sql 查询

将参数传递给子节点解析器函数