Access可以在不将Excel文件导入表的情况下读取其内容吗?

时间:2019-06-15 17:26:52

标签: ms-access access-vba

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

我的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

3 个答案:

答案 0 :(得分:0)

通过使用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,否则返回{{ 1}},如果表中缺少数组中的任何字段,例如:

False

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

答案 1 :(得分:0)

使用

DoCmd.TransferSpreadsheet acLink, ..

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

答案 2 :(得分:0)

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

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

可以与DAO一起使用,并且可以与OLEDB一起使用。