【问题标题】:Checkboxes for taking input for a sql query in VBA (userform-excel)用于在 VBA 中输入 sql 查询的复选框(userform-excel)
【发布时间】:2015-12-02 00:34:59
【问题描述】:

我正在尝试创建一个用户表单 - 它将具有不同年份的复选框和不同查询的命令按钮。因此,例如,如果用户选择了三个复选框 -1990、1993、1995,然后用户单击特定查询。然后该查询必须在该年执行,进入“该查询的where部分” 这是我的代码:-

*

  Private Sub CommandButton1_Click()
    Dim connection As New ADODB.connection
    Dim rst As New Recordset
    Dim strConnectionStr As String
    Dim Qry As String
    strConnectionStr = "Provider=SQLOLEDB;" & "DATA SOURCE=" & _
                      "INITIAL CATALOG=;" & _
                      "UID=; PWD="
    Qry = "  SELECT d.Year,d.[University name],d.[School name], COUNT(distinct d.Title) 'Number of paper published'from [dbo].[Ashish$] d where [Business/Non-business]='1'group by d.Year,d.[University name],d.[School name]  order by d.[Year], [Number of paper published] desc;"

    ActiveSheet.Cells.ClearContents
    connection.Open strConnectionStr
    rst.Open Qry, connection
    For iCols = 0 To rst.Fields.Count - 1
        Sheets("Query1").Cells(1, iCols + 1).Value = rst.Fields(iCols).Name
    Next
    Sheets("Query1").Range("A2").CopyFromRecordset rst*`


    rst.Close
    connection.Close

    End Sub


Above is the code for normal command buttons without check box . Below is the code for taking user inputs by checkboxes ...

    Private Sub CommandButton1_Click()
    Dim connection As New ADODB.connection
    Dim rst As New Recordset
    Dim strConnectionStr As String
    Dim Qry As String
    Dim ctl As Control
    Dim i As Integer
    i = 0
    strConnectionStr = "Provider=SQLOLEDB;" & "DATA SOURCE=;" & _
                      "INITIAL CATALOG=;" & _
                      "UID=; PWD="
    If CheckBox6.Value = True Then
       year1 = CheckBox6.Caption
       i = i + 1
    End If
    If CheckBox5.Value = True Then
       year2 = CheckBox5.Caption
       i = i + 1
    End If

    Qry = "  SELECT d.Year,d.[University name],d.[School name], COUNT(distinct d.Title) 'Number of paper published'from [dbo].[Ashish$] d where [Business/Non-business]='1'  and d.Year=CheckBox6.Caption  group by d.Year,d.[University name],d.[School name]  order by d.[Year], [Number of paper published] desc;"

    ActiveSheet.Cells.ClearContents

    connection.Open strConnectionStr

    rst.Open Qry, connection

    For iCols = 0 To rst.Fields.Count - 1
        Sheets("Query1").Cells(1, iCols + 1).Value = rst.Fields(iCols).Name
    Next

    Sheets("Query1").Range("A2").CopyFromRecordset rst


    rst.Close
    connection.Close
    End Sub

ub

基本上我无法从复选框中获取值并在查询语句中使用它们。

我需要帮助。有人可以指导我吗?


编辑:以下最初是作为答案发布的:

If CheckBox1.Value = True Then
 y1 = CheckBox1.Caption
 i = i + 1
End If
If CheckBox2.Value = True Then
 y2 = CheckBox2.Caption
 i = i + 1
End If

If CheckBox3.Value = True Then
x1 = CheckBox3.Caption
j = j + 1
End If

If CheckBox4.Value = True Then
x2 = CheckBox4.Caption
j = j + 1
End If

If CheckBox5.Value = True Then
x3 = CheckBox5.Caption
j = j + 1
End If

If i = 0 Then
MsgBox "Select at least one year "
End If

If j = 0 Then
MsgBox "Select at least one journal "
End If


strConnectionStr = "Provider=SQLOLEDB;" & "DATA SOURCE=;" & _
                  "INITIAL CATALOG=;" & _
                  "UID=; PWD="
Qry = "  SELECT d.Year,d.[University name],d.[School name], COUNT(distinct d.Title) 'Number of paper published'from [dbo].[Ashish$] d where [Business/Non-business]='1' and "
Qry = Qry & "[Year] IN (" & y1 & "," & y2 & ") and [Name] IN  (" & x3 & "," & x4 & ") & vbCrLf"
Qry = Qry & "group by d.Year,d.[University name],d.[School name]  order by d.[Year], [Number of paper published] desc;"

ActiveSheet.Cells.ClearContents

connection.Open strConnectionStr

rst.Open Qry, connection

For iCols = 0 To rst.Fields.Count - 1
    Sheets("Query1").Cells(1, iCols + 1).Value = rst.Fields(iCols).Name
Next

Sheets("Query1").Range("A2").CopyFromRecordset rst


rst.Close
connection.Close
End Sub

以上是我的代码,问题发表在我的最后一条评论中

【问题讨论】:

  • 感谢“barrowc”的回复。现在,我可以在查询中使用变量。我还有几个问题:- 1. 如果我单击所有年份,则以下代码有效,但如果我选择其中任何一个,则不会 2. 如果 [name] 是“Academy of Science”。在执行查询时,它会在 'of' 3 附近显示语法错误。我希望它适用于任何选中的复选框
  • 我已经用更多代码更新了我的答案,并将您答案中的代码编辑到问题中

标签: sql vba checkbox input using


【解决方案1】:

就像...and d.Year=" & CheckBox6.Caption & " group by...一样简单

如果你想使用变量的值,那么它必须在双引号之外。然后,您可以使用 & 运算符将各个部分重新组合在一起。

但是:通过将字符串连接在一起来从用户输入构造 SQL 查询是自找麻烦。 SQL 注入可能是一种非常现实的可能性 - 请参阅 herehere

您可以将 ADODB Command objectParameters collection 结合使用,以安全的方式执行参数化查询。请参阅this answer 以了解如何操作


编辑:如果某些值是文本字符串,那么它们应该用单引号括起来,如下所示:

and [Name] IN ('" & x3 & "','" & x4 & "')

这将产生如下输出:

and [Name] IN ('Academy of Science','Foo')

如果只有一些变量可能有值,那么您需要以不同的方式构造 IN 子句:

Dim yearsChosen As String

If CheckBox1.Value = True Then
    yearsChosen = yearsChosen & "," & CheckBox1.Caption
    i = i + 1
End If
If CheckBox2.Value = True Then
    yearsChosen = yearsChosen & "," & CheckBox2.Caption
    i = i + 1
End If

' Check to see if anything was selected - if it was, remove the
' leading comma and add the AND [Year] IN part
If Len(yearsChosen <> 0) Then
    yearsChosen = " AND [Year] IN (" & Mid$(yearsChosen, 2) & ")"
End If

名称部分的工作方式类似,但您需要在值周围加上单引号:

namesChosen = namesChosen & ",'" & CheckBox5.Caption & "'"

构建 SQL 查询非常简单:

Qry = "  SELECT d.Year,d.[University name],d.[School name], COUNT(distinct d.Title) 'Number of paper published'from [dbo].[Ashish$] d where [Business/Non-business]='1' "
Qry = Qry & yearsChosen & namesChosen & vbCrLf
Qry = Qry & "group by d.Year,d.[University name],d.[School name]  order by d.[Year], [Number of paper published] desc;"

【讨论】:

  • *If CheckBox1.Value = True Then y1 = CheckBox1.Caption i = i + 1 End If CheckBox2.Value = True Then
猜你喜欢
  • 2011-09-16
  • 2023-03-05
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
相关资源
最近更新 更多