2016-12-14 103 views
1

我有一些工作代碼循環遍歷一個完整的Excel文件的文件夾,並將每個表導入到Access表中。我所要做的只是在名爲的文件名的表格末尾添加一個名稱爲源Excel文件的字段。訪問VBA:導入多個文件時添加'文件名'字段

我做了一些谷歌搜索,發現此解決方案: How to add file name when importing multiple Excel files to one Access table

我試圖解決方案納入我的代碼,但是當我到達執行語句,我得到:

運行時錯誤'3061'參數太少。預計2.

我認爲問題只是與strSQL聲明和/或我在最後執行它的方式。

Public Sub Command0_Click() 

Dim strFile As String 'Filename 
Dim strFileList() As String 'File Array 
Dim intFile As Integer 'File Number 
Dim filename As String 
Dim path As String 
Dim qdf As DAO.QueryDef 

Set db = CurrentDb() 
'make the UPDATE a parameter query ... 
strSQL = "UPDATE Test SET FileName=[pFileName] WHERE FileName Is Null OR 
FileName='';" 
Set qdf = db.CreateQueryDef(vbNullString, strSQL) 

path = "C:\Users\u005984\Desktop\Test\" 

'Loop through the folder & build file list 
strFile = Dir(path & "*.xlsx") 

While strFile <> "" 
    'add files to the list 
    intFile = intFile + 1 
    ReDim Preserve strFileList(1 To intFile) 
    strFileList(intFile) = strFile 
    strFile = Dir() 
Wend 

'see if any files were found 
If intFile = 0 Then 
    MsgBox "No files found" 
    Exit Sub 
End If 

'cycle through the list of files 
For intFile = 1 To UBound(strFileList) 
    filename = path & strFileList(intFile) 
    DoCmd.TransferSpreadsheet acImport, 9, "Test", filename, True 

    'Add filename field 
    qdf.Parameters("pFileName").Value = strFileList(intFile) 
    qdf.Execute dbFailOnError 
Next intFile 

End Sub 

我是Access VBA和SQL的新手,無法弄清楚它爲什麼期待2個參數。感謝任何幫助。

+0

關閉我的頭頂,嘗試從結束移除分號strSQL查詢。除此之外,在執行之前,我很想知道'qdf.Parameters.Count'是什麼。 – DHW

回答

1

調整你的SQL查詢,你的不包含參數。

strSQL = "PARAMETERS pfilename Text (255); UPDATE Test SET FileName=[pFileName] WHERE FileName Is Null OR FileName='';" 
1

添加文件名字段比更新其值顯着不同。因此,您需要兩個SQL操作查詢:ALTERUPDATE語句。

具體而言,查詢需要由發動機是未知的兩個組成部分:文件名柱和[pFileName]參數值。很可能,您的Excel工作表沒有文件名列被導入到測試表中。

考慮採用環路內的ALTER聲明如下設置(僅在第一個迭代,因爲所有工作表追加到同一個表):

'Add filename field 
For intFile = 1 To UBound(strFileList)  
    filename = path & strFileList(intFile) 
    DoCmd.TransferSpreadsheet acImport, 9, "Test", filename, True 

    If intFile = 1 then 
     ' ALTER TABLE 
     CurrentDb.Execute "ALTER TABLE [Test] ADD COLUMN [FileName] TEXT(255)", dbFailOnError 
    End If 

    ' UPDATE TABLE (PASSING PARAM VALUE) 
    qdf.Parameters("pFileName").Value = strFileList(intFile) 
    qdf.Execute dbFailOnError 
Next intFile