我已经尽力解决这个问题了,但我想我需要一点帮助。我可以用不同的语言编程,但我没有使用 Excel、VBA 或您可以进行的查询的经验,所以请随意把我当成小孩子,告诉我所有的细节。
我想要做的是获取三个不同单元格中的内容,并将它们用作 SQL 查询中的参数。
现在,我可以毫无问题地创建这里提到的查询从 Excel 2007 运行带参数的 SQL 查询我可以从单元格中选择一次参数(通过用“?”替换字符串)。
但我想多次调用该查询作为普通函数,只需将其放在像“=MyQuery($A$1,$A$2,$A$3)”这样的单元格中即可
“数据库”只是从外部源选择的另一个 Excel 文件,所以我不知道 VBA 代码中是否会发生变化。
如果您能为我指明正确的方向,即使它们只是拼图碎片,我也会非常感激。我需要一种方法来获取查询、一种方法来修改查询并一种方法来执行查询...但像往常一样,魔鬼就在细节中。
答案1
这是动态 SQL、ADODB 的实现方式(请确保添加 ADODB 引用)。这是为单元格中的字符串值构建的。此外,没有错误捕获代码,请根据需要添加:
Public Function Test(p1 As Range, p2 As Range, p3 As Range) As Integer
Dim cnt As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim strSQL As String
cnt.Open "Driver={SQL Server};Server=YY;Database=ZZ;Trusted_Connection=yes"
strSQL = "Select col4 from Table_1 where col1='" & p1.Value & _
"' and col2='" & p2.Value & _
"' and col3='" & p3.Value & "'"
rst.Open strSQL, cnt, adOpenStatic, adLockReadOnly, adCmdText
Test = rst("col4")
rst.Close
cnt.Close
Set rst = Nothing
Set cnt = Nothing
End Function
这是 ADODB,命令参数方式,有点棘手。这只是为单个字符设置的:
Public Function Test(p1 As Range, p2 As Range, p3 As Range) As Integer
Dim cnt As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ccmd As New ADODB.Command
Dim PA1 As New ADODB.Parameter, PA2 As New ADODB.Parameter
Dim PA3 As New ADODB.Parameter
cnt.Open "Driver={SQL Server};Server=YY;Database=ZZ;Trusted_Connection=yes"
ccmd.ActiveConnection = cnt
ccmd.CommandText = _
"SELECT col4 FROM Table_1 WHERE col1=? AND col2=? AND col3=?"
ccmd.CommandType = adCmdText
Set PA1 = ccmd.CreateParameter("first", adChar, adParamInput, 1, p1.Value)
Set PA2 = ccmd.CreateParameter("second", adChar, adParamInput, 1, p2.Value)
Set PA3 = ccmd.CreateParameter("third", adChar, adParamInput, 1, p3.Value)
ccmd.Parameters.Append PA1
ccmd.Parameters.Append PA2
ccmd.Parameters.Append PA3
Set rst = ccmd.Execute
Test = rst("col4")
rst.Close
Set rst = Nothing
cnt.Close
Set cnt = Nothing
End Function
答案2
您可以使用 vba 操作工作簿中的连接。例如,您可以构建一个 sql 查询字符串并将其应用于属性CommandText
,然后Refresh
以下是品尝者
Sub ExamineConnections()
Dim con As WorkbookConnection
For Each con In ActiveWorkbook.Connections
Select Case con.Type
Case xlConnectionTypeODBC
Debug.Print con.Name
Debug.Print "ODBC Connection"
Debug.Print con.ODBCConnection.Connection
Debug.Print con.ODBCConnection.CommandText
Debug.Print
Case xlConnectionTypeOLEDB
Debug.Print con.Name
Debug.Print "OLEDB Connection"
Debug.Print con.OLEDBConnection.Connection
Debug.Print con.OLEDBConnection.CommandText
Debug.Print
End Select
Next
End Sub