PowerQuery编写的SQL查询转VBA实现的连接字符串问题咨询
解决方案
1. 连接字符串配置说明
根据你PowerQuery中用到的参数(服务器地址EU002VM0353、数据库名EPV2P9053),两种常用的合法连接字符串格式如下:
- Windows身份验证(和PowerQuery默认使用的当前系统账号权限一致,无需额外输入账号密码):
Provider=SQLOLEDB;Data Source=EU002VM0353;Initial Catalog=EPV2P9053;Integrated Security=SSPI; - SQL Server独立身份验证:
Provider=SQLOLEDB;Data Source=EU002VM0353;Initial Catalog=EPV2P9053;User ID=你的SQL账号;Password=你的SQL密码;
2. 完整VBA实现代码
以下代码完全对应你PowerQuery的查询、筛选逻辑,采用晚绑定方式无需手动引用ADODB库,直接运行即可:
Sub 查询SQL质检数据表() Dim conn As Object, rs As Object Dim strConn As String, strSQL As String ' 配置连接字符串,默认使用Windows身份验证,需要换SQL账号可替换为对应格式 strConn = "Provider=SQLOLEDB;Data Source=EU002VM0353;Initial Catalog=EPV2P9053;Integrated Security=SSPI;" ' SQL查询语句,直接把筛选逻辑写在SQL层,执行效率远高于VBA本地遍历 strSQL = "SELECT * FROM dbo.vw_pbi_01_fact_inspection_state " & _ "WHERE [QCF Is required] = 1 " & _ "AND [Is NA] = 0 " & _ "AND [WS status] = 'Active'" ' 初始化数据库对象 Set conn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") ' 执行查询 conn.Open strConn rs.Open strSQL, conn ' 示例:将查询结果输出到当前工作簿Sheet1的A1单元格 If Not rs.EOF Then ' 输出表头 Dim i As Integer For i = 0 To rs.Fields.Count - 1 Sheet1.Cells(1, i + 1).Value = rs.Fields(i).Name Next ' 输出查询内容 Sheet1.Range("A2").CopyFromRecordset rs End If ' 释放资源,必须执行否则会残留数据库连接 rs.Close conn.Close Set rs = Nothing Set conn = Nothing End Sub
3. 连接失败排查点
- 确认本地网络可以正常访问服务器
EU002VM0353的1433端口(SQL Server默认端口),无防火墙拦截 - 确认你使用的账号拥有
EPV2P9053数据库的查询权限,和PowerQuery使用的账号权限一致 - 如果使用SQL独立账号登录,确认该账号开启了SQL Server身份验证权限,且密码无特殊字符转义问题
内容的提问来源于stack exchange,提问作者nikau
相关产品推荐
相关产品推荐

