1

当非 vba 宏将查询内容导出到 Excel 时,MS Access 会随机删除 SQL 查询的内容。初始导出工作正常,数据正确导出到 Excel,但随后(大约 50% 的时间......)查询基础的 SQL 丢失了。这肯定是由导出触发的(可以对查询进行前后比较)。

以下站点引用了该问题并讨论了自动重建 SQL 查询的 VBA 解决方案。我更愿意阻止这种情况发生,而不是事后修复它。bytes.com 上的这个论坛帖子也讨论了这个问题。建议的解决方案不相关。

问题数据库最初是在 Access 2007 中设计的,现在在 Access 2010 中使用。此问题中涉及的所有查询和宏都是使用 Access 2007 创建的。这些组件在 Access 2007 中是稳定的。这使我相信问题不包含在 SQL 中。所有的 SQL 查询都是简单的 SELECT 语句,没有插入、删除或生成表命令。

4

5 回答 5

2

我自己也遇到过这个错误。此处发布的解决方案均不适用于/不适用于我的情况,而且我对提供的解决方法不是 100% 满意,尤其是 geeksengine.com 解决方法,它要求您完全删除查询并重新创建它您存储在 VBA 中的代码 - 这不是一个非常通用的解决方案,如果其他人必须维护您的数据库,他们会发现自己困惑地发现他们更改的查询偶尔会恢复到其旧代码,似乎是随机的。

所以我采取了不同的方法,并编写了一个通用例程,在导出电子表格之前存储查询的 SQL 代码,然后如果代码被删除,则立即恢复代码:

Sub SafeSendQuery(QueryName As String, FileType As Variant, EmailAddresses As String, SubjectLine As String, BodyText As String)

Dim QueryCode As String

'Access has a bug where it sometimes erases the SQL code of the Query it's sending as a spreadsheet
'This stores the code in a string, so that we can restore it if it's been erased
QueryCode = CurrentDb.QueryDefs(QueryName).SQL

DoCmd.SendObject ObjectType:=acSendQuery, ObjectName:=QueryName, OutputFormat:=FileType, To:=EmailAddresses, Subject:=SubjectLine, MessageText:=BodyText, EditMessage:=True

'If the SQL code was erased, restore it
If CurrentDb.QueryDefs(QueryName).SQL <> QueryCode Then
    Debug.Print "SQL Code Missing, restoring it now."
    CurrentDb.QueryDefs(QueryName).SQL = QueryCode
End If

End Sub

请注意,我为 编写了此代码DoCmd.SendObject,因为我的用户需要通过电子邮件发送电子表格,但它应该同样适用DoCmd.OutputTo- 只需将DoCmd.SendObject行替换为DoCmd.OutputTo1,并根据需要修改参数。

这是调用它的子程序的样子:

Sub EmailAQuery()

Dim QueryName As String
Dim FileType As Variant
Dim EmailAddresses As String
Dim SubjectLine As String
Dim BodyText As String

QueryName = "Quarterly Figures"
FileType = acFormatXLSX
EmailAddresses = "bob@company.com; Sally@company.com"
SubjectLine = "Quarterly Figures for " & Format(Date, "mmmm yyyy")
BodyText = "Please see the Quarterly figures data for " & Format(Date, "mmmm yyyy") & ", attached."

Call SafeSendQuery(QueryName, FileType, EmailAddresses, SubjectLine, BodyText)

End Sub
于 2018-08-02T08:50:27.353 回答
1

我通过修改查询解决了这个问题。最初,查询通过内连接和外连接连接三个表。我通过使用中间表将查询简化为一个连接,之后 Access 在运行宏后停止删除查询。这绝对是一个错误,当它的宏的任务是运行具有复杂连接的查询时,Access 会阻塞。

于 2014-06-09T18:41:20.583 回答
1

您是否尝试使用表达式生成器以访问语言表示查询?

双击查询设计窗口中的“条件”,并构建表达式。

例如:

SELECT table1.field1 
FROM table1 INNER JOIN table2 on table1.field1 LIKE table2.field1

该查询将被清除,即使它有效。使用表达式构建器构建“LIKE”表达式。它应该如下所示:

SELECT table1.field1 
FROM table1 INNER JOIN table2 on table1.field1 = table2.field1
WHERE ((([table1]![field1] LIKE [table2]![field1])));
于 2013-08-12T19:49:58.387 回答
1

我在 Access 2010 中遇到了同样的问题。我能够通过在宏中使用OpenQuery操作之前的ExportWithFormatting操作和CloseWindow – Query操作之后的操作来解决它。ExportWithFormatting这样,查询将在同一个宏中打开、导出、然后关闭。最后我还使用了一个StopMacro动作。

于 2016-04-28T23:21:43.670 回答
0

我在 Access 2010 中遇到了这个问题。对我来说,这是由仅当我在一个组中收集这些查询时才会出现的错误引起的。一旦我将它们从自定义组中删除并将它们保留为未分配的对象,查询就会保持不变。

于 2014-06-25T07:18:27.337 回答