OpenRecordset和Eval()

时间:2017-10-26 21:34:19

标签: vba forms ms-access input parameters

我的计划的一般解释:

  1. 我在表单上引用控件以供用户输入。 (开始日期ex) 2017年8月1日至2017年8月31日结束日期)
  2. 然后我的查询基于参数运行并返回单个值:ex)12345.23
  3. 运行VBA功能。
  4. 问题:querydef对之前打开的查询一无所知。因此,我想在VBA中提供参数,但从这一点来说我一无所知:

    Set qry = CurrentDb.QueryDefs("2_Total")
    Set rst = qry.OpenRecordset
    For Each prm In qry.Parameters
        prm.Value = Eval(prm.Value)
    Next
    

    我的SQL代码:

    SELECT Sum(dbo_SO_SalesHistory.DollarsSold) AS SumOfDollarsSold
    FROM dbo_SO_SalesHistory
    HAVING (((dbo_SO_SalesHistory.InvoiceDate) Between [Forms]![RUN]![textBeginOrderDate] And [Forms]![RUN]![textendorderdate]));
    

    以下是完整代码:

    Option Compare Database
    
    Option Explicit
    Public Function TRANS2()
    
        Dim xlApp As Excel.Application
        Dim xlWB As Excel.Workbook
        Dim xlWS As Excel.Worksheet
        Dim acRng As Variant
        Dim xlRow As Integer
    
        Dim qry As QueryDef
        Dim rst As Recordset
        Dim prm As DAO.Parameter
        Set xlApp = New Excel.Application
        Set xlWB = xlApp.Workbooks.Open("C:\Users\J\Desktop\August 2017.xlsx")
        Set xlWS = xlWB.Worksheets("Totals")
    
        xlRow = (xlWS.Columns("K").End(xlDown).Row)
        Set qry = CurrentDb.QueryDefs("2_Total")
        Set rst = qry.OpenRecordset
        For Each prm In qry.Parameters
            prm.Value = Eval(prm.Value)
        Next
    
        Dim c As Integer
        c = 11   'C is the one that stores column number, in which c=1 means column A, 11 is for column K, 12 for Column L
        xlRow = xlRow + 11
    
         Do Until rst.EOF
            For Each acRng In rst.Fields
                xlWS.Cells(xlRow, c).Formula = acRng
                c = c + 1
            Next acRng
            xlRow = xlRow + 1
            c = 1
            rst.MoveNext
            If xlRow > 25 Then GoTo rq_Exit
        Loop
    
    
    rq_Exit:
        rst.Close
        Set rst = Nothing
        Set xlWS = Nothing
        xlWB.Close acSaveYes
        Set xlWB = Nothing
        xlApp.Quit
        Set xlApp = Nothing
        Exit Function
    
    End Function
    

    P.S。我可以将单元格设置为DSum()返回的值,但我想按照我的方式进行操作。 我的好参考是https://msdn.microsoft.com/en-us/library/office/ff193967.aspx

      

    编辑:

    Set qry = CurrentDb.QueryDefs("2_Total")
    
    For Each prm In qry.Parameters
        prm.Value = Eval(prm.Value)
    Next
    Set rst = qry.OpenRecordset
    

    我在For Each之后移动了Set rst = qry.OpenRecordset,现在我已经

      

    您输入的表达式包含无效的语法。

    prm.Value = Eval(prm.Value)行 对此的任何建议都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

您的SQL查询在语法上是错误的。如果没有HAVING子句,则不能使用GROUP BY子句。我认为您需要使用WHERE子句,如下所示:

SELECT Sum(dbo_SO_SalesHistory.DollarsSold) AS SumOfDollarsSold
FROM dbo_SO_SalesHistory
WHERE (((dbo_SO_SalesHistory.InvoiceDate) Between [Forms]![RUN]![textBeginOrderDate] 
And [Forms]![RUN]![textendorderdate]));