在 Access 中通过 VBA 存储集合

Posted

技术标签:

【中文标题】在 Access 中通过 VBA 存储集合【英文标题】:Storing Collections through VBA in Access 【发布时间】:2015-08-01 01:40:38 【问题描述】:

在我的 Access 2013 Desktop 数据库中,我想在将 Excel 表单的行导入表之前通过 VBA 对其进行验证。

问题是导入的 Excel 表格可能在同一列中包含数字、字符串、null 等值,具体取决于用户的错误行,因此这些值最初必须是 VBA 类型的 Variant在验证之前。

如果该行无效(例如,一个值不是数字类型,而它应该是,一个必填字段为空,等等),我希望能够存储它的值并让用户稍后更正它。因此,我正在寻找一种方法来构建一个表,我可以在其中存储这些行,但字段保持不变,因此可以使用可能的混合数据类型。

这似乎是不可能的,因为 Access 表显然需要具有已定义类型的字段,因此没有什么等同于 Variant。

我怎样才能做到这一点?在保持列结构的同时存储 Variant 值行的最简单和最有效的方法是什么?到目前为止,我能想到的唯一方法是使用某个定义的分隔符连接字符串中每一行的这些值,并将其存储在 Access 表的 String 列中,但也许有更简单的方法?

非常感谢您的帮助。

编辑: 阅读您的回答后,我意识到我忘了指明填写和发送 Excel 表单的人(他们通常在他们的计算机上没有 Access)不是 与拥有 Access 数据库并需要导入数据的用户相同的用户。在这种配置中,不可能直接使用 Access 表单来输入数据,这当然会极大地简化任务。虽然我们首先尝试为填写 Excel 表单的人强制执行规则,但总会出现错误,Access 应用程序需要处理这些错误。操作 Access 的用户的导入过程应该尽可能简单(这些用户不是 IT 专家)。

【问题讨论】:

这有点令人困惑。您有 MS Access 数据库但使用 Excel 表单?访问表单在许多方面都更加健壮。此外,您可以在 Access 临时表中使用 short text 类型(接受字母数字和特殊字符),使用 VBA 验证临时数据,然后迁移到最终的 Access 表。 re: '...由于用户的错误' - 虽然我坚信,只要你建立了一个防白痴的东西,世界就会建立一个更好的白痴,这句话告诉我数据验证和其他基本的错误控制程序还没有到位。数据问题应该是例外,而不是常态。见GIGO。 如果您的 excel 用户有共享点,那么他们可以在他们的网络浏览器中运行访问网络应用程序。他们不需要安装 Access,数据最终会存储在通过 access 2013 管理的 sql server 数据库中。 【参考方案1】:

我考虑了你的问题一段时间,并做了一些笔记,如下所示。

我强烈建议,除非 excel 工作簿提供您不使用 excel 的其他功能,而是使用可用于与“他们的”数据交互的表单创建一个简单的 Access 数据库。他们不一定需要访问许可证来执行此操作。如果您有共享点通过 Access 创建的 Web 前端收集数据,Access 2013 甚至具有新的 Web 功能。

如果你要在Excel中收集数据,那么你必须在传输访问之前尽可能使用excel验证和VBA代码来验证数据。

有些复杂性对您来说可能是也可能不是问题,例如:

    用户可以同时编辑/创建/删除相同的行 - 如果他们这样做会发生什么!从 Access 下载行时,您可能需要“锁定”行。但是如果两个用户添加了相同的记录,或者在另一个用户再次提交之前删除了一行,会发生什么情况。

    用户能否在不将数据提交到 Access 的情况下打开多个 Excel 文件并编辑他们存储的数据?

    多个用户是否可以登录到同一个工作簿但未提交更改并编辑数据。

使用访问权限将简化您的代码,因为它能够防止输入错误数据并消除处理上述问题和其他问题的需要

总之,您使用 excel 作为存储在 Access 中的数据的前端“表单”。 每个 excel 文件都可以包含尚未启动的数据

我建议一行的主键是用于创建它的 Excel 文件的“路径和名称”和一个唯一的数字标识符。唯一标识符是为每个 excel 文件维护的计数器。 “路径和文件名”可以替换为为每个文件创建的唯一标识符。

许多用户使用 Excel 的多个实例将数据输入到一个表单中,这会导致在每个电子表格中存储的 Excel 表中更新/插入/删除一行或多行。

我希望每当打开 Excel 时,用户输入用户名,Excel 就会从 Access 中获取“他们的数据”。或者,可以为每个部门或“案例类型”设置一个工作簿,并且只与匹配此“工作簿中设置的自定义标准”的数据进行交互。 Excel 不一定需要长期存储数据本身。工作簿在保存时可能总是将数据保存回数据库。

您说 Excel VBA 对数据执行有限的验证(但没有完整的验证)。应该尽可能多地使用它,并且可以说应该能够执行与访问可以执行的完全相同的验证。至少它应该强制执行数据类型等(例如使用 excel 数据菜单上的标准数据验证规则),或者可能使用 VBA/控件来获取验证输入数据所需的任何访问数据。

更新数据后,用户可以“提交”(即保存)数据到访问数据库。在关闭工作簿之前,您可能需要提交数据。 (一个问题是用户是否可能在许多机器上打开许多工作簿而不提交数据。)

可以使用数据类型为“shorttext”且不是必需的所有列创建 Access“暂存”表。

将 Excel 表中的数据加载到 Access 中的过程会将所有 excel 行上传到此临时表中。然后它将验证暂存表中的每一行并将所有有效数据处理到具有数据类型、关系约束等的主表中。暂存表中的任何有效行都标记为“VALIDATED & TRANSFERRED”,无效行被标记为无效。 “验证和转移的行”随后会被忽略,但会保留下来,以便您可以检查发生了什么处理,可能仅在测试时。

然后使用 Access 中的有效/无效状态和向 excel 用户提供的适当消息更新 excel 中的数据。用户可以更正并重新提交数据。

每个excel文件都有一个“changed/Unchanged”状态,表示用户是否更改了文件中的数据。

当用户打开 Excel 工作簿且状态未更改时,它将刷新其数据。如果已更改,则可能无法进行刷新。

为了使用 Excel 中所做的更改更新/删除/插入 Access 中的数据,Excel 中的用户无法更改每一行的唯一标识符。这可能是登录到 Excel 的路径和文件名或用户名和一个数字计数器(为每个文件或用户维护)。 (这假设用户必须先在一个 Excel 文件中提交更改,然后才能处理另一个文件。)

无论如何,如果不了解更多信息,很难完全设计出您需要的东西,但我希望这些想法对您有所帮助

哈维

【讨论】:

以上是关于在 Access 中通过 VBA 存储集合的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Microsoft Access 中通过 VBA 设置 INSERT SQL 查询的参数值?

如何使用存储库接口在 Spring Data 中通过其嵌套对象的 objectId 查找集合?

如何在 Access 2003 和 VBA 中使用控件集合

填充集合VBA MS Access - 参考问题

在OSX中通过ssh启用远程访问/屏幕共享

使用 vba 在 MS-Access 前端中来自 MySQL 存储过程的多个结果集?