我有一个Excel文件,在MS Access数据库的本地表上执行SQL查询,工作正常。现在我必须让这个数据库在网络上工作,我们只是有SharePoint。我发现了SharePoint列表,所以我把我的表导出到这些列表中,现在我有一个带有链接表的Access数据库。
问题是,我不能像以前那样在这个数据库上使用Excel的查询。这可能吗?因为我可以从Access中进行这些查询,而且它可以工作,所以我不明白为什么从Excel中不能。这是我的函数。
Sub test()
Dim cn As Object
Dim rs As Object
Dim strSql As String
Dim strConnection As String
Set cn = CreateObject("ADODB.Connection")
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & "C:\...\BADO.accdb"
strSql = "SELECT Count(*) FROM Programmes;"
cn.Open strConnection
Set rs = cn.Execute(strSql)
MsgBox rs.Fields(0) & " tuples dans Programmes"
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub
连接的部分 cn.Open
工作,但当它试图执行 cn.Execute
,Excel进入无休止的加载并崩溃。这个代码只适用于本地表。
如果不行的话,我在想,我可以让数据库与它的本地表在SharePoint上,让用户与OneDrive同步,但我不知道如何同步工作。如果数据库很重,我不希望他们每次都要上传完整的大小。那么,有没有办法让这段代码工作呢?
归根结底,这是一个网络环境问题。从Excel中测试你的代码,其中工作簿和Access数据库都驻留在通过局域网(LAN)连接到SharePoint的网络上,我没有遇到挂起或崩溃的问题。
但是,在通过无线或远程连接到SharePoint的本地CPU上同时运行工作簿和Access数据库时,我确实遇到了严重的挂起和崩溃问题。
因此,请按复杂程度考虑以下选项。
局域网连接: 将Excel工作簿和Access数据库置于与SharePoint建立局域网连接的网络空间。这可能需要用户通过VPN远程连接到内部的计算机。
行动查询: 让MS Access从链接到你的简单计数汇总的本地表上运行制作表查询。
SELECT Count(*) AS [Count] INTO Programmes_Count FROM Programmes;
或者,在事先创建的表上使用追加查询,这可能比在网上查询更好。DROP TABLE
并每次重新创建。
DELETE FROM Programmes_Count;
INSERT INTO Programmes_Count ([Count])
SELECT Count(*) FROM Programmes;
这样的动作查询可以被保存下来,然后通过以下方式自动完成 访问宏 或 模块 从Excel中调用。然后让Excel访问这些本地表格。
COM自动化: 让Excel启动 Access.Application 作为一个COM对象,然后让数据库本身查询链接表。
Sub RunQuery()
Dim accApp, db, qdef, rst As Object
Dim strSQL As String
Set accApp = CreateObject("Access.Application") ' LAUNCH ACCESS IN BACKGROUND
accApp.OpenCurrentDatabase "C:\Path\To\Database.accdb"
strSQL = "SELECT Count(*) AS [Count] FROM Programmes;"
Set db = accApp.CurrentDb() ' ASSIGN UNDERLYING DB
Set qdef = db.CreateQueryDef("", strSQL) ' CREATE QDEF OR USE SAVED
Set rst = qdef.OpenRecordset() ' OPEN RECORDSET
' LAUNCH MESSAGE BOX
MsgBox rst.Fields(0) & " tuples dans Programmes"
' CLOSE OBJECTS
rst.Close: qdef.Close
accApp.DoCmd.CloseDatabase
accApp.Quit
' RELEASE RESOURCES
Set rst = Nothing: Set qdef = Nothing:
Set db = Nothing: Set accApp = Nothing
End Sub
甚至更好的是绕过Access应用,通过DAO查询Access。
Sub RunQuery()
Dim conn, db, qdef, rst As Object
Dim strSQL As String
Set conn = CreateObject("DAO.DBEngine.120") ' LAUNCH DAO CONNECTION
Set db = conn.OpenDatabase("C:\Path\To\Database.accdb")
strSQL = "SELECT Count(*) AS [Count] FROM Programmes;"
Set qdef = db.CreateQueryDef("", strSQL) ' CREATE QDEF OR USE SAVED
Set rst = qdef.OpenRecordset() ' OPEN RECORDSET
' LAUNCH MESSAGE BOX
MsgBox rst.Fields(0) & " tuples dans Programmes"
' CLOSE OBJECTS
rst.Close: db.Close
' RELEASE RESOURCES
Set rst = Nothing: Set qdef = Nothing
Set db = Nothing: Set conn = Nothing
End Sub