Excel VBA更新或通过依赖关系插入到现有访问表中

时间:2019-03-03 07:57:24

标签: sql excel vba ms-access

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

在Excel以及访问表(TNR)中都有一个主键-tblReceiver(票号)。因此,我首先检查TNR中是否存在shReceiver中的tblReceiver。如果是这样,那么我将删除tblReceiver中的数据。然后,我将所有数据从shReceiver附加到tblReeiver

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

请注意,我在tblReceiver中有约70k记录和74列,在shReceiver中有10k +数据要上传。

我的代码如下:

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

1 个答案:

答案 0 :(得分:1)

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

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

Compare two tables and update or insert data

这将一口气运行。