VBA中带有n个WHERE参数的SQL查询

如何解决VBA中带有n个WHERE参数的SQL查询

我正在使用ADO在VBA中运行SQL查询。我已经做了很多,一切正常。

但是,我正在进行更复杂的查询,在该查询中,我需要输入未知数量的条件字符串。简而言之:

SELECT * FROM database.dbo.table
WHERE Col1 IN (‘val1’,‘val2’,...,‘valn’)

我的工作表上有一组数据,每次都会更改。数据每次都具有相同的字符串格式,但是带有值的单元格数量有所不同。我想使用n语句中的WHERE个变量来执行上述查询

工作表中有5个变量的查询示例:

SELECT * FROM database.dbo.table
    WHERE Col1 IN (‘000165234’,‘000165238’,‘000165231’,‘000165232’,‘000165239’)

任何指向正确方向的指针都将受到赞赏。 我最大的问题是如何处理未知数量的变量。

约束:将始终是至少1个带值的单元格,并且永远不会超过60个。

注释:数据也存储在数组中,不一定需要打印在工作表上。

更新的代码

    Sub test()
    
        Dim ws1 As Worksheet
        Dim ws2 As Worksheet
        
        Set ws1 = ThisWorkbook.Worksheets("Sheet1")
        Set ws2 = ThisWorkbook.Worksheets("Sheet2")
        
        Dim fRow As Long
        Dim sRow As Integer
        Dim col As Integer
        Dim arr() As Variant
        Dim coll As New Collection
        
        col = 3
        sRow = 6
        
        With ws1
            fRow = .Cells(.Rows.Count,col).End(xlUp).Row
        End With
        
        With ws2
            fRow2 = .Cells(.Rows.Count,12).End(xlUp).Row
        End With
        
        
        For i = sRow To fRow
            With ws1
                ele1= .Cells(i,2).Value
                ele2= "000" & .Cells(i,4).Value
                If ele1<> "" Then
                    coll.Add Array(ele2)
                End If
            End With
        Next
        
        On Error GoTo gotcha
        
        ReDim arr(1 To coll.Count,1 To 2)
        
        For i = 1 To coll.Count
        
            arr(i,1) = coll(i)(0)
    
        Next
        
    gotcha:
        Debug.Print Err.number
    
        If Err.number = 9 Then
            MsgBox "Error"
            Exit Sub
        End If
    
        ws2.Range("L29:M" & fRow2).ClearContents
        ws2.Range("L29").Resize(UBound(arr,1),UBound(arr,2)).Value = arr
        
        Set conn = CreateObject("ADODB.Connection")
        
        Dim fRow3 As Long
    
        With ws2
            fRow3 = .Cells(.Rows.Count,13).End(xlUp).Row
        End With
        
      
        Dim CONNECTION As String
        Dim QUERY As String
        
        Dim WHERE As String
       
        'Set connection and SELECT query
        CONNECTION = "Provider=*.1;Persist Security Info=True;User ID=*; Password=*; Data Source=*;Initial Catalog=*"
           
    
        selectpart = "SELECT *FROM database.dbo.table "
          


       '### The error occurs here ###            
       conditionpart = "WHERE [COL1] IN ('" & Join(arr,"','") & "')"

       GetBreakerQuantitiesQuery = selectpart & vbNewLine & conditionpart
        
       QUERY = GetBreakerQuantitiesQuery
    
        conn.Open CONNECTION
    
        Set rs = CreateObject("ADODB.Recordset")
         
        rs.ActiveConnection = conn
        rs.Open QUERY
        
        ws.Range("T6").copyFromrecordset rs
        ws.Range("T6:AL6").copy
        ws.Range("N7").PasteSpecial xlPasteValues,xlPasteSpecialOperationNone,True,True
        ws.Range("T6:AL6").ClearContents
        ws.Range("L6").Select
            
        rs.Close
        conn.Close
        
        Set conn = nothing
        Set rs = nothing
        
    End Sub

解决方法

Dim sql as string,arr

arr = Array("000165231","000165232","000165239")

sql = "SELECT * FROM database.dbo.table WHERE Col1 IN ('" & Join(arr,"','") & "')"

'use sql variable for your query

使用一维数组:

For i = sRow To fRow
    With ws1
        If Len(.Cells(i,2).Value) > 0 Then
            coll.Add "000" & .Cells(i,4).Value
        End If
    End With
Next

On Error GoTo gotcha '??

ReDim arr(0 To coll.Count-1)

For i = 1 To coll.Count
    arr(i - 1) = coll(i)
Next

'....
ws2.Range("L29").Resize(UBound(arr) + 1,1).Value = Application.Transpose(arr)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?