变量在IN子句中不起作用

时间:2017-10-28 14:05:26

标签: mysql excel vba postgresql

此代码使用Excel2010 VBA编写并查询PostGreSQL表

我在VBA中有以下代码创建了一个我想在我的SQL查询中使用的变量,但我无法使用IN子句接受VBA变量的SQL查询

此代码创建我想要使用的变量并且工作正常。它允许我选择我需要查询的特定单元格

Dim StaffID As Range
Dim ID As Range
Dim LR As Long
Dim SelectedID As String

'Count number of rows to search
LR = Worksheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
On Error Resume Next    'if only 1 row

'Store Data from here
Set StaffID = ThisWorkbook.Sheets("Sheet1").Range("B2:B" & LR)

'Loop through each cell in Range and look for any character in column A
'then store offset cell value using comma delimiter
For Each ID In Worksheets("Sheet1").Range("A2:A" & LR).Cells
    If ID.Value > 0 Then
        SelectedID = SelectedID & "," & ID.Offset(, 1).Value
    End If
Next ID

'Remove first delimiter from string (,)
 SelectedID = Right(SelectedID, Len(SelectedID) - 1)

SelectedID的输出示例= 6,7,8,6452

我现在想使用IN子句将它添加到我的查询中,但它不起作用。有没有人有解决方案或解决方法。

Sheets("Sheet2").Select
Range("A1").Select
Dim rs As Recordset

Dim t As String
t = "SELECT DISTINCT s.entity_id, u.login_name, s.role " _
            & "FROM staff s INNER JOIN user u ON s.entity_id=u.staff_id " _
            & "WHERE u.staff_id IN (SelectedID) " _

Set rs = conn.Execute(t)
With ActiveSheet.QueryTables.Add(Connection:=rs, Destination:=Range("A1"))
    .Refresh
End With

rs.Close

2 个答案:

答案 0 :(得分:2)

目前,您将字符串'SelectedID'直接放入查询中。你的VBA需要这样的东西:

t = "SELECT DISTINCT s.entity_id, u.login_name, s.role " _
            & "FROM staff s INNER JOIN user u ON s.entity_id=u.staff_id " _
            & "WHERE u.staff_id IN (" & SelectedID & ")"

答案 1 :(得分:0)

Rows.Count应该是完全合格的With ThisWorkbook.Worksheets("Sheet1")并且完全符合条件会使您的代码更好地阅读。

Function getSelectedIDSQL() As String
    Dim ID As Range, StaffID As Range
    Dim SelectedID As String

    With ThisWorkbook.Worksheets("Sheet1")
        For Each ID In .Range("A2" & .Range("A" & .Rows.Count).End(xlUp))
            If ID.Value > 0 Then SelectedID = SelectedID & "," & ID.Offset(, 1).Value
        Next
    End With

    If Len(SelectedID) Then getSelectedIDSQL = Right(SelectedID, Len(SelectedID) - 1)

End Function