【问题标题】:dynamically delete a row from every table inside for loop in access vba在访问vba中从for循环内的每个表中动态删除一行
【发布时间】:2018-09-05 23:36:28
【问题描述】:

我正在尝试将放置在文件夹中的 excel 文件与 access 数据库中存在的表(与我的 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 子句中的语法错误。

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

提前致谢。

【问题讨论】:

  • strTable 的值是多少?
  • 您的数据库表名中是否包含空格?如果是,则在 [ strTable ](方括号)中添加您的数据库名称。从哪里获得规范 ID?我在这里找不到任何整数变量..
  • @VincentG : strTable 与 strFile 相同,但扩展名为 .xlsx。
  • 不带括号的表名可能由于空格而无效的原因有很多。只需将它括起来,就像 Tarun P 说的那样,应该避免大多数(但不是全部)可能的无效表名。
  • 试试这个DoCmd.RunSQL ("DELETE * FROM [" & strTable & "] WHERE SPEC_ID = 'Specification ID'")

标签: ms-access vba


【解决方案1】:

使用DoCmd.SetWarnings 会带来麻烦。如果 sql 中有错误并且您的代码在没有将警告设置回 true 的情况下退出怎么办?各种奇怪的事情发生。而是使用更简单的方法

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

您仍然需要检查 strTable 的名称中是否没有 [](否则括号将无效),您需要删除它们或转义它们(取决于关于实际表的命名方式)。

【讨论】:

  • 谢谢@Brad。它不会在每个表中执行删除之前给我一个弹出窗口,因为我正在执行此操作的表有近 30 个。抱歉,现在是深夜,我只是懒得问这个问题。 ;) 我写了一个 Python 脚本帖子,我称之为这个脚本,所以我确信除了这些之外没有其他表会包含包含“规范 ID”的多行
  • 使用CurrentDb.Execute 在插入/删除/更新数据时不会显示弹出窗口。第二个好处:您也可以在之后立即拨打CurrentDb.RecordsAffected查看删除了多少条记录。好像你知道只有一个,但你可以用这个来确认。
  • 你是从 Python 调用这个?
  • 哇,如果您可以使用命令检查日志,那真是太棒了。非常感谢。我会在明天早上检查这是否运行并让你知道。 :) 非常感谢您抽出宝贵时间回复。我很少使用 vba,我只是搜索和编辑我找到的任何内容。感谢您让我知道这一点,我有一个更清晰的概念。是的,在我从 Python 获得一些数据后,我正在执行此操作。不完全整合它。但是,您也可以通过 Python 调用 vba 脚本。 :)
  • 嗨@Brad我测试了这个并且它工作正常。 :) 非常感谢。
【解决方案2】:

这样做

Docmd.SetWarnings False

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

Docmd.SetWarnings True

【讨论】:

  • 非常感谢。上帝祝福你。 :)
  • 下面提供的答案使用起来更安全,以防万一任何用户想要复制粘贴此代码。因此将接受的答案更改为以下答案。但感谢您的帮助。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 2021-09-26
相关资源
最近更新 更多