SQL 在 VBA 中查询,代码存储在 Excel 中的多个单元格中
SQL query in VBA, code stored in several cells in Excel
我正在尝试编写 VBA 代码,允许用户在 Excel 中输入(例如更改日期),然后再通过 SQL 检索数据。只要我将 SQL 查询存储在单个单元格中,代码就可以正常工作。但是,SQL 查询包括 62 行,因此在单个单元格内编辑它并不是最佳选择。
我想在 Excel 中将 SQL 代码拆分为每行 1 行,以便于编辑。 SQL 代码当前存储在 "SQL" sheet 单元格 "A1".
中
关于如何使它与多个 rows/cells 一起工作有什么想法吗?
Sub ConnectSqlServer()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sConnString As String
' Create the connection string.
sConnString = "Provider=OraOLEDB.Oracle;Data Source=xxxxxxx;User Id=xxxxxxx;Password=xxxxxxxxx;"
' Create the Connection and Recordset objects.
Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset
' Open the connection and execute.
conn.Open sConnString
Set rs = conn.Execute(Sheets("SQL").Range("A1"))
For intColIndex = 0 To rs.Fields.Count - 1
Sheets("Output").Range("A1").Offset(0, intColIndex).Value = rs.Fields(intColIndex).Name
Next
' Check we have data.
If Not rs.EOF Then
' Transfer result.
Sheets("Output").Range("A2").CopyFromRecordset rs
' Close the recordset
rs.Close
Else
MsgBox "Error: No records returned.", vbCritical
End If
' Clean up
If CBool(conn.State And adStateOpen) Then conn.Close
Set conn = Nothing
Set rs = Nothing
End Sub
Dim SqlText as String
Dim r as range
For each r in Range("A1:A62")
SqlText = SqlText & r.Text
Next r
Set rs = conn.Execute(sqlText)
请注意从 A2 到 A62 的每一行文本都以 space 开头,以确保这些行在连接时保持独立
如果您只想 select 您有 SQL 查询的第一行的非空行,您可以使用类似这样的东西。
这样做的好处是,您在 SQL 查询中添加一两行代码后就无需更改代码。
Public Function FirstRowAsString() As String
Dim variantValues() As Variant
Dim stringValue As String
Dim rowCounter As Long
range("A1").Select
range(Selection, Selection.End(xlDown)).Select
variantValues = Selection.Value
For rowCounter = 1 To UBound(variantValues, 1) Step 1
stringValue = stringValue + " " + CStr(variantValues(rowCounter, 1))
Next rowCounter
FirstRowAsString = stringValue
End Function
我正在尝试编写 VBA 代码,允许用户在 Excel 中输入(例如更改日期),然后再通过 SQL 检索数据。只要我将 SQL 查询存储在单个单元格中,代码就可以正常工作。但是,SQL 查询包括 62 行,因此在单个单元格内编辑它并不是最佳选择。
我想在 Excel 中将 SQL 代码拆分为每行 1 行,以便于编辑。 SQL 代码当前存储在 "SQL" sheet 单元格 "A1".
中关于如何使它与多个 rows/cells 一起工作有什么想法吗?
Sub ConnectSqlServer()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sConnString As String
' Create the connection string.
sConnString = "Provider=OraOLEDB.Oracle;Data Source=xxxxxxx;User Id=xxxxxxx;Password=xxxxxxxxx;"
' Create the Connection and Recordset objects.
Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset
' Open the connection and execute.
conn.Open sConnString
Set rs = conn.Execute(Sheets("SQL").Range("A1"))
For intColIndex = 0 To rs.Fields.Count - 1
Sheets("Output").Range("A1").Offset(0, intColIndex).Value = rs.Fields(intColIndex).Name
Next
' Check we have data.
If Not rs.EOF Then
' Transfer result.
Sheets("Output").Range("A2").CopyFromRecordset rs
' Close the recordset
rs.Close
Else
MsgBox "Error: No records returned.", vbCritical
End If
' Clean up
If CBool(conn.State And adStateOpen) Then conn.Close
Set conn = Nothing
Set rs = Nothing
End Sub
Dim SqlText as String
Dim r as range
For each r in Range("A1:A62")
SqlText = SqlText & r.Text
Next r
Set rs = conn.Execute(sqlText)
请注意从 A2 到 A62 的每一行文本都以 space 开头,以确保这些行在连接时保持独立
如果您只想 select 您有 SQL 查询的第一行的非空行,您可以使用类似这样的东西。
这样做的好处是,您在 SQL 查询中添加一两行代码后就无需更改代码。
Public Function FirstRowAsString() As String
Dim variantValues() As Variant
Dim stringValue As String
Dim rowCounter As Long
range("A1").Select
range(Selection, Selection.End(xlDown)).Select
variantValues = Selection.Value
For rowCounter = 1 To UBound(variantValues, 1) Step 1
stringValue = stringValue + " " + CStr(variantValues(rowCounter, 1))
Next rowCounter
FirstRowAsString = stringValue
End Function