【问题标题】:Setting Up Mulitple CheckBoxes on Userform Intialization在用户窗体初始化时设置多个复选框
【发布时间】:2020-07-21 02:45:00
【问题描述】:

这里是新的(第一篇文章),对 vba excel 也很陌生,我遇到了一个我正在努力解决的绊脚石。如果我能在这里找到帮助,我将非常感激!

我有一个包含 90 个复选框的用户表单。在表单初始化时,我想将所有复选框设置为 TRUE 或 FALSE,具体取决于特定工作表上的单元格中包含的值,我可以这样做,我现在必须为另外 89 个复选框执行此操作,其中当前的格式将变得笨拙。

我正在寻找有关如何以更简洁的方式实现这一点的建议。

谢谢!

Private Sub UserForm_Initialize()

    Dim chRange As Range
    Dim ws As Worksheet
    Dim PDI_No As String
    Dim Row As Integer
    Dim rfind1 As Range
    Dim Col_Ltr1 As String

    Set ws = Worksheets("Master_Log")
    Set chRange = ws.Range("A:A")
    PDI_No = UpdateRecord.ComboBox1.Value
    Row = Application.WorksheetFunction.Match(PDI_No, chRange, 0) 'finds row number
    With Worksheets("Master_Log").Range("A1:DZ1")
        Set rfind1 = .find(What:=CheckBox1.Caption, LookAt:=xlWhole, MatchCase:=False, 
                      SearchFormat:=False) 'finds column number
       Col_Ltr1 = Split((Columns(rfind1.Column).Address(, 0)), ":")(0) 'changes column number to a 
                  letter
       cellposition1 = Col_Ltr1 & Row 'range value

            If ws.Range(cellposition1) = CheckBox1.Caption Then
                CheckBox1.Value = True
                    Else
                CheckBox1.Value = False
            End If
        End With
End Sub

【问题讨论】:

  • 使用循环来循环每个使用match的值而不是find。这些在表格上吗?
  • 什么是UpdateRecord
  • 他们被命名为CheckBox1, CheckBox2.. .. CheckBox90
  • 顺便说一句,您知道使用选中的列表框比使用 90 个复选框更好吗?
  • 在循环中使用类似Me.Controls("Checkbox" & i)的东西

标签: excel vba checkbox


【解决方案1】:

你可以这样做(假设你的复选框都有一个一致的名称):

Private Sub UserForm_Initialize()

    Dim ws As Worksheet
    Dim PDI_No As String
    Dim theRow, theCol, i As Long, cb As Object

    Set ws = Worksheets("Master_Log")
    PDI_No = UpdateRecord.ComboBox1.Value
    theRow = Application.Match(PDI_No, ws.Range("A:A"), 0) 'finds row number

    If Not IsError(theRow) Then
        For i = 1 To 90
            Set cb = Me.Controls("CheckBox" & i) '<<<<<
            theCol = Application.Match(cb.Caption, ws.Range("A1:DZ1"), 0)
            If Not IsError(theCol) Then
                cb.Value = (ws.Cells(theRow, theCol).Value = cb.Caption)
            Else
                'no column match
            End If
        Next i
    Else
        'no row match...
    End If

End Sub

【讨论】:

    【解决方案2】:

    您可以循环浏览用户窗体上的所有控件,特别是寻找复选框,如下所示:

    Private Sub CycleThroughCheckboxes
    Dim x As Control
    Dim r As Long
    Dim result as Boolean
    For Each x In UserForm1.Controls
        If TypeName(x) = "CheckBox" Then
            x.Value = true ' or false - Do your find logic here using x.Caption
        End If
    Next x
    End Sub
    

    这样做的好处是,如果您添加/删除了一些复选框,则无需在以后继续计数和更改代码。

    【讨论】:

    • 谢谢,我使用了 Tim Williams 代码,它运行良好。当我有兴趣时,我会尝试这种方法。
    【解决方案3】:

    我不喜欢相信所有 90 个复选框都以连续数字命名的想法。下面的循环将遍历表单的所有控件并检查类型。

    Dim ctrl As Control
    For Each ctrl In Me.Controls
        if TypeName(ctrl) = "CheckBox" then
            ' rest of the logic "stolen" from Ted Willams answer:
            theCol = Application.Match(ctrl.Caption, ws.Range("A1:DZ1"), 0)
            If Not IsError(theCol) Then
                ctrl.Value = (ws.Cells(theRow, theCol).Value = ctrl.Caption)
            Else
                'no column match
            End If
        End If
    Next ctrl
    

    【讨论】:

      猜你喜欢
      • 2016-02-02
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      相关资源
      最近更新 更多