访问 VBA TransferSpreadsheet 错误 3251 操作不受支持

问题描述

我请求你们的帮助,因为我在这里面临一个非常严重的问题。 我有一个简单的代码可以将 ms access (2016\2013) 查询结果导出到多年来一直运行良好的 Excel 电子表格中。

这是代码(没有发布我在上面的所有变量定义):

 strsql = "select[query].* FROM [query] " 

Set qdf = dbs.createqueryDef("MKTShare",strsql)
DoCmd.TransferSpreadsheet acExport,acSpreadsheetTypeExcel12Xml,"MKTShare","\\path\file.xlsx",_
True,""

DoCmd.DeleteObject acQuery,"MKTShare"

给出的错误是 3251 - 此对象类型不支持操作

我尝试了两台不同的机器,一台运行 WIN10,一台运行 WIN7。结果一样。真正奇怪的是,这个问题主要出现在交叉表查询中。 “标准”选择查询没有问题。如果我将 xtabquery 转换为表,然后导出该表,没问题,但这是一个非常低效的解决方案,因为我有很多查询,其中包含循环运行的非常大的数据集。

如果我从 whithin 访问中运行查询,它会显示非常好的结果。问题在于转移电子表格方法

我不知道为什么它多年来一直像沙姆一样工作,现在它不再起作用了。这一切都发生在昨天我获得了一些 Windows 更新之后。

我尝试使用 Output to 解决方法,但它不适用于预填充的 excel 模板,因为它搞砸了要导出到的整个文件

你们能帮我解决这个问题吗?我在这里遇到了麻烦..

提前致谢...

解决方法

我昨天刚遇到这个问题。昨天安装的 Windows 更新网页中有一个线索。 Jet/ACE 似乎添加了一个新的与安全相关的注册表项,以防止连接到远程源。不知道为什么 TransferSpreadsheet 导出中的交叉表查询会受到影响(必须在传输电子表格工作的幕后),但我可以在卸载此更新的情况下成功运行我的命令。

这是更新的链接。它是在办公室安全更新 (KB4493206) 中分发的。

https://support.microsoft.com/en-us/topic/kb5002984-configuring-jet-red-database-engine-and-access-connectivity-engine-to-block-access-to-remote-databases-56406821-30f3-475c-a492-208b9bd30544

,

更新:这是 2021 年 5 月的 Office MSI 版本安全更新中引入的错误。微软知道它并正在修复错误。在 MS Answers thread 中引用 MVP Tom van Stiphout 的回答:

我收到了 MSFT 的回复。这是 A2013 和 A2016 MSI 的问题,可能会在 7 月的更新中修复。


我们有同样的问题。我进行了更多调试并设法创建了一个最小的可重现示例。显然,问题只会发生

  • 在安装了 KB4493206 的 Access 2013 中(可能在 Access 2016 MSI 中也安装了相应的 KB,但我无法验证,因为我只有 Access 2016 的 C2R 版本),
  • 当使用 DoCmd.TransferSpreadsheet
  • 导出交叉表查询时
  • 查询引用了 Access 用户界面控件。

以下是完整的重现说明:

  1. 创建一个新的 Access 数据库。

  2. 创建一个包含字段 Table1(长整型)和 ID(文本)以及以下记录的新表 MyText

    ID: 1,MyText: A
    ID: 2,MyText: B
    
  3. 创建一个带有文本框 Form1 的新空表单 Text0 并保存。

  4. 打开表单并在文本框中输入 1。按“Tab”键“保存”值并让表单保持打开状态。

  5. 使用以下 SQL 创建一个新的交叉表查询 CrosstabQuery1

     PARAMETERS [Forms]![Form1]![Text0] Long;
     TRANSFORM First(Table1.MyText) AS FirstValueOfMyText
     SELECT Table1.ID
     FROM Table1
     WHERE ((([Forms]![Form1]![Text0])=1))
     GROUP BY Table1.ID
     PIVOT Table1.ID;
    

    (是的,这种转换毫无意义,在查询中引用表单控件是不好的做法,但这只是一个最小的重现示例。)

  6. 执行交叉表查询以确认其有效。保存并关闭它。 (不要在设计视图中打开它,否则您必须修复一些不影响 SQL 的仅限设计时的事情,然后才能保存它。)

  7. 在 VBA 代码编辑器的即时窗口中执行:

     DoCmd.TransferSpreadsheet acExport,acSpreadsheetTypeExcel12Xml,"CrosstabQuery1","C:\temp\repro.xlsx"
    

预期结果:交叉表查询的结果导出到 Excel。

实际结果(在安装了 KB4493206 的 Access 2013 上):错误“3251 - 此对象类型不支持操作”

我在 Microsoft 论坛上也有 reported this bug