使用Excel VBA将多个值插入连接查询

时间:2017-09-28 12:40:28

标签: sql excel vba excel-vba tsql

我有一个有效的Excel电子表格,它使用VBA根据输入单个单元格的内容更改连接查询中的参数。它不能使用Excel参数来获取值,因为变量位于连接中而不是查询的where部分。所以我知道这在原则上是有效的,至少对于一个数据单元来说。

我现在需要创建一个新的电子表格,我需要将一系列数据放入查询中。

查询看起来像这样:

选择 * FROM TABLE_A ID在哪里 (' A&#39 ;, ' B&#39 ;, ' C&#39)

VBA从电子表格中的列中选取值A,B和C,目前看起来像这样:

Dim ID_Range As Range
Sheets("Data").Select
Set ID_Range = Sheets("Data").Range("A1:A10")
With ActiveWorkbook.Connections("Query from Database_A").ODBCConnection
    .BackgroundQuery = True
    .CommandText = Array( _
    "Select * FROM Table_A A WHERE A.ID in " "(" + ID_Range + ")")
    .CommandType = xlCmdSql
    .Connection = Array(Array( _
    ODBC;Description= ****
    .RefreshOnFileOpen = False
    .SavePassword = False
    .SourceConnectionFile = ""
    .SourceDataFile = ""
    .ServerCredentialsMethod = xlCredentialsMethodIntegrated
    .AlwaysUseConnectionFile = False
End With

我希望在删除公司特定信息时,我没有删除任何重要代码 运行此操作时会出现错误:下标超出范围

我需要做些什么才能让它发挥作用?

3 个答案:

答案 0 :(得分:0)

试试这样。

Dim ID_Range As Range
Dim vR() As String
Dim n As Integer
Dim strRange  As String
Sheets("Data").Select
Set ID_Range = Sheets("Data").Range("A1:A10")
For Each Rng In ID_Range
    n = n + 1
    ReDim Preserve vR(1 To n)
    vR(n) = "'" & Rng & "'"
Next Rng
strRange = Join(vR, ",")

With ActiveWorkbook.Connections("Query from Database_A").ODBCConnection
    .BackgroundQuery = True
    .CommandText = Array("Select * FROM Table_A A WHERE A.ID in (" & strRange & ")")

答案 1 :(得分:0)

如果您不具备ODBCConnection对象的特定需求(并且我不会在您的情况下看到它的优势),您可以使用ADODB甚至是旧的DAO来完成此操作!

' Create a recordset object.Dim rsPubs As ADODB.Recordset
Set rsPubs = New ADODB.Recordset

With rsPubs
' Assign the Connection object.
.ActiveConnection = cnPubs
' Extract the required records.
.Open "SELECT * FROM Authors"
' Copy the records into cell A1 on Sheet1.
Sheet1.Range("A1").CopyFromRecordset rsPubs

' Tidy up
.Close
End With

cnPubs.Close
Set rsPubs = Nothing
Set cnPubs = Nothing

(从https://support.microsoft.com/fr-fr/help/306125/how-to-import-data-from-microsoft-sql-server-into-microsoft-excel粘贴的代码示例)

答案 2 :(得分:0)

最好的方法是创建一个处理范围的函数

Function getCommaSeparatedList(Source As Range) As String
    Dim cell As Range
    Dim results As String
    For Each cell In Source
        results = results & "'" & cell.Value & "',"
    Next
    getCommaSeparatedList = Left(results, Len(results) - 1)
End Function