从阵列VBA动态创建复选框

时间:2018-08-20 17:04:13

标签: arrays excel vba excel-vba checkbox

我的用户表单如下:

enter image description here

当我选择想要的数据库并单击选择时,它将带我到另一页:

enter image description here

所有这些复选框的创建取决于sql查询的输出。

在此示例中,SQL查询为:

ID            NAME
8             AI_EQ
14            BB_EQ
19            DM_EQ
22            GD_EQ

以此类推...

我正在选择按钮中添加以下复选框(来自记录集rst):

'creating checkboxes    
If Not rst.EOF And Not rst.BOF Then
       rst.MoveFirst
        i = 0
        Do
      With MultiPage1.Pages(1).Controls.Add("Forms.Checkbox.1", "Checkbox" & i)
.Top = yPos
.Left = 7
.Caption = rst![name]
.Width = 450
        .Height = 24
        .WordWrap = True
        .Value = False
        yPos = yPos + 17
  i = i + 1
      rst.MoveNext
End With          
            Loop Until rst.EOF
End If
 rst.Close
 cnn.Close  
Set rst = Nothing
Set cnn = Nothing

然后,我希望“完成”按钮考虑用户选择的任何复选框。例如,如果他选择了前两个,则我希望有“ 8,14” ID,这样我就可以将它们添加到新的SQL查询中。

我想我必须创建一个数组来实现这一目标,而不仅仅是拥有rst![name]。但是我创建它的尝试失败了,即使我正确地拥有了数组,我也不知道如何适应它以使其在选择ID时返回NAME

这就是我试图创建数组的方式(但是它没有返回任何内容)

 Dim MyArray() As Variant
For i = 0 To rst.RecordCount
MyArray = rst.GetRows(i)
rst.MoveNext
Next

任何提示/帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

由于复选框是动态创建的,因此执行此操作。

  1. 浏览所有控件并检查它们是否为复选框
  2. 检查是否已选中
  3. 检查他们在.Tag中是否有东西并将其存储在变量中。

代码

Private Sub CommandButton1_Click()
    Dim cCont As Control
    Dim cbString As String

    For Each cCont In Me.Controls
        If TypeName(cCont) = "CheckBox" Then
            If cCont.Value = True Then
                If cCont.Tag <> "" Then
                    If cbString = "" Then
                        cbString = cCont.Tag
                    Else
                        cbString = cbString & "," & cCont.Tag
                    End If
                End If
            End If
        End If
    Next cCont

    Debug.Print cbString
End Sub

但是要使其正常工作,请在创建复选框时,将.Tag属性设置为ID值。

With MultiPage1.Pages(1).Controls.Add("Forms.Checkbox.1", "Checkbox" & i)
    '
    '~~> Rest of the code
    '
    .Tag = rst![ID]
    '
    '~~> Rest of the code
    '
End With

答案 1 :(得分:0)

正如悉达多(Siddharth Rout)所说:

  'creating checkboxes    

If Not rst.EOF And Not rst.BOF Then
    rst.MoveFirst
    i = 0
    Do
        With MultiPage1.Pages(1).Controls.Add("Forms.Checkbox.1", "Checkbox" & i)
            .Top = yPos
            .Left = 7
            .Caption = rst![name]
            .Width = 450
            .Height = 24
            .WordWrap = True
            .Value = False
            yPos = yPos + 17
            .Tag = rst![ID]
            i = i + 1
            rst.MoveNext
        End With
    Loop Until rst.EOF
End If
rst.Close
cnn.Close  
Set rst = Nothing
Set cnn = Nothing