我的计划的一般解释:
问题: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)
行
对此的任何建议都将受到高度赞赏。
答案 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]));