VBA Excel - 访问查询不可更新

Posted

技术标签:

【中文标题】VBA Excel - 访问查询不可更新【英文标题】:VBA Excel - Access Query not updateable 【发布时间】:2017-06-07 15:34:36 【问题描述】:

我在尝试通过 Excel 中的 VBA 运行查询时遇到错误。

错误:

运行时错误“3073”: 操作必须使用可更新的查询。

我有一个从 Excel 中的一个表中获取数据的查询。

qryAllData:

SELECT ID, Field1 AS [Date], Field9 AS [Alarm Init], Field5 AS [Alarm End], CVDate(Field2) AS [Time]
FROM [Jet Info]
WHERE (Field3 LIKE 'ALARM' OR Field8 LIKE 'ALARM:') AND Field5 NOT LIKE 'Program' AND (Field9 NOT LIKE 'Program' OR ISNULL(Field9));

我原本是在 Excel 中直接引用此查询,但仍然收到上述错误,因此我尝试改为引用该查询。

qrySelData:

SELECT DISTINCTROW TOP 1 a.*
FROM [Process Info] AS a, [Complete Data] AS b
WHERE (((a.Date) Not In (SELECT [Date] FROM [Complete Data])) AND ((a.[Start Time]) Not In (SELECT [Start Time] FROM [Complete Data])));

这是我的 VBA 代码:

 Private Sub CommandButton1_Click()
     Refresh_Data
     Dim objAccess As Object

     Set objAccess = GetObject("C:\Users\******\Documents\Database21.accdb")

     objAccess.Visible = False

     objAccess.DoCmd.OpenQuery ("qrySelData")

     objAccess.Quit
     Set objAccess = Nothing
 End Sub

在 VBA 中运行子程序会在 objAccess.DoCmd.OpenQuery ("qrySelData") 行上引发错误 3072。

任何帮助将不胜感激 - 如果您需要更多信息,请告诉我。

【问题讨论】:

看起来问题出在连接中:***.com/questions/170578/… 这里有一些不同的建议——一个是插入临时表,然后从中选择。这似乎对你有用。 @JacobH 所以不是引用查询,我应该为qryAllData 创建一个虚拟表以插入然后用qrySelData 引用它? @JacobH 我还是有问题。所以我有一个正在引用的临时表;如何执行用于将数据粘贴到临时表中的查询?这似乎是我目前的主要问题。 您的总体目标是什么?你没有在任何地方提到它。经典XY problem。不要只告诉我们您尝试的 Y 解决方案,而是告诉我们您的 X 问题 【参考方案1】:

第一个查询不可更新,因为您在选择列列表中使用函数 (cvdate)。删除此列或函数,它应该可以工作。

第二个查询(似乎完全不同)在[Process Info][Complete Data] 之间缺少连接条件。这意味着 Access 尝试生成 carthesian 乘积并且根本没有足够的内存......

乍一看,我会在第二个查询中说,您应该从 FROM 子句中删除 [Complete Data](如果您仍然不加入这些表)。

【讨论】:

以上是关于VBA Excel - 访问查询不可更新的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 VBA 更新 Excel 工作簿 Web 查询连接字符串?

操作必须使用可更新查询/SQL - VBA

使用 VBA 访问更新查询

如何在文件夹而不是 Excel VBA 中的 CurrentDB 中定义访问数据库的路径?

Excel、VBA、PowerPivot、DataFeed 连接 - 更新文件路径

Excel 数据到 Access DB - 获取:操作必须使用可更新查询错误