动态检查与工作表同名的复选框-VBA Excel

时间:2018-09-05 10:54:45

标签: excel vba excel-vba checkbox userform

我使用的是excel,我有大约30个UserForm复选框,每个复选框位于大列中称为“摘要”的页面上。每个都对应一个工作表。我试图遍历这些复选框,以查看哪些已被选中,而没有被选中。我在所有工作表的循环中放入了一些代码,这是行不通的:

  Private Sub Run_Click()
Dim SummaryFirstBlankRow As Integer
Dim LastRow As Integer
Dim LastRowH As Integer
Dim rng As Range
Dim SumOfHours As Variant
Dim EndLoop As Boolean
Dim DupeRowNo As Integer
Dim RowNo2 As Integer
Dim ClearContent As Boolean
Dim cbtrue As Boolean
Dim ws As Worksheet


cbtrue = False
    For Each ws In ActiveWorkbook.Worksheets



        LastRowH = ws.Cells(Rows.Count, 8).End(xlUp).Offset(1, 0).Row


    'If ActiveWorkbook.Sheets("Summary").CheckBoxes(ws.name).Value = False Then ' looks to see if ws.names' checkbox is checked or not
     '               ClearContent = True 'if not checked, sets clear content to true
    'End If

    For Each CheckBox In Sheets("Summary").CheckBoxes
        If CheckBox.name = ws.name Then
            If CheckBox.Value = False Then
                ClearContent = True
            End If
        End If
    Next CheckBox
        If ClearContent = True Then
            For c = 1 To LastRowH   'if not checked, looks on current worksheet (within loop) and if any "Y" or "y" vals, clears them
                If ws.Range("H" & c).Value = "Y" Or ws.Range("H" & c).Value = "y" Then
                    ws.Range("H" & c).ClearContents
                End If
            Next
        End If
    ...

cbtrue只是一个变量,以查看复选框是否存在,因此,如果存在,它将转到if语句,这时它将确定是否选中了该复选框,并根据此内容保存ClearContent变量(稍后在代码中使用)。

问题在于,当涉及到“ Shapes(“ ws.Name”)”时,ws.name只是每个循环上工作表的名称。因此,在循环的第一轮中,它将是“摘要” ...但是,我认为它实际上是在寻找显然不存在的表“ ws.name”。我尝试将其从引号和其他各种方法中删除,例如“ Checkboxes(“ ws.Name”)”,但似乎它们都存在相同的问题。

我正在发布信息,以查看是否有人可以为我提供另一种方法,或者告诉我我哪里出了问题,因为我认为我没有完全理解语法。

感谢您的帮助。在此先感谢:)

更新

我在@Xabier的帮助下更改了代码(我添加了一个额外的if语句,以确保CheckBox与工作表具有相同的名称。我现在没有任何错误,但是当我运行它时,它并没有清除我请求的任何单元格的内容。我似乎无法发现为什么这样做,如果有人可以发现它并让我知道,那就太好了。谢谢:)

3 个答案:

答案 0 :(得分:1)

您的代码肯定将“ ws.name”视为文字字符串,因为它用双引号引起来。单击复选框,可以直接将 ClearContent 变量设置为true或false。这样,您不必测试其价值。

答案 1 :(得分:1)

您的代码有两个问题:

方面1:名称还是文字?

我认为这里可能存在的问题是了解Excel中复选框的名称:

enter image description here

您在复选框旁边看到的文本不是该复选框的实际名称。您可以通过以下方式为复选框指定名称:右键单击,然后在左上方的框中输入所需名称作为选择名称。

使用此示例代码查看您的复选框实际使用的名称和显示文本:

For Each CheckBox In Sheets("Summary").CheckBoxes
    MsgBox "Name: " & CheckBox.Name & " Text: " & CheckBox.Text
Next CheckBox

它将产生类似这样的内容:

enter image description here

如果我是正确的话,要解决您的问题,您必须为复选框提供正确的名称(工作表的名称),或者不要比较Name,而应使用Text属性比较复选框。

方面2:值不是true / false

复选框的值不是TrueFalse,但是复选框的值可以是xlOnxlOff。因此,请勿测试TrueFalse,而要使用正确的常数。

使用显示的文本而不是名称并使用正确的值常量的工作代码

Dim ws As Worksheet
Dim ClearContent  As Boolean
Dim CheckBox As CheckBox

For Each ws In ActiveWorkbook.Worksheets

    ' Reset ClearContent for each Sheet
    ClearContent = False

    For Each CheckBox In Sheets("Summary").CheckBoxes
        ' Depending on your requests, compare either with Name or with Text
        If CheckBox.Text = ws.Name Then
            ' Use xlOff constant instead of False
            If CheckBox.Value = xlOff Then
                ClearContent = True
            End If

            ' We can exit the foreach loop when we found the correct checkbox
            Exit For
        End If
    Next CheckBox

    If ClearContent Then
        MsgBox "Going to clear " & ws.Name
    End If
Next ws

答案 2 :(得分:0)

下面的代码将向您展示如何在工作表上的ActiveX复选框之间循环,并验证它们是否已选中:

Sub Test()
    Dim obj As OLEObject

    For Each obj In Sheets("Summary").OLEObjects
    'loop through ActiveX Checkboxes on Worksheet "Summary"
        If obj.progID = "Forms.CheckBox.1" Then
        'is it a Checkbox?
            If obj.Object = False Then
            'is the checkbox unchecked
                ClearContent = True
            End If
        End If
    Next obj
End Sub

更新: 对于“表单控制”复选框,将执行以下操作:

Sub Test2()
    Dim cb As CheckBox

    For Each cb In Sheets("Summary").CheckBoxes
        If cb.Value = False Then
            ClearContent = True
        End If
    Next cb
End Sub