繁体   English   中英

使用 VBA 在 Excel 单元中运行 SQL 语句

[英]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 C2Cell C3中将查询随机拆分为两部分,并在Cell C1中使用CONCATENATE(C2,C3)来组合查询的两个部分。

当我现在运行VBA时, runtime error '-2147217887 (80040e21)'


我猜VBA无法处理Cell C1中的CONCATENATE(C2,C3)
因此,我想知道是否有其他方法可以解决此问题?


笔记:
我知道我可以将 SQL 直接放入 VBA 代码中。 但是,我的想法是拆分 SLQ 字符串和执行代码,因为我的原始 SQL 具有比此问题中的示例更多的字符,我想保持 VBA 的结构如本问题中所述。

您从哪里得知 excel 单元限制为 265 个字符的概念?

Excel 365:这是 C1 中的 313 个字符: 在此处输入图像描述

这是单元格 A1 中的整个 SQL 查询: 在此处输入图像描述

选项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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM