[英]Run SQL-statement in Excel Cell with VBA
Excel文件:
| A | B | C | D | E
---|----------------|-----------------|-----------------------------|-----------------|------------
1 | sales_date | 2020-01-15 | =CONCATENATE(C2,C3) | |
2 | | | SQL-Query Part 1* | |
3 | | | SQL-Query Part 2* | |
4 | | | | |
VBA
Sub Get_Data_from_DWH()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set conn = New ADODB.Connection
conn.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver}; SERVER=XX.XXX.XXX.XX; DATABASE=bi; UID=testuser; PWD=test; OPTION=3"
conn.Open
strSQL = Sheet1.Range("C1")
Set rs = New ADODB.Recordset
rs.Open strSQL, conn, adOpenStatic
Sheet1.Range("D1").CopyFromRecordset rs
rs.Close
conn.Close
End Sub
SQL查詢:
SELECT
product, brand, sales_channel,
country, sales_manager, sales_date, return_date,
process_type, sale_quantity, return_quantity, sales_value, variable_costs, fixed_costs
FROM bi.sales
WHERE sales_date = '"&B1&" AND country IN ('DE', 'US', 'NL')
ORDER BY FIELD (brand, 'brand_A', 'brand_B', 'brand_C');
我想用上面的VBA
運行上面的SQL-Query
。
問題是查詢包含超過 255 個字符,因此它不適合一個 Excel 單元格。
因此,我在Cell C2
和Cell C3
中將查詢隨機拆分為兩部分,並在Cell C1
中使用CONCATENATE(C2,C3)
來組合查詢的兩個部分。
當我現在運行VBA
時, runtime error '-2147217887 (80040e21)'
。
我猜VBA
無法處理Cell C1
中的CONCATENATE(C2,C3)
。
因此,我想知道是否有其他方法可以解決此問題?
筆記:
我知道我可以將 SQL 直接放入 VBA 代碼中。 但是,我的想法是拆分 SLQ 字符串和執行代碼,因為我的原始 SQL 具有比此問題中的示例更多的字符,我想保持 VBA 的結構如本問題中所述。
選項1:
使用CONCATENATE
function 將查詢拆分為多個部分可以刪除正確運行查詢所需的空白。
因此,根據查詢而不是=CONCATENATE(C2,C3)
您需要使用=CONCATENATE(C2," ",C3)
。
選項 2:
如果上述解決方案不起作用,您也可以通過變通方法解決問題,並將Cell C1
中的CONCATENATE
function 作為值復制並粘貼到另一個單元格中:
Sub Get_Data_from_DWH()
Sheet1.Range("C4").ClearContents
Sheet1.Range("C1").Copy
Sheet1.Range("C4").Cells.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set conn = New ADODB.Connection
conn.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver}; SERVER=XX.XXX.XXX.XX; DATABASE=bi; UID=testuser; PWD=test; OPTION=3"
conn.Open
strSQL = Sheet1.Range("C4")
Set rs = New ADODB.Recordset
rs.Open strSQL, conn, adOpenStatic
Sheet1.Range("D1").CopyFromRecordset rs
rs.Close
conn.Close
End Sub
在評論中討論了對 Excel 單元沒有限制。
對於簡單的文本沒有限制,但公式的輸入是有限的。
在問題的特定情況下,公式是必要的,因為Cell B1
中的條目應該是用戶可以隨時更改的變量。
因此,我認為唯一的方法是
a) 將 SQL 語句與執行的 VBA 代碼分開
b) 使用超過 255 個字符的查詢
c) 將 Excel 單元格中的條目作為變量應用
是上述解決方案之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.