【问题标题】:Can Access read the contents of an Excel file without importing it to a table?Access 可以读取 Excel 文件的内容而不将其导入表吗?
【发布时间】:2020-07-14 16:35:23
【问题描述】:

是否可以在导入表格之前读取 Excel 工作簿的标题行以确定某些字段是否存在?如果在导入之前缺少这些特定字段,我希望收到通知。

My Access 数据库要求用户从不同系统生成的 Excel 文件中导入数据,用户可以在其中选择要导出的字段。有时用户不小心没有选择我的数据库工作所需的某些字段,这会导致错误,然后我会收到电子邮件。如果缺少字段,当前导入不会出错,这很好,因为并非所有字段都是必需的,只是某些字段。

作为参考,这是我现在用来导入的代码。它运行良好并完成了它应该做的事情:

Private Sub ImportEDAS()
On Error GoTo SubError

    DoCmd.Hourglass True
    DoCmd.SetWarnings False

    If IsFile(Me.ImportFolder & "\perselection.xlsx") = True Then
        DoCmd.OpenQuery "qryClearEDAS"
        DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "tblEDAS", Me.ImportFolder & "\perselection.xlsx", True
        MsgBox DCount("*", "tblEDAS") & "Records Imported", vbInformation + vbOKOnly, "EDAS Import Status"
    Else
        MsgBox "Could not find perselection.xlsx in the import folder.", vbCritical + vbOKOnly, "EDAS Import Status"
    End If

SubExit:
On Error Resume Next
    DoCmd.Hourglass False
    DoCmd.SetWarnings True
    Exit Sub
SubError:
    MsgBox "Error Number: " & Err.Number & "- " & Err.Description, vbCritical + vbOKOnly, "ImportEdas Sub Error"
    Resume SubExit
End Sub

【问题讨论】:

    标签: vba ms-access


    【解决方案1】:

    您可以创建查询来查找工作表数据,而无需打开或链接。

    SELECT *
    FROM [Sheet1$] IN 'C:\Path\to\File\ExcelFile.xlsx'[Excel 12.0;HDR=No;IMEX=0;];
    
    

    可与 DAO 一起使用,与 OLEDB 类似。

    【讨论】:

    • 就是这样,它工作得很好。我认为其他答案也可以,但这是最简单和最直接的。我不知道你甚至可以使用 SELECT 语句来做到这一点。
    • 当然,它几乎是魔法;) bui 仍然缺少指向好的文档的链接。如果找到我会添加。
    【解决方案2】:

    虽然通过使用 ActiveX 对象模型与 Excel 交互,当然可以使用 VBA 读取 Excel 工作表中的列标题,但更简单的方法可能如下:

    将 Excel 电子表格导入 MS Access 中的临时表,然后使用 VBA 遍历新创建的表中的字段,测试查询所需的字段集是否存在。

    要验证临时表中存在的字段集,您可以使用如下函数:

    Function ValidateFields(strTbl As String, arrReq As Variant) As Boolean
        Dim fld
        Dim fldTmp As Field
        On Error GoTo err
        For Each fld In arrReq
            Set fldTmp = CurrentDb.TableDefs(strTbl).Fields(fld)
        Next fld
        ValidateFields = True
    err:
        Exit Function
    End Function
    

    提供临时表的名称,以及您需要出现在该表中的字段数组,如果数组中的所有字段都存在,上述函数将返回True,否则返回False表中缺少数组中的任何字段,例如:

    ?ValidateFields("TempTable", Array("Field1", "Field2", "Field3"))
    False
    

    如果缺少一些必填字段,您可以相应地通知用户;否则,如果所有必填字段都存在,您可以使用简单的追加查询将必填字段中的数据插入到查询使用的表中。

    【讨论】:

      【解决方案3】:

      使用

      DoCmd.TransferSpreadsheet acLink, ..
      

      数据将被链接。您可以将链接表作为记录集打开并读取字段名称以验证这些。如果 OK,运行追加查询来导入数据。

      【讨论】:

        猜你喜欢
        • 2016-07-11
        • 1970-01-01
        • 2019-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 1970-01-01
        相关资源
        最近更新 更多