混合表格&从Excel到Access的非表格数据

时间:2010-10-26 17:37:38

标签: excel ms-access vba ms-access-2007

My Access编程有点生疏,&我从来没有使用过Excel文件。

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

我知道如何在表格数据上打开ADO记录集,它应该可以很好地用于我的目的。我还认为我可以引用Excel对象模型并通过Automation打开工作表以获取“标题区”数据项。

我的问题是:因为我必须(我认为)将“自动化”方法用于“标题区域”,我最好在此模式下将其打开以转到表格数据(带有单元格/范围)导航),或关闭该模式&转到ADO?我怀疑它是后者 - 而且我对它更加满意 - 但我不想因为它更熟悉而做错事。

修改 似乎我不清楚我需要将这种能力构建到“应用程序”中,因为用户可以重复这一点。我确信我可以信任电子表格的格式(虽然如果结果是假的话我会包含错误捕获以获得优雅的失败)。这些电子表格是硬件的“官方设计文档”,我的应用程序需要处理引入新的和/或更新的电子表格,以便以平面Excel格式不允许的方式跟踪表格数据中描述的内容。

4 个答案:

答案 0 :(得分:1)

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

修改:如果您的电子表格包含字段名称,则记录集方法不会因电子表格更改而中断,例如在现有列之前或之间插入一个或多个新列或重新插入现有列的排序。

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

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

此外,您可以选择将电子表格范围直接导入Access表格,还是作为“虚拟”表格链接到该范围...以最符合您的应用需求为准。

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我会通过自动化完成所有工作。为什么要有两个独立的流程?阅读完标题信息后,阅读表格信息将非常简单。

答案 3 :(得分:0)

我在2000年中期继承了一个应用程序,用于导入基本上报告MYOB(会计程序)输出的Excel电子表格。已经完成的工作是使用所有列的文本数据类型,简单地创建一个模板表,其中包含容纳报表所需的所有列。然后过滤掉非数据行并将其处理到最终目标表中。

虽然我继承的实现为每个导入的报表布局使用了专用的临时表,但它并不优雅,并且不需要大量编程。您可以轻松地将所有这些替换为具有100个文本列255的单个表(或者备忘录字段,如果这是必需的话),并且只需重复使用它。

我不确定我是否推荐它,但它确实很容易,而且不需要太多的代码。