访问VBA:添加'文件名'导入多个文件时的字段

时间:2016-12-14 04:19:37

标签: sql vba ms-access access-vba

我有一些工作代码循环遍历一个包含Excel文件的文件夹,并将每个表中的表导入Access表。我尝试做的只是在表的末尾添加一个名为 FileName 的字段,该字段具有源Excel文件的名称。

我做了一些谷歌搜索并找到了这个解决方案: 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个参数。感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

调整您的SQL查询,您的不包含参数。

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

答案 1 :(得分:1)

添加 FileName 字段与更新其值明显不同。因此,您需要两个SQL操作查询:ALTERUPDATE语句。

具体来说,查询需要两个引擎未知的组件: FileName 列和 [pFileName] 参数值。很可能,您的Excel工作表没有将 FileName 列导入 Test 表。

考虑以下设置在循环中使用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