首页 > 解决方案 > Excel VBA 更新或插入具有依赖关系的现有访问表

问题描述

我想将 Excel 工作表 ( shReceiver) 中的所有行上传到 MS Access 表 ( tblReceiver)。

Excel 和 Access 表 ( ) 中都有一个主键 - TNR(票号tblReceiver)。所以首先我检查TNRfrom是否shReceiver存在于tblReceiver. 如果是这样,那么我删除tblReceiver. 然后我将所有数据附加shReceivertblReeiver.

但是,Access DB 中的许多查询都与 相关联tblReceiver,这使得该过程非常缓慢(执行需要 30 分钟以上)。更新时有什么方法可以禁用其他 Access DB 查询或索引tblReceiver

请注意,我有大约 70k+ 条记录,其中 74 列tblReceiver和 10k+ 数据要上传到shReceiver.

我的代码如下:

Public Sub ExportReceiver()
Dim lastRow, var_Range_Count As Long
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("Receiver")
lastRow = sh.Cells(Rows.Count, 2).End(xlUp).Row

Call databaseCon
For var_Range_Count = 3 To lastRow
    cnn.Execute "DELETE * FROM tblReceiver WHERE tblReceiver.[TNR] =" & "'" 
    & sh.Range("A" & var_Range_Count).Value & "'", dbFailOnError
Next
Call CloseDB

Dim acc As New ACCESS.Application
acc.OpenCurrentDatabase ThisWorkbook.Path & "\TicketsDB.accdb"
acc.DoCmd.TransferSpreadsheet _
        TransferType:=acImport, _
        SpreadSheetType:=acSpreadsheetTypeExcel12Xml, _
        TableName:="tblReceiver", _
        FileName:=Application.ActiveWorkbook.FullName, _
        HasFieldNames:=True, _
        Range:="Receiver$A2:BX" & lastRow

acc.CloseCurrentDatabase
acc.Quit
Set acc = Nothing
End Sub

标签: sqlexcelvbams-access

解决方案


不要导入 Excel 数据,而是将它们链接为链接表

然后将该表用作组合更新/追加查询中的源,如下所述:

比较两个表并更新或插入数据

这将一口气运行。


推荐阅读