【问题标题】:TransferSpreadsheet Error 3251 Operation Not SupportedTransferSpreadsheet 错误 3251 操作不支持
【发布时间】:2021-05-14 18:06:58
【问题描述】:

我有代码可以将 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 转换为表,然后导出该表,则没有问题,但这是一个非常低效的解决方案,因为我有很多查询,而且非常大的数据集在循环中运行。

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

它发生在昨天一些 Windows 更新之后。

我尝试使用 Output 来解决问题,但它不适用于预填充的 Excel 模板,因为它搞砸了要导出到的整个文件。

【问题讨论】:

    标签: vba ms-access-2013 ms-access-2016


    【解决方案1】:

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

    这是更新的链接。它在 Office 安全更新 (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

    【讨论】:

    • 微软又做了一次。谢谢,很好的发现!
    • 非常感谢您的参考!我已经在微软支持论坛提交了一份错误报告,他们显然承认了这一点。与此同时,我不得不将所有 xtab 参数查询重新配置为标准选择查询。不幸的是,我的电脑是公司 PC,我无法卸载更新而不阻止它们在下一次安全更新时自动重新安装。顺便说一句,我会试一试。另一种方法是尝试弄乱系统注册表项,这是更糟糕的想法。感谢您的反馈!
    • @Deltav:您能分享一个指向您的错误报告的链接吗?我们遇到了同样的问题,我想监控这个问题,以便在问题解决后通知我的客户。
    • @Heinzi:这是我们使用的 MS 论坛帖子的链接。在我添加了所涉及的更新 KB 编号后,并没有太多的后续行动。 answers.microsoft.com/en-us/msoffice/forum/all/…
    • 另外,我通过添加一个使用交叉表作为数据源的生成表查询,然后简单地在导出中使用该表,为我的客户暂时解决了这个问题。这既不漂亮也不理想,但它让他们继续前进,直到这个错误得到承认和解决
    【解决方案2】:

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

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


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

    • 在 Access 2013 中安装了 KB4493206(可能在 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. 使用文本框Text0 创建一个新的空表单Form1 并保存。

    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 - 此对象类型不支持操作”

    我在微软论坛上也有reported this bug

    【讨论】:

      【解决方案3】:

      我通过禁用数据库缓存解决了这个问题。

      【讨论】:

      猜你喜欢
      • 2014-03-10
      • 1970-01-01
      • 2021-10-01
      • 2021-12-23
      • 2015-02-16
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多