【问题标题】:Excel VBA - Create array from variable number of userform checkboxesExcel VBA - 从可变数量的用户表单复选框创建数组
【发布时间】:2017-06-19 23:37:00
【问题描述】:

我认为这没有我做的那么复杂,但作为 VBA 的新手,经过几天的谷歌搜索和使用不同的代码后,我无法找到答案。

我有一个宏:

  1. 在任何命名的文件夹路径中打开文件
  2. 在文件中搜索特定文本以查找特定部分的开头,即 A100
  3. 查找本节的结尾,即 A110(长度因文件而异)
  4. 将此范围内的单元格复制并粘贴到另一个特定范围内,即 O1:O10
  5. 为这个新的可变长度范围内的每个单元格填充一个复选框

我现在需要用户单击他们想要的复选框,然后将这些复选框的标题保存为一个数组,然后我可以稍后在宏中调用它。

即如果他们从复选框中单击狗、猫和鸟,输出将是狗、猫、鸟

由于范围和复选框数量的可变长度,我无法弄清楚如何让它遍历每个复选框并连接正确的值。

我认为可能有一种方法可以删除值的复制粘贴以填充用户窗体,但这是我可以在给定范围的可变长度的情况下找出该部分的唯一方法。

以下是在复制粘贴范围后生成用户表单的代码。

Private Sub UserForm_Initialize()

Dim curColumn   As Long
Dim i           As Long
Dim codeRow     As Long
Dim chkBox      As msforms.CheckBox

curColumn = 15
codeRow = Range("O20").End(xlUp).Row

For i = 1 To codeRow
Set chkBox = Me.Controls.Add("Forms.CheckBox.1", "CheckBox_" & i)
chkBox.Caption = Worksheets(1).Cells(i, curColumn).Value
chkBox.Left = 5
chkBox.Top = 5 + ((i - 1) * 20)
Next i

End Sub

【问题讨论】:

  • ListBox 控件可以有复选框stackoverflow.com/questions/10944064/…
  • 您可以随时迭代Me.Controls 集合并检查控件的类型/名称...但是,绝对的简洁解决方案是列表框,具有以下设计时属性: MultiSelect = 1ListStyle = 1,并在运行时将RowSource 属性设置为您的Range("O1:O" & coderow)
  • 谢谢!工作完美。将在下面发布更新的代码。

标签: vba excel checkbox userform


【解决方案1】:

插入模块代码。

Public vCheck()

表单代码中的波纹管。

Private Sub UserForm_Initialize()

Dim curColumn   As Long
Dim i           As Long
Dim codeRow     As Long
Dim chkBox      As msforms.CheckBox

curColumn = 15
codeRow = Range("O20").End(xlUp).Row

ReDim vCheck(0)
For i = 1 To codeRow
Set chkBox = Me.Controls.Add("Forms.CheckBox.1", "CheckBox_" & i)

ReDim Preserve vCheck(1 to i)
vCheck(i) = Worksheets(1).Cells(i, curColumn).Value
chkBox.Caption = vCheck(i)
chkBox.Left = 5
chkBox.Top = 5 + ((i - 1) * 20)
Next i

End Sub

【讨论】:

    【解决方案2】:

    列表框是要走的路。以下是其他人在同一问题上寻求帮助的更新代码:

    Private Sub UserForm_Initialize()
    
    Dim myLBox      As msforms.ListBox
    Dim codeRow As Long
    codeRow = Range("O20").End(xlUp).Row
    
    ListBox1.RowSource = "O1:O" & codeRow
    
    End Sub
    
    Private Sub CommandButton1_Click()
    Dim rRange As Range
    Dim lCount As Long   'Counter
    
    On Error GoTo ErrorHandle
    
    Set rRange = Range("P1")
    
    With ListBox1
       For lCount = 0 To .ListCount - 1
          If .Selected(lCount) = True Then
             rRange.Offset(lCount, 0).Value = .List(lCount)
          End If
       Next
    End With
    
    BeforeExit:
    Set rRange = Nothing
    Unload Me
    
    Exit Sub
    ErrorHandle:
    MsgBox Err.Description
    Resume BeforeExit
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2019-01-26
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 2016-06-16
      • 2014-06-15
      • 2019-01-17
      相关资源
      最近更新 更多