2016-12-14 64 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