3

我們要求在訪問查詢傳遞參數值 -使用VBA

我們有幾個供應商,我們希望產生當月出口過程中從每個供應商採購,以卓越的月度報告。我認爲解決方案是創建一個參數查詢,我可以傳遞供應商ID,月份和年份的值。供應商名單不斷變化,並存儲在一個單獨的表格中。 因此,基本上,我應該能夠順序讀取該表中的供應商ID並將其作爲參數傳遞給我的查詢以生成該供應商的報告。

最接近的解決方案,我找到了我的要求是(這在本質上是相似的) -

Exporting Recordset to Spreadsheet

http://answers.microsoft.com/en-us/office/forum/office_2010-customize/filtering-a-query-used-by-docmdtransferspreadsheet/06d8a16c-cece-4f03-89dc-89d240436693

爲什麼我認爲有可能是一個更好的解決方案 -

在建議的解決方案中,我們正在創建多個查詢和d選擇這些。從概念上講,我覺得應該有一種方法來創建參數查詢,並使用do while循環將參數的值(上例中的DeptName)順序傳遞給查詢並將結果導出爲ex​​cel。

我應該能夠實現這一點,如果我可以使用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 

只是,我還沒有弄清楚 - 如何實現這一目標。

+0

不知道或多遠沿着你,如果你是舒適與您發佈的鏈接中列出的步驟,但這裏是我的建議。(1)用(a)12個月的列表框創建一個簡單的表格; (b)列表框多年; (c)供應商列表框/組合框**如果您總是想要爲所有供應商運行報表,請省略; (d)命令按鈕提交報告; (e)在按鈕點擊事件中添加VBA代碼以從列表框/組合框中選擇值以創建記錄集的過濾器,然後打開通過過濾器的報告。如果您對這種方法感興趣,我可以添加更多關於如何完成的細節。 –

+0

我已經能夠根據兩個鏈接中給出的解決方案編寫代碼並獲得所需的結果。但只是我覺得應該有更好的解決方案。即使在你的建議中,我想知道爲什麼我們需要創建表單來獲取價值,因爲我的計劃是使用它在每個月的四分之一/五上運行,以獲取所有供應商上個月的報告。因此,理想情況下,我們應該能夠使用vba代碼定義月份,年份和供應商的價值。 –

+0

當然你可以讓它自動運行 - 我只是想你可能希望隨時隨地運行報告的靈活性 - 如果你只需要那個選定的供應商的話。查詢(如附加鏈接所示)不需要刪除 - 您可以使用查詢來查看「TransferSpreadsheet」(至少在Office 2010及更高版本中)。你應該讓你的查詢接受日期和供應商的參數(或函數)(除非你想要所有供應商),那麼只需在VBA中設置參數。 –

回答

0

下面是一個解決方案。請注意,我創建了兩個查詢將使用的函數。 只需創建兩個查詢並保存它們(請參閱下面的示例SQL),添加代碼以挑選日期,一切都應該沒問題。

Option Compare Database 
Option Explicit 

Dim fvShipMonth  As String 
Dim fvShipYear  As Integer 
Dim fvDesignerCode As String 

Public Function fShipMonth() As String 
    fShipMonth = fvShipMonth 
End Function 

Public Function fShipYear() As Integer 
    fShipYear = fvShipYear 
End Function 

Public Function fDesignerCode() As String 
    fDesignerCode = fvDesignerCode 
End Function 

Private Sub Monthly_Supplier_Sales_Report_Click() 
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 rsDesigner As DAO.Recordset 

'SAMPLE SQL 
'SELECT * FROM [Sales Report Generation Data] " & _ 
'WHERE [designer code] = '" & fDesignerCode() & "' AND [Shipping Month]= '" & fShipMonth() & "' AND [Shipping Year]=" & fShipYear() 

    fvShipMonth = "Jan" 
    fvShipYear = 2014 
    Set rsDesigner = CurrentDb.OpenRecordset("Designer Details Master") 
    Do While Not rsDesigner.EOF 
     fvDesignerCode = rsDesigner![Designer Code] 
     Filename = strDirectoryPath & "\" & DesignerCode & Format$(Now(), " yyyy mm") & ".xls" 
     DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "<your Query 1>", Filename, False, "Sales Report" 
     DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "<your Query 2>", Filename, False, "Inventory" 
     rsDesigner.MoveNext 
    Loop 
    rsDesigner.Close 
    Set rsDesigner = Nothing 
End Sub 
+0

嗨感謝您的解決方案。但它似乎並沒有爲我工作。其實,我花時間來弄清楚公共職能的概念等等。但是這些功能似乎沒有任何價值。我插入了一個msgbox並驗證函數返回空白/零。可能是什麼原因?難道我做錯了什麼? –

+0

我不知道你是如何實現我的建議的 - 你是否複製了所有的代碼?你的msgbox在'Sub Monthly_Supplier_Sales_Report_Click'裏面?請注意,我在22小時前編輯了我的代碼,因爲我在函數名稱後面忘記了SQL中的()。另外要小心,因爲變量名稱與函數名稱相似!以下是如何測試使用上述內容:(1)在設置fvShipMonth&fvShipYear之後放置以下msgbox:MsgBox「Mo:」&fvShipMonth&vbTab&「Yr:」&fvShipYear&vbTab&「fMo:」&fShipMonth )&vbTab&「fYr:」&fShipYear() –

+0

1.複製模塊中的公共函數,2.修改參數查詢,設置三個參數的值等於fshipmonth()等等,3.複製粘貼你的代碼, 4.更新了transferspreadsheat方法中查詢的名稱。這創建了excel文件,但都是空的。所以,在循環中創建了一個消息框 - MsgBox(fDesignerCode()&「,」&fShipMonth()&「,」&fShipYear())this returned,,0 –

-1
  1. 打開數據庫
  2. 創建一個新的模塊
  3. 將以下代碼粘貼
  4. 將光標功能TEST_MY_CODE()
  5. 按F5
  6. 裏面粘貼從結果您回覆中的直接窗口。

    Option Compare Database 
    Option Explicit 
    
    Dim fvShipMonth  As String 
    Dim fvShipYear  As Integer 
    Dim fvDesignerCode As String 
    
    Public Function fShipMonth() As String 
        fShipMonth = fvShipMonth 
    End Function 
    
    Public Function fShipYear() As Integer 
        fShipYear = fvShipYear 
    End Function 
    
    Public Function fDesignerCode() As String 
        fDesignerCode = fvDesignerCode 
    End Function 
    
    Function TEST_MY_CODE() 
        My_Click_EVENT  ' Test the code I provided 
    End Function 
    
    Private Sub My_Click_EVENT() 
    Dim month1  As String 
    Dim year1  As Integer 
    
    fvShipMonth = "Jan" 
    fvShipYear = 2014 
    Debug.Print "**** START TEST ****" 
    Debug.Print "fvShipMonth = " & fvShipMonth 
    Debug.Print "fvShipYear = " & fvShipYear 
    Debug.Print "fShipMonth() = " & fShipMonth() 
    Debug.Print "fShipYear() = " & fShipYear() 
    Debug.Print "**** END TEST ****" 
    
    End Sub