动态从访问vba

时间:2018-09-05 07:42:54

标签: vba ms-access access-vba

我试图将放置在文件夹中的excel文件与访问数据库中存在的表(与我的excel文件同名)进行匹配,并尝试导入excel中可以访问的数据。

Sub import()

Dim blnHasFieldNames As Boolean
Dim strWorksheet As String, strTable As String
Dim strPath As String, strPathFile As String

blnHasFieldNames = True


strPath = "D:\PersonalData\working_table\"

strWorksheet = "Sheet1"

' Import the data from each workbook file in the folder
strFile = Dir(strPath & "*.xlsx")
Do While Len(strFile) > 0
      strPathFile = strPath & strFile
      strTable = Left(strFile, InStrRev(strFile, ".xlsx") - 1)

      DoCmd.TransferSpreadsheet acImport, _
            acSpreadsheetTypeExcel9, strTable, strPathFile, _
            blnHasFieldNames, strWorksheet & "$"

      DoCmd.RunSQL ("DELETE * FROM " & strTable & " WHERE SPEC_ID = 'Specification ID'")



      strFile = Dir()
Loop



End Sub

我能够成功地将数据获取到我的访问数据库表中,但是我的要求是从所有此类表中的行SPEC_ID = 'Specification ID'中删除该行。我在一行中遇到错误:

DoCmd.RunSQL ("DELETE * FROM " & strTable & " WHERE SPEC_ID = 'Specification ID'")

其中指出:

运行时错误:“ 3131” FROM子句中的语法错误。

请指导我可能做错了什么。

谢谢。

2 个答案:

答案 0 :(得分:2)

使用DoCmd.SetWarnings是麻烦的秘诀。如果sql中出现错误,并且您的代码退出而未将警告设置回true,该怎么办?各种各样奇怪的事情发生。而是使用更简单,一样简单的

CurrentDb.Execute "DELETE * FROM [" & strTable & "] WHERE SPEC_ID = 'Specification ID'"

您仍然需要检查strTable的名称中没有[](否则,包围将无效),并且您需要删除它们或对其进行转义(取决于您的实际表的命名方式)。

答案 1 :(得分:0)

这样做

Docmd.SetWarnings False

DoCmd.RunSQL ("DELETE * FROM [" & strTable & "] WHERE SPEC_ID = 'Specification ID'")

Docmd.SetWarnings True