Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 使用VBA-动态列将Excel复制到Access中_Ms Access_Vba - Fatal编程技术网

Ms access 使用VBA-动态列将Excel复制到Access中

Ms access 使用VBA-动态列将Excel复制到Access中,ms-access,vba,Ms Access,Vba,我有一个access数据库,用户应该从Excel复制并导入access表。用户可以从几个“导入”中进行选择,并且可以自己创建新的导入。一旦他们选择了导入,就会动态创建一个查询,其中包含要导入到表中的所需列。所有导入将填充同一个表,但并非所有列都与每个导入相关。因此,如果选择Import1,则查询将显示例如column2、column3和column4。如果选择了import2,则可以是column2和column5等。之后,将在VBA代码中删除导入查询 我不确定这是否是解决问题的最佳解决方案,但

我有一个access数据库,用户应该从Excel复制并导入access表。用户可以从几个“导入”中进行选择,并且可以自己创建新的导入。一旦他们选择了导入,就会动态创建一个查询,其中包含要导入到表中的所需列。所有导入将填充同一个表,但并非所有列都与每个导入相关。因此,如果选择Import1,则查询将显示例如column2、column3和column4。如果选择了import2,则可以是column2和column5等。之后,将在VBA代码中删除导入查询

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

但问题是,除了用户复制到表中的数据外,我还需要使用VBA代码中设置的预定义值来完成某些列。例如,我需要一个ImportID列来存储用户为用户复制的每一行选择的导入ID。这需要在用户将Excel中的数据粘贴到查询中的同时完成。否则,我将无法根据需要从其他导入中识别表中的数据

对此,我唯一的解决方案是动态创建表单(对于请求的每个导入),在表单中包含ImportID列,通过VBA为导入列设置预定义值,锁定导入列,然后将其隐藏在表单中。这样,当用户从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工作表复制并粘贴到OpenAccess查询中。同样,当用户启动“工资单导入”时,VBA生成的查询中将显示第2、3和7列。用户还有另一张此格式的Excel工作表可供复制。这些是“超级用户”复制和粘贴到数据库中,而不仅仅是任何用户。来自不同来源的所有数据都复制到同一个访问表中,以便以后处理(因此查询只显示同一个表的相关列)。对于此解决方案,从Excel复制/粘贴是将这些数据导入Access的首选方法

更新18日。三月: 我仍然面临的问题是,我不能为每次导入都有一个预定义的表单。可以有多个导入,用户可以通过界面对导入进行删除、添加和修改。因此,我的想法是,当用户从列表中选择导入时,表单将打开(一个表单用于所有导入)。VBA代码根据选择的导入选择子窗体中应显示的列。每次打开导入时,需要检查显示哪两列


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

如果我了解设置并且用户正确遵循流程,您就有一个主表来存储用户将从CRM和工资电子表格复制和粘贴的所有记录。例如,这样的表:

然后,您将得到单独的CRM和Payroll查询,它们只显示导入表中不同的一组列:

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

…例如。qryCRM:

…并从相关Excel电子表格复制/粘贴数据:

据我所知,没有太多事件可以触发VBA代码,因此,我认为您在尝试捕获任何用户与查询对象的交互时都会遇到问题

我建议您为每个CRM、工资单等导入设置一个带有子表单的表单

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

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

…用户将能够以类似于查询对象本身的电子表格样式与子窗体交互:

然后,您可以将导航表单设置为指向表单,而不是查询:

Private子cmdImportCrm\u单击()
DoCmd