簡體   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