我們要求在訪問查詢傳遞參數值 -使用VBA
我們有幾個供應商,我們希望產生當月出口過程中從每個供應商採購,以卓越的月度報告。我認爲解決方案是創建一個參數查詢,我可以傳遞供應商ID,月份和年份的值。供應商名單不斷變化,並存儲在一個單獨的表格中。 因此,基本上,我應該能夠順序讀取該表中的供應商ID並將其作爲參數傳遞給我的查詢以生成該供應商的報告。
最接近的解決方案,我找到了我的要求是(這在本質上是相似的) -
Exporting Recordset to Spreadsheet
爲什麼我認爲有可能是一個更好的解決方案 -
在建議的解決方案中,我們正在創建多個查詢和d選擇這些。從概念上講,我覺得應該有一種方法來創建參數查詢,並使用do while循環將參數的值(上例中的DeptName)順序傳遞給查詢並將結果導出爲excel。
我應該能夠實現這一點,如果我可以使用vba將值傳遞給參數查詢。這是我還沒有弄清楚的。
更新在24月 -
以下是我寫的代碼 -
Private Sub Monthly_Supplier_Sales_Report_Click()
Dim strDirectoryPath As String
Dim DateFolderName As String
DateFolderName = Format$((DateSerial(year(Date), month(Date), 1) - 1), "YYYY MM")
strDirectoryPath = "C:\dropbox\Accounting\Sales Reports\" & DateFolderName
If Dir(strDirectoryPath, vbDirectory) = "" Then MkDir strDirectoryPath
Dim Filename As String
Dim strSQL1 As String
Dim strSQL2 As String
Dim DesignerCode As String
Dim month1 As String
Dim year1 As Integer
Dim Query1 As DAO.QueryDef
Dim query2 As DAO.QueryDef
Dim rsDesigner As DAO.Recordset
Set rsDesigner = CurrentDb.OpenRecordset("Designer Details Master")
Do While Not rsDesigner.EOF
DesignerCode = rsDesigner![Designer Code]
month1 = "Jan" 'right now hardcoded, will call this programatically
year1 = 2014 'right now hardcoded, will call this programatically
strSQL1 = "SELECT * FROM [Sales Report Generation Data] WHERE [designer code] = '" & DesignerCode & "' AND [Shipping Month]= '" & month1 & "' AND [Shipping Year]=" & year1
strSQL2 = "SELECT * FROM [Sales Report Generation - Monthwise Inventory Snapshot] WHERE [designer code] = '" & DesignerCode & "' AND [Snapshot Month]= '" & month1 & "' AND [Snapshot Year]= " & year1
Set Query1 = CurrentDb.CreateQueryDef(Name:="TempSalesQuery", SQLText:=strSQL1)
Set query2 = CurrentDb.CreateQueryDef(Name:="TempInventoryQuery", SQLText:=strSQL2)
Filename = strDirectoryPath & "\" & DesignerCode & Format$(Now(), " yyyy mm") & ".xls"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "TempSalesQuery", Filename, False, "Sales Report"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "TempInventoryQuery", Filename, False, "Inventory"
CurrentDb.QueryDefs.Delete "TempSalesQuery"
CurrentDb.QueryDefs.Delete "TempInventoryQuery"
rsDesigner.MoveNext
Loop
End Sub
相反,我想申請的邏輯是 -
Do While Not
assign Value to Parameter 1 = rsDesigner![Designer Code]
assign Value to Parameter 2 = Month1
assign Value to Parameter 3 = Year1
Run the two Parameter queries, for which about three parameters are the input value and export to excel in respective sheets.
Loop
只是,我還沒有弄清楚 - 如何實現這一目標。
不知道或多遠沿着你,如果你是舒適與您發佈的鏈接中列出的步驟,但這裏是我的建議。(1)用(a)12個月的列表框創建一個簡單的表格; (b)列表框多年; (c)供應商列表框/組合框**如果您總是想要爲所有供應商運行報表,請省略; (d)命令按鈕提交報告; (e)在按鈕點擊事件中添加VBA代碼以從列表框/組合框中選擇值以創建記錄集的過濾器,然後打開通過過濾器的報告。如果您對這種方法感興趣,我可以添加更多關於如何完成的細節。 –
我已經能夠根據兩個鏈接中給出的解決方案編寫代碼並獲得所需的結果。但只是我覺得應該有更好的解決方案。即使在你的建議中,我想知道爲什麼我們需要創建表單來獲取價值,因爲我的計劃是使用它在每個月的四分之一/五上運行,以獲取所有供應商上個月的報告。因此,理想情況下,我們應該能夠使用vba代碼定義月份,年份和供應商的價值。 –
當然你可以讓它自動運行 - 我只是想你可能希望隨時隨地運行報告的靈活性 - 如果你只需要那個選定的供應商的話。查詢(如附加鏈接所示)不需要刪除 - 您可以使用查詢來查看「TransferSpreadsheet」(至少在Office 2010及更高版本中)。你應該讓你的查詢接受日期和供應商的參數(或函數)(除非你想要所有供應商),那麼只需在VBA中設置參數。 –