从Excel插入或更新数据以访问最佳方式

时间:2017-07-22 17:23:29

标签: sql excel-vba ms-access ado adodb

这笔交易是我有大约800到1000个excel文件,我需要上传才能访问。这些文件具有特定的表格和表格(约6-7个表格),这些表格和表格将由不同的经理在不同的时间填写,这些文件中的数据可能会偶尔更新或更改。

将这些内容上传到访问权限的最佳方式是什么?

我有两个想法:

  • 第一个(也是我最想要的那个)是在这个excel表中创建一个vba宏,当一个管理员填写所有的时,这将是一个关闭的自动运行并将数据从Excel上传到Access数据。所以我总是在Access中拥有最新的数据。 在这种情况下,我需要使用ADO,因为我不知道是否有任何经理在他们的PC上安装了MS Access或者没有安装MS Access以便使用DAO。

  • 第二个 - 我从Access运行宏,它在准备就绪时读取所有800-1000个文件。在这种情况下,我可以使用DAO和ADO。但我不想自己做这份工作。

我有第一个案例的测试代码。

Sub TestUpload()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset

cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\User\Desktop\TestDataBase.accdb;"
rs.Open "TestDB", cn, adOpenStatic, adLockOptimistic, adCmdTable

Dim contractSAP As String
contractSAP = Sheets("TestUpload").Range("A1").Value
Dim contractASU As String
contractASU = Sheets("TestUpload").Range("B1").Value

Dim strSqlSelect As String
Dim strSqlInsert As String
Dim strSqlUpdate As String

strSqlSelect = "SELECT 1 FROM TestDB WHERE ContractNumSAP = '" & contractSAP & "'"
strSqlInsert = "INSERT INTO TestDB (ContractNumSAP, ContractNumASU) VALUES ('" & contractSAP & "', '" & contractASU & "')"
strSqlUpdate = "UPDATE TestDB SET ContractNumASU = '" & contractASU & "' WHERE ContractNumSAP = '" & contractSAP & "'"

cn.Execute (strSqlInsert)

End Sub

我有一些问题。

1)如果两个或多个管理员同时将数据上传到同一个表,是否会发生冲突?主键的记录都不同。

2)检查Access中表中是否已有记录的最佳方法是什么?

3)上传或插入的最佳方式?

4)有没有办法在整个Range / Table中通过ADO将记录从Excel插入/更新到Access,或者我需要检查循环中每一行的记录是否存在?

5)有没有办法使用SQL从Excel工作表中选择数据并在同一个SQL查询中插入/更新它们,而不是像我现在那样使用Cell一对一地记录?

谢谢。

2 个答案:

答案 0 :(得分:0)

在Access中使用命令[DoCmd.TransferSpreadsheet][1],以便将excel工作表作为表链接到访问中。然后,您可以像常规访问表一样查询这些表。

1)如果你从Access中提取文件,你就不会与同时上传的管理员发生冲突。

2)每条记录都需要一个唯一标识它的主键。这可以是一列或列的组合。您可以更新和插入这样的记录(使用查询,不要使用循环):

首先更新现有记录(假设ContractNumSAP是您的PK,并且您想要更新ContractNumASU):

UPDATE
    MyAccessTable A
    INNER JOIN MyLinkedExcelTable X
        ON A.ContractNumSAP = X.ContractNumSAP
SET A.ContractNumASU = X.ContractNumASU

然后插入遗漏的:

INSERT INTO MyAccessTable (ContractNumSAP, ContractNumASU)
SELECT ContractNumSAP, ContractNumASU
FROM MyLinkedExcelTable X
WHERE X.ContractNumSAP NOT IN (SELECT ContractNumSAP FROM MyAccessTable)

答案 1 :(得分:0)

请参阅以下网址:

http://www.accessmvp.com/KDSnell/EXCEL_Export.htm

回复其他问题。