2016-03-06 156 views
0

我有一个访问数据库,用户应该从Excel复制并导入到Access表中。用户可以从几个“进口”中进行选择,他们可以自己创建新的进口。一旦他们选择了导入 - 即时创建查询,并将所需的列导入到表中。所有导入都将填充同一个表,但并非所有列都与每个导入相关。因此,如果选择Import1,则查询将显示例如。第2栏,第3栏和第4栏。如果选择了import2,那么它可能是column2和column5等。之后,导入查询将在VBA代码中被删除。使用VBA动态列从Excel复制到Access

我不确定这是否是解决问题的最佳解决方案,但原则上它是有效的(但有时如果用户在完成等操作之前退出数据库,删除查询可能会出现问题 - 因此可能会手动删除旧查询需要)。

然而,问题在于,除了用户复制到表中的数据之外,还需要使用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查询中即可。同样,当用户启动“工资导入”时,第2,3和7列将显示在VBA生成的查询中。用户还有另一个这种格式的Excel工作表来复制。这些是“超级用户”,它们复制并粘贴到数据库中 - 而不仅仅是任何用户。所有来自不同源的数据都被复制到同一个访问表中以便稍后处理(因此查询只显示相同表的相关列)。从Excel复制/粘贴是将这些数据存入Access解决方案的首选方法。

更新18日。 3月: 我仍然得到的问题是,我无法为每个导入预定义一个表单。可以有多个导入,导入可能会被删除,用户通过界面添加和修改。所以我的想法是,当用户从列表中选择一个导入时,将打开表单(所有导入的一个表单)。并根据所选的导入,VBA代码选择应在子窗体中显示哪些列。需要在每次打开导入时检查哪两列显示。

但是,如果我在VBA中这样做,两个用户可以同时打开同一个表单(它们在相同的访问文件中工作),并且有两个不同的导入并显示不同的列?或者我需要为每个用户创建一个表单实例,然后在用户完成时删除该实例?这似乎不是最好的想法,但我不知道如何解决这个问题。

+0

(1/2)我对用户如何将Excel数据“导入”到Access数据库感到困惑。你提到他们可以从几个“进口”中选择 - 这是如何准确地设置..?它是一个Access窗体,显示一组预定义的Excel文档以运行VBA导入脚本?你提到“导入查询” - 这是一个'INSERT' sql语句,还是像'TransferSpreadsheet'这样的VBA方法吗?您还提到用户“将Excel中的数据粘贴到查询中” - 现在开始使它听起来像您没有使用SQL/VBA来获取Excel数据,而是... –

+0

(2/2)。 ..依靠用户从字面上复制并粘贴到Access ...是这种情况?不要吝啬挑剔;我认为你想要做的事情很可能是可能的,但是你可能需要编辑你的问题,并提供一个更清晰的描述,说明你已经设置了什么(有一些截图和你正在使用的代码)以及你正试图去。 –

+0

谢谢马特。我已经添加了“更新”部分,我试图更详细地解释。让我知道你是否需要进一步的信息,以提供你的建议。 – XYZcode

回答

2

如果我了解安装程序和用户正在遵循的过程,您将拥有一个主表来存储用户将从CRM和工资表电子表格复制并粘贴的所有各种记录。例如像这样的表:

enter image description here

你再有独立的CRM和薪资查询,简单地显示来自进口表中的不同组列:

enter image description here

enter image description here

然后,您已经设置了一些表单,它允许用户打开正确的查询:

enter image description here

..例如, qryCRM:

enter image description here

..和复制/从相关的Excel电子表格粘贴数据:

enter image description here

我想你会遇到麻烦试图赶上与查询任何用户交互对象作为查询对象,据我所知,没有很多触发VBA代码的事件。

我建议做的是用你的CRM,工资单等进口的子表单设置一个窗体。

该子表单可以将您的CRM和工资查询作为记录源。例如,下面是一个使用查询qryCRM作为记录源子窗体:

enter image description here

...如果您还设置窗体为“数据表”的默认视图..

enter image description here

...用户将能够在查询对象本身的一个类似电子表格样式与窗体进行交互:

enter image description here

然后,您可以设置您的导航形式为指向的形式,而不是查询:

enter image description here

Private Sub cmdImportCrm_Click() 

    DoCmd.OpenForm "frmCRM" 

End Sub 

现在,您可以利用一系列子窗体的事件中的数据集,以获得额外的数据,当用户粘贴新记录。

到目前为止,我已经找到了最好的方法是使用窗体的BeforeInsert事件:

enter image description here

此事件每一个新的记录添加到数据集时触发的,所以如果你粘贴5新行,事件应该触发这5行中的每一行。

对于这一事件,我只是表示自己希望ImportID列来获取文本“CRM导入”(你可以明显地指定别的东西):

Private Sub Form_BeforeInsert(Cancel As Integer) 

    Me.ImportID = "CRM Import" 

End Sub 

因此,当我们贴上我们的数据作为新记录,我们也得到了我们的ImportID列规定以及文:

enter image description here

希望这有助于: )

+0

首先 - 非常感谢你为这个马特所做的努力!这绝对看起来像是正确的方法。我建议的做法是为每个CRM,薪资等进口设置一个子表单 – XYZcode

+0

但是,如果两个用户同时打开带有两个不同的CRM,工资单等的表单进口 – XYZcode

相关问题