【问题标题】:Excel VBA Update or Insert into Existing Access Table with DependenciesExcel VBA 更新或插入具有依赖关系的现有访问表
【发布时间】: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 稍作修改,许多其他查询就会开始过度处理。有什么办法可以禁用这些查询...

标签: sql excel vba ms-access


【解决方案1】:

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

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

Compare two tables and update or insert data

这将一次性运行。

【讨论】:

  • 这可能对我有帮助。让我实现它。非常感谢这个链接:)
  • 嗨@Gustav,我尝试了你提供的方法,但它只是更新数据。它没有附加任何新行。这是您提供的链接中使用的方法之后的代码:UPDATE tbl_Test_New LEFT JOIN tbl_Test_Old ON tbl_Test_New.PersNum = tbl_Test_Old.PersNum SET tbl_Test_Old.PersNum = [tbl_Test_New].[PersNum], tbl_Test_Old.Name = [tbl_Test_New].[Name], tbl_Test_Old.Surname = [tbl_Test_New].[Surname];
  • 那么你要么没有新记录,要么PersNum 不是唯一的。您必须加入一个 unique 字段或两个或多个共同唯一标识记录的字段。
  • 好吧,您会看到两个表都是只有 5 条记录的测试表,并且 PersNum 是唯一的主键。我认为它会进行更新,但对于追加:我们需要进一步使用两个表的外部连接,然后插入。
  • 不知道。也许还有其他事情正在发生。我还没有看到它没有按预期运行的情况。
猜你喜欢
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
相关资源
最近更新 更多