VBA查询基于单元格的条件

时间:2019-08-07 14:29:13

标签: sql excel vba excel-2010

我正在尝试编写查询某些值的VBA代码。 我的SQL查询在WHERE语句中有2个条件。

  • B列中的值在查询中,因此没有问题。

  • A列中的值是一个以数字开头的代码,但包含字母,因此应视为工作“ 6F3S”的字符串;具体来说:database.columnA ='6F3S'。

我的问题来自于这样一个事实,我想将工作表“ 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$7")).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

不幸的是,我一直收到

  

运行时错误'13':类型不匹配   我真正陷入困境的地方。

当我尝试调试时,它出现在这里:

.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')")

但是我不确定是什么原因引起的。

有人可以帮我解决这个问题吗?

非常感谢。

注意:我目前正在使用excel 2010

1 个答案:

答案 0 :(得分:2)

您需要从字符串中取出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