【发布时间】:2019-03-03 07:57:24
【问题描述】:
我想将 Excel 工作表 (shReceiver) 中的所有行上传到 MS Access 表 (tblReceiver)。
在 Excel 和 Access 表 (tblReceiver) 中都有一个主键 - TNR(票号)。所以首先我检查shReceiver 中的TNR 是否存在于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
【问题讨论】:
-
您是否考虑过在发现记录已存在时发出更新查询,如果不存在则插入?
-
嗨,贾德,感谢您的建议。我没有使用更新和插入查询,因为我试图一次性追加所有数据。让我试试那个。然而,最大的问题是,只要对 tblReceiver 稍作修改,许多其他查询就会开始过度处理。有什么办法可以禁用这些查询...