【发布时间】:2016-03-06 07:03:58
【问题描述】:
我有一个访问数据库,用户应该在其中从 Excel 复制并导入到 Access 表中。用户可以从多个“导入”中进行选择,并且他们可以自己创建新的导入。一旦他们选择了导入 - 将动态创建一个查询,其中包含要导入到表中的所需列。所有导入都将填充同一个表,但并非所有列都与每个导入相关。因此,如果选择 Import1,则查询将显示例如。第 2 列、第 3 列和第 4 列。如果选择了import2,那么它可能是column2和column5等。然后在VBA代码中删除导入查询。
我不确定这是解决问题的最佳方法,但原则上它可以工作(但有时如果用户在完成等操作之前退出数据库,删除查询可能会出现问题 - 因此可能需要手动删除旧查询)。
但问题是,除了用户复制到表中的数据之外,我还需要使用 VBA 代码中设置的预定义值来完成一些列。例如,我需要一个 ImportID 列来存储用户为用户复制的每一行选择的导入 ID。这需要在用户将 Excel 中的数据粘贴到查询中时同时完成。否则我将无法根据需要从其他导入中识别表中的数据。
对此我唯一的解决方案是动态创建一个表单(对于请求的每个导入),在表单中包含 ImportID 列,通过 VBA 为 Import 列设置预定义值,锁定导入列然后隐藏它在表格中。这样,当用户从 Excel 粘贴数据时,ImportID 列也会填充正确的值,而无需用户与之相关。
问题是我担心这是一个“混乱”的解决方案,通过 VBA 在数据库中创建需要删除的多个查询和表单 - 我确信其中很多会留下,因为用户将在此期间退出完成前的过程等。
如果有人对此有更好的方法,将不胜感激。我确实需要通过复制/粘贴来完成导入(不读取文件,尽管这可能是一个补充 - 它不能取代当前的解决方案)。
我将尝试更详细地解释该过程的工作原理:首先,我们定义了一个«会计科目表»。假设帐户 4000-4100 是来自 CRM 系统的数据。账户 5000-5100 是来自工资系统的数据。然后,用户可以设置一个名为“CRM 导入”的导入,要求第 2 列、第 3 列和第 5 列与帐户 4000-4100 一起完成,而一个称为“工资单导入”的导入需要用帐户 5000 完成第 2 列、第 3 列和第 7 列-5100。
启动 «CRM» 导入时 – VBA 代码仅打开由 VBA (DoCmd.OpenQuery) 创建的查询,显示列 2,3 和 5。在 Excel 工作表中 – 用户拥有相同格式的数据。因此,用户只需从 Excel 工作表中复制并粘贴到打开的 Access 查询中即可。同样,当用户启动 «Payroll import» 时,列 2、3 和 7 会显示在 VBA 生成的查询中。用户还有另一个此格式的 Excel 工作表要从中复制。这些是“高级用户”复制并粘贴到数据库中——而不仅仅是任何用户。来自不同来源的所有数据都被复制到同一个访问表中,以便以后处理(因此查询只显示同一个表的相关列)。对于此解决方案,从 Excel 复制/粘贴是将这些数据导入 Access 的首选方法。
18 日更新。行进: 我仍然遇到的问题是我不能为每个导入使用一个预定义的表单。可以有多个导入,用户可以通过界面删除、添加和修改导入。所以我的想法是,当用户从列表中选择导入时,会打开表单(一个表单用于所有导入)。并根据选择的导入,VBA 代码选择应在子窗体中显示哪些列。每次打开导入时都需要检查哪两列。
但是,如果我在 VBA 中执行此操作,两个用户是否可以同时打开同一个表单(他们在同一个访问文件中工作)并使用两个不同的导入并显示不同的列?还是我需要为每个用户创建一个表单实例,然后在用户完成后删除该实例?这似乎不是最好的主意,但我不知道如何解决这个问题。
【问题讨论】:
-
(1/2) 我很困惑用户如何将这些 Excel 数据“导入”到您的 Access 数据库中。您提到他们可以从几个“导入”中进行选择-这是如何设置的..?它是显示一组预定义的 Excel 文档以从中运行 VBA 导入脚本的 Access 表单吗?您提到“导入查询”-这是
INSERTsql 语句,还是像TransferSpreadsheet这样的 VBA 方法?您还提到用户“将 Excel 中的数据粘贴到查询中”——这听起来像是您没有使用 SQL/VBA 来获取 Excel 数据,而是... -
(2/2) ...依靠用户从字面上复制并粘贴到 Access ...是这种情况吗?不要想把这个分开;我认为您尝试做的事情可能是可能的,但您可能需要编辑您的问题并提供更清晰的描述,说明您到目前为止所设置的内容(带有一些屏幕截图和您正在使用的代码)以及您的内容'正在尝试到达。
-
谢谢马特。我添加了一个“更新”部分,我试图更详细地解释。如果您需要更多信息以便就此提供建议,请告诉我。
-
啊,好吧,我想我现在明白了。请参阅下面的答案。