是否可以将Excel电子表格导入为记录集?

时间:2019-05-07 16:16:16

标签: excel vba ms-access access-vba

我有一个Access数据库,该数据库汇总和格式化从另一个系统导出的人员数据为Excel文件。当前过程要求用户遵循以下步骤/规则:

  1. 文件必须命名为Alpha_Roster.xls*Alpha_Roster.xlsx,并且与数据库位于同一文件夹中
  2. 必须删除前两行,以使列标题从第3行移至第1行
  3. 必须从Alpha_Roster文件中删除所有“多余”列,因为未使用这些列中的数据,并且DoCmd.TransferSpreadsheet如果存在则将失败

正如您所看到的,当您只处理几个目标列时,这还不错,但是我们正在从25个左右的列中寻找信息,并且它们与多余的列混合在一起我们需要删除的列(导出的文件中有76列),因此准备文件进行更新是一个相当繁琐的过程,我们必须每周执行一次。

对标题进行排序后,脚本将擦除AlphaList表中的数据,然后使用DoCmd.TransferSpreadsheet acImport, 10, "AlphaList", FilePath & "Alpha_Roster", True将新数据移入。

因此,我有一些更新目标:

  1. 使用 Application.FileDialog(msoFileDialogFilePicker) 和一些If语句删除整个文件名/位置位-完成,以检查我们要插入的扩展名。
  2. 如果导出数据的布局发生更改,则删除编辑Access VBA代码的要求-考虑完成,使用循环提取数据库所需的字段以组装SQL查询以更新数据库 i>
  3. 删除编辑导出的Excel文件的要求。

现在,这使我明白了为什么要在这里-我正在寻找一种基本上将Excel文件拉入临时记录集或表中的方式,然后可以对其执行SQL查询。不知道我是否能完全摆脱删除顶部两行的问题,但是这样做比消除所有列要好得多。我想我在那儿,但是我正在使用Google搜索的所有内容都比我正在寻找的解决方案要差一点。

这是到目前为止我正在使用的测试代码:

    Dim cnn As New ADODB.Connection
    Dim fDialog As Office.FileDialog
    Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
    With fDialog
        .Title = "Select Alpha Roster File"
        .AllowMultiSelect = False
        .ButtonName = "Open"
        .Filters.Clear
        .Filters.Add "Excel Workbook", "*.xls;*.xlsx"
        If .Show = True Then
            SelFile = .SelectedItems.Item(1)
        End If
    End With
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
             "Data Source=" & SelFile & ";" & _
             "Extended Properties='Excel 12.0 XML;HDR=Yes'"

我不足之处是如何从此处获取可以对其执行更新查询的某种记录集?还是可以从这里运行查询("SELECT " & qryStr & " from ...")?还是我在这里完全走错了路?

请注意,由于某种原因或其他原因,无论何时我尝试定义ADODB.Recordset时,代码检查器都会使Access完全崩溃,因此很遗憾,我无法完全镜像我所见过的一些示例在线。

需要考虑的一些事情-我正尝试在将来做一点证明,因为我不知道可能将哪些字段添加到导出的文件中。这就是为什么我不只是直奔DoCmd.TransferSpreadsheet。将整个文件转储到一个表中时,最简单的选择是将标头设置为与我们当前所拥有的表相匹配,而第二个方面就标头而言,源文件中的内容发生了变化,过程中断了。另外,尽管我可能精通技术,可以将代码拆开并弄清楚事情的发展方向,但这里的最终用户……好吧,我们只能说他们的技能水平很基本。他们不在乎它是如何工作的。

2 个答案:

答案 0 :(得分:1)

您可以使用单行代码将它们作为表格链接为表格:

DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel12Xml, ...

然后将其用作任何其他表,尽管是只读的。

答案 1 :(得分:1)

您可以使用SheetName $查询工作表。 (美元符号为必填项)

@StepScope

您的列中必须包含带有唯一名称的标题,以免出现问题。