vba - 将数据从 SQL Server 加载到 Excel 的最快方法
问题描述
我在 SQL Server 上有一个相对较大的表(大约 300,000 行)。此数据用作数据池以验证用户在 Excel 电子表格中的操作。
确保用户始终使用最新数据的一种方法是设置 VBA 以在电子表格打开时自动从 SQL 服务器中提取数据。
代码:
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 的方法?
任何输入将不胜感激。
解决方案
按照我们的讨论。
目前,每个用户都试图在短时间内从服务器中提取大量数据,然后数据将变得陈旧,因为除非用户关闭并重新打开工作簿,否则数据不会更新。
相反,切换到 Worksheet_Change() 宏。这将在每次进行更改时刷新数据。
这将允许您在每次用户进行更改时发送自定义查询 - 例如按 Enter。
strSQL
将您从绘制所有数据的静态查询更改为strSQL = "SELECT name FROM [Database] WHERE name = " & Target.Value
注意,您应该真正查看 VBA 记录集希望您如何进行参数连接以避免Little Bobbie Tables。
如果查询成功 - 即有效条目 - 那么它应该返回相同的名称。如果没有相应的条目——即不是一个有效的选择——那么你应该得到一个空的recordset
。这意味着您可以测试查询的结果,If rsObj.RecordCount < 1 Then
以便在没有有效匹配时优雅地退出(或提示用户等)。
推荐阅读
- android - 如何在我的约束布局中的密码和注册按钮之间放置空格
- ffmpeg - 为什么ffmpeg在将大量(约9k)图像组合成视频时只组合前390张图像?
- polyml - 在 Debian 10 Buster 上使用 polyc 编译时出错
- r - 如何在 R 数据集中将十进制度数 (DDM) 转换为十进制度数?
- reactjs - 对象属性更改时重新渲染函数组件
- java - 用复选框隐藏一组形状(JavaFX)
- java - 从列表视图从一个片段导航到另一个片段
- r - 将具有同义词的重复行折叠在一起
- swift - 如何在 SwiftUI 的 CustomForEach 中解决超过 10 个视图?
- spring-boot - Spring boot - Jasypt - Dockerfile - Build - 如何传递环境变量