[英]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.