将Excel中的表格和非表格数据混合到Access中

我的访问编程有点生疏,我从来没有用Excel文件工作。

我需要将Excel电子表格中的数据导入到Access 2007中。这些电子表格有一个固定的(可预测的)格式,但它包含一个“标题区域”,我需要读取特定单元格中的单个数据项,然后是大量的表格数据(到目前为止我看到的一个样本中〜500行)。 我将把所有这些处理成一组与电子表格的平面布局非常不同的表格。

我知道如何在表格数据上打开一个ADOlogging集,它应该适合我的目的。 我还想到,我可以引用Excel对象模型,并通过自动化打开工作表以获取“标题区”数据项。

我的问题是这样的:因为我必须(我认为)使用自动化方法的“标题区域”,我最好只是把它打开在这种模式下移动到表格数据(单元格/范围导航),或closures该模式并转到ADO? 我怀疑是后者,而且我会对此感到更舒服 – 但是我不想因为它比较熟悉就做错事。

编辑看来我不清楚,我需要build立这种能力到“应用程序”,作为一个用户可以重复下来的行。 我敢肯定,我可以信任电子表格的格式(尽pipe如果事实certificate这是错误的,我会包含错误陷阱来优雅的失败)。 这些电子表格是硬件的“官方devise文档”,我的应用程序需要处理引入新的和/或更新的文档,以跟踪表格数据中所描述的事物,而Excel平台不允许这样做。

在这两个选项中,我会select第二个选项,因为我发现使用ADOlogging集更方便。 如果您可以为您的电子表格的表格数据分配一个命名的范围,这应该相当简单。

编辑 :如果您的电子表格包含字段名称,则logging集方法不太可能因为电子表格更改(如在现有列之前或之间插入一个或多个新列)或现有列的重新sorting而中断。

但实际上,我认为TransferSpreadsheet方法可能更方便。 您可以将电子表格范围指定为命名范围或单元地址,如本例中的链接页面所示:

DoCmd.TransferSpreadsheet acImport, 3, _ "Employees","C:\Lotus\Newemps.wk3", True, "A1:G12" 

另外,您可以select将电子表格范围直接导入到Access表格中,或者将范围链接为“虚拟”表格……无论哪一个最能满足您的应用程序的需求。

编辑2 :使用TransferSpreadsheet创build链接(acLink而不是acImport)将允许您对链接表执行SQL语句:

 INSERT INTO DestinationTable (field1, field2, field3) SELECT foo, bar, bat FROM LinkedTable; 

如果头信息非常复杂,这可以简化您的编码工作:

  1. 在官方devise的Excel文件中,创build一个隐藏的选项卡。
  2. 在该选项卡中,创build一个连接到您感兴趣的所有标题元素的单行表格(即,将第1行第1列设置为“Document#”,第2行第1列设置为Sheet1:A1)
  3. 然后,您可以重新使用相同的VBA过程来导入表格数据和标题数据。

我会通过自动化完成。 为什么有两个单独的进程,一个人会做? 阅读标题信息后,阅读表格信息将是相当容易的。

我在2000年年中inheritance了一个应用程序,该应用程序是为了导入基本上从MYOB(会计程序)报告输出的Excel电子表格而构build的。 我们所做的只是简单地创build一个模板表,其中包含所有必要的列以容纳报表,使用所有列的文本数据types。 然后将非数据行过滤出来并处理到最终的目的地表中。

虽然我inheritance的实现为导入的每个报表布局使用了一个专用的临时表,但它并不优雅,并且不需要太多编程。 你可以很容易地用一个单一的表格replace所有的这些表格,其中包含100个255的文本列(或者备注字段,如果这是一个要求的话),然后重新使用它。

我不知道我是否会推荐它,但是它确实很容易,不需要太多的代码。