我在SQL Server上有一个相对较大的表(大约300,000行)。此数据用作验证用户在Excel电子表格中所做操作的数据池。
确保用户始终使用最新数据的一种方法是设置VBA,使其在电子表格打开时自动从SQL server拉取数据。
代码:
Private Sub Workbook_Open()
Set objMyConn = New ADODB.Connection
Set objMyRecordset = New ADODB.Recordset
Dim strSQL As String
'Open Connection'
objMyConn.ConnectionString = "Provider=SQLOLEDB; Data Source=Server Name;Initial Catalog=Database;User ID=User;Password=Password; Trusted_Connection=no"
objMyConn.Open
'Set and Excecute SQL Command'
strSQL = "SELECT * FROM [Database]"
'Open Recordset'
Set objMyRecordset.ActiveConnection = objMyConn
objMyRecordset.Open strSQL
'Copy Data to Excel'
Sheets("TEPSD").Range("A1").CopyFromRecordset (objMyRecordset)
objMyConn.Close
End Sub
这样做的问题是需要很长的时间。有时,它花费的时间太长,我最终不得不ctrl+break它。
我想知道有没有更快的方法?或者使用另一种方法来验证用户数据,而不必将整个表拉到Excel中?
任何意见都将非常感谢。
发布于 2018-06-04 06:11:45
在我们的讨论之后。
目前,每个用户都试图在短时间内从服务器提取大量数据,然后数据将变得陈旧,因为除非用户关闭并重新打开工作簿,否则数据不会更新。
而是切换到Worksheet_Change()宏。这将在每次进行更改时刷新数据。
这将允许您在用户每次进行更改时发送自定义查询-例如,按enter。
将strSQL
从提取所有数据的静态查询更改为strSQL = "SELECT name FROM [Database] WHERE name = " & Target.Value
注意:你真的应该看看VBA记录集希望你如何做参数连接,以避免Little Bobbie Tables。
如果查询成功-即一个有效的条目-那么它应该返回相同的名称。如果没有相应的条目-即不是有效的选择-那么您应该得到一个空的recordset
。这意味着您可以使用If rsObj.RecordCount < 1 Then
测试查询结果,以便优雅地退出(或提示用户等)。当没有有效的匹配项时。
https://stackoverflow.com/questions/50670468
复制相似问题