这笔交易是我有大约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一对一地记录?
谢谢。
答案 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)