Access 2016 VBA、UniqueTable 属性错误 2455 和 KB3115503

Posted

技术标签:

【中文标题】Access 2016 VBA、UniqueTable 属性错误 2455 和 KB3115503【英文标题】:Access 2016 VBA, UniqueTable property error 2455 and KB3115503 【发布时间】:2019-03-26 18:11:13 【问题描述】:

我的问题是一个开发和管理问题的混合体,但由于它主要影响开发人员并涉及开发工具(Access、VBA 和 Form 模型),所以我将其发布在这里并希望我不要发火。话虽如此:

我已将 Access 2010 x64 .adp 项目转换为 Access 2016 .accdb,这并不太难。但是现在,每当我运行引用表单的 UniqueTable 属性的代码时,我都会收到以下错误:

Run time error 2455 You entered an expression that has an invalid reference to the property UniqueTable.

这是 Access 2013 和 Access 2016 的一个已知问题;例如,参见here。

Microsoft 已修复 - 请参阅 here。

问题出在这里:几天前,我安装了 Office 2016 x64。尝试应用上述修复时,我只收到以下消息:

There are no product affected by this package installed on this system.

当然,我已经仔细检查过我使用的是正确版本 (x64) 的补丁。不过,我还没有尝试安装 Office 2016 x86 并应用 x86 版本的补丁。

是否有人设法针对 x64 版本的 Office 2016 实际安装此补丁?根据 Jim Conrad 的声明(倒数第二个帖子 here),它可以解决问题,但如果我们无法安装它,这将无济于事。

【问题讨论】:

您认识到“它不适用于 Office 2016 即点即用版本,例如 Microsoft Office 365 Home”的限制。进行修复。 我应该提到这是一个“普通”Office,本地安装,通常由许可证密钥激活。它不是 Office 365。我的版本正式称为 Office 2016 Professional Plus 所以你不知道!要确定您的 Office 安装是即点即用还是基于 MSI,请执行以下步骤: 1. 启动 Office 2016 应用程序。 2. 在文件菜单上,选择帐户。 3. 对于 Office 2016 即点即用安装,将显示更新选项项目。对于基于 MSI 的安装,不显示更新选项项。 嗯。这很有趣。 一个按钮“更新选项”,点击它会打开一个下拉列表。我对此感到非常惊讶,因为我从我们在 Microsoft 合作伙伴中心的帐户中获得了这个版本的 ISO 文件(实际上,我们有一个 MAPS(Microsoft Action Pack 订阅))。知道如何获得基于 MSI 的安装(我们没有批量许可企业协议)吗? 抱歉,我不知道 Office,请咨询您的经销商。但是对于MS-Accessthe runtime-version(至少访问 runtime 2013)是基于 MSI 的。 【参考方案1】:

好吧,唯一表设置在 Access(非 adp)中确实没有任何用处。据我所知,该设置告诉(告诉)Access 使用源数据表中的 PK,因此不应影响我在这里能想到的任何有价值的东西。

我要做的是在 ADP 项目中以设计模式打开表单,并在将表导入 accDB 之前简单地清空设置。问题是您无法在 accDB 中获取并删除此不需要的设置,但当您从 ADP 复制时它仍然存在。

因此,只需清空 ADP 中的 uniqueTable 设置,然后导入表。您还可以编写一个循环,并在将所有表单导入访问之前一次性完成所有表单(因此,我想处理副本是有意义的)。

所以这里的问题是,当您将表复制到 accDB 时,该设置仍然存在,但是您无法访问、更改或删除此设置,因为它没有通过代码或属性表公开。

因此,这里的简单解决方案是在将表单导入 accDB 之前删除 ADP 应用程序中的设置。

【讨论】:

非常感谢。在这种情况下,仅仅消除问题就更容易了,因为 UniqueTable 属性总是在运行时由 VBA 代码动态分配。 UniqueTable (AFAIK) 例如如果表单基于包含多个表的查询(视图)并且通过表单删除记录,则告诉表单应从哪个表中删除数据。您能否最终详细说明一下为什么在非 ADP 项目中不再需要这样做?当从表单中删除记录时,基于多表的表单如何知道应该从哪个表中删除数据? 在这种情况下,基表总是被删除。子表可能会也可能不会删除,具体取决于级联删除设置。我不知道您可以指定要删除的表,而且我不得不认为 100 个案例中的 99 个是基表,而不是任何加入表的子表(左)将是您要从中删除记录的表。你的意思是我点击了删除,现在只有 3 个基于子(左连接)表的文本框要删除? (这会因混淆用户而获奖)。 据我所知,SQL server 规则要求你在 delete 命令中指定表,所以这很可能是针对 sql server 的。应该真正避免将表单基于多个表进行编辑,因为该查询通常不会更新。对于仅基于一个表的表单,您不想使用视图,而只是在记录源设置(属性表)中将表单设置为基表(链接表)。 你完全正确。从子表而不是主表中删除记录会很愚蠢。但我对 Access 在这种情况下的能力持怀疑态度。毕竟,即使对于 Access 2019 (docs.microsoft.com/en-us/office/vba/api/access.form.uniquetable),UniqueTable 仍会记录在案,我真的不确定在未设置此属性时表单是否会从 wrong 表中删除记录。我也同意表单应该基于表格而不是视图,但我正在尝试将复杂的旧应用程序从 Access 2007 和 2010 带入现在...... 该属性仅适用于 ADP,因此该文档有点不正确。该属性已折旧,您甚至无法通过非 ADP 项目获得 VBA 中的属性。由于 ADP 在 2010 年被删除,因此文档已经过时。 Access + ODBC 表到 mysql、SQL server、Oracle 等已经被 Access 使用了 20 多年,在那个时间框架内,我从未见过一篇文章、一篇文章或一篇引用或声明表明表单中的删除命令搞砸了向上。所以,不用担心。

以上是关于Access 2016 VBA、UniqueTable 属性错误 2455 和 KB3115503的主要内容,如果未能解决你的问题,请参考以下文章

Access 2016 VBA .FindFirst 在记录集中找不到记录

MS Access 2016 VBA 导致“输入参数值”窗口

Solidworks 2016 SaveAs Access VBA运行时错误438

从 MS Access 2016 VBA 启动 Outlook 2016 触发“另一个程序正在使用 Outlook”并死掉

MS Access 2016 VBA 在组合查询条件中为空

如何使用 MS Access 2016 在 VBA 表达式中编写数字字段?