是否可以读取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
答案 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一起使用。