基于单元格的条件查询

Query with conditions based on cells

我正在尝试编写查询某些值的 VBA 代码。

我的 SQL 查询在 WHERE 语句中有两个条件。

我的问题是我想将 sheet "Input_sheet" 单元格 D1 中的元素 6F3S 外包,以便用户可以根据需要用其他代码更改它。

到目前为止,这是我的代码:

Sub Query1()
    Dim ValueCellD1 As String
    ValueCellD1 = Worksheets("Input_Sheet").Range("D1").Value
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "FFFF;DSN=XXXXXXXXXXXX;", Destination:=Range("$A")).QueryTable
        .CommandText = Array( _
        "SELECT database.columnA, database.columnB, database.columnC" _
        & Chr(13) & "" & Chr(10) & _
        "FROM IMPALA.database database" _
        & Chr(13) & "" & Chr(10) & _
        "WHERE (database.columnA=ValueCellD1) AND (database.columnB='London')")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = True
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "YYYYYYYYYYYYYYYYY"
        .Refresh BackgroundQuery:=False
    End With
End Sub

我收到了

Run-time error '13': Type mismatch

当我尝试调试时,它出现在此处:

.CommandText = Array( _
            "SELECT database.columnA, database.columnB, database.columnC" _
            & Chr(13) & "" & Chr(10) & _
            "FROM IMPALA.database database" _
            & Chr(13) & "" & Chr(10) & _
            "WHERE (database.columnA=ValueCellD1) AND (database.columnB='London')")

注意:我目前使用的是Excel2010

您需要从字符串中取出 ValueCellD1,以便将其识别为变量。

.CommandText = Array( _
        "SELECT database.columnA, database.columnB, database.columnC" _
        & Chr(13) & "" & Chr(10) & _
        "FROM IMPALA.database database" _
        & Chr(13) & "" & Chr(10) & _
        "WHERE (database.columnA='" & ValueCellD1 & "') AND (database.columnB='London')")

其实我不知道为什么要在字符串中插入 & Chr(13) & "" & Chr(10) &。以下内容也应该有效:

.CommandText = Array( _
        "SELECT database.columnA, database.columnB, database.columnC " _
        "FROM IMPALA.database database " _
        "WHERE (database.columnA='" & ValueCellD1 & "') AND (database.columnB='London')")

请注意,如果您将单元格值读入变量

ValueCellD1 = Worksheets("Input_Sheet").Range("D1").Value

并将其推送到您的 SQL 命令中而不验证单元格值,那么任何可以在 D1 中编辑单元格值的人都可以轻松攻击您的数据库和 运行 任何 SQL 命令他喜欢(例如删除它)。 永远不要相信用户输入。始终验证它

参见 https://en.wikipedia.org/wiki/SQL_injection