我有一个访问数据库,用户应该从Excel中复制并导入到Access表中。用户可以从几个“导入”中进行选择,他们可以自己创建新的导入。一旦他们选择了导入,就会动态创建一个查询,并将所需的列导入到表中。所有导入都将填充同一个表,但并非所有列都与每个导入相关。因此,如果选择了Import1,则查询将显示例如。 column2,column3和column4。如果选择了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完成,一个导入称为“工资单导入”,要求第2列,第3列和第7列用帐户5000完成-5100。
启动«CRM»导入时,VBA代码只会打开由VBA(DoCmd.OpenQuery)创建的查询,显示第2,3和5列。在Excel工作表中,用户拥有相同格式的数据。因此,用户只需从Excel工作表中复制并粘贴到打开的Access查询中。类似地,当用户启动“工资单导入”时,第2列和第3列将显示在VBA生成的查询中。用户还有另一个格式的Excel表格也可以从中复制。这些是“超级用户”复制并粘贴到数据库中 - 而不仅仅是任何用户。来自不同源的所有数据都将复制到同一访问表中,以便稍后处理(因此查询只显示同一表的相关列)。从Excel复制/粘贴是将这些数据导入Access的首选方法。
更新18日。游行: 我仍然遇到的问题是我不能为每个导入都有一个预定义的表单。可以有多个导入,用户可以通过界面删除,添加和修改导入。所以我的想法是,当用户从列表中选择导入时,表单将打开(所有导入的一个表单)。并且基于所选的导入,VBA代码选择应在子窗体中显示哪些列。每次打开导入时都需要检查哪两列显示。
但是,如果我在VBA中执行此操作,两个用户是否可以同时打开相同的表单(它们在同一个访问文件中工作),具有两个不同的导入并显示不同的列?或者我是否需要为每个用户创建表单实例,然后在用户完成后删除该实例?这似乎不是最好的主意,但我不知道如何解决这个问题。
答案 0 :(得分:2)
如果我了解用户正确遵循的设置和流程,您将拥有一个主表来存储用户将从CRM和工资表电子表格中复制和粘贴的所有各种记录。例如,像这样的表:
然后您获得了单独的CRM和Payroll查询,只是显示导入表中的一组不同的列:
您已经设置了一些表单,允许用户打开正确的查询:
.. e.g。 qryCRM:
..并从相关的Excel电子表格中复制/粘贴数据:
我认为您将无法尝试捕获与查询对象的任何用户交互作为查询对象,据我所知,没有多少事件可以触发VBA代码。
我建议您为每个CRM,工资单等导入设置一个包含子表单的表单。
然后,子表单可以将您的CRM和Payroll查询作为记录源。例如,这是使用查询 qryCRM 作为记录源的子表单:
...如果您还将子窗体设置为"数据表" ...
的默认视图...用户将能够以类似电子表格式的查询对象本身与子表单进行交互:
然后,您可以将导航表单设置为指向表单而不是查询:
Private Sub cmdImportCrm_Click()
DoCmd.OpenForm "frmCRM"
End Sub
现在,您可以利用子表单上的一系列事件,在用户粘贴新记录时将更多数据输入数据集。
到目前为止,我发现的最佳方式是使用子表单的BeforeInsert
事件:
每次将新记录添加到数据集时都会触发此事件,因此如果粘贴5个新行,则应触发这5个行中的每个行的事件。
对于此次活动,我只是指定我希望 ImportID 列获取文本" CRM导入" (你显然可以指定别的东西):
Private Sub Form_BeforeInsert(Cancel As Integer)
Me.ImportID = "CRM Import"
End Sub
因此,当我们将数据粘贴为新记录时,我们也会获得为 ImportID 列指定的文字:
希望这会有所帮助:)