【问题标题】:Dynamically Checking for Checkboxes with the same name as Worksheets -VBA Excel动态检查与 Worksheets -VBA Excel 同名的复选框
【发布时间】:2019-02-10 11:56:08
【问题描述】:

我在 excel 上,我有大约 30 个用户窗体复选框,每个复选框都位于一个名为“摘要”的页面上的一个大列中。每一个都对应一个工作表。我正在尝试遍历这些复选框以查看哪些已勾选,哪些未勾选。我在所有工作表的循环中放了一些代码,这是不起作用的位:

  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 与工作表具有相同的名称。我现在没有收到任何错误,但是当我运行它时,它没有清除我请求的任何单元格的内容。我似乎无法发现它为什么这样做,如果有人能发现它并告诉我,那就太好了。谢谢:)

【问题讨论】:

  • 使用.Shapes(ws.Name)有什么问题?
  • "对象不支持该属性或方法"
  • 好吧,我们在您的代码中看不到 ws 的来源。 ws 在哪里以及如何初始化?
  • 我已经更新了代码,所以你可以更容易地看到我做了什么/我想要做什么。我尝试将 Shapes(ws.Name) 更改为 CheckBoxes(ws.Name)... 但我仍然收到一条错误消息:“无法获取工作表类的 checkboxes 属性”
  • 我再次更新了代码,我非常确信循环等没有任何问题。我唯一能想到的是以下内容不适用于表单控制复选框(仅适用于 ActiveX )。 CheckBox.name = ws.name Then If CheckBox.Value = False Then ClearContent = True

标签: vba excel checkbox userform


【解决方案1】:

你的代码有两个问题:

方面 1:名称还是文本?

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

您在复选框旁边看到的文本不是复选框的实际名称。您可以通过单击鼠标右键选择复选框并在左上角的选择名称框中输入所需的名称来为复选框命名。

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

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

它会产生这样的东西:

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

方面2:值不真/假

复选框的值不是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】:

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

    【讨论】:

    • 我该怎么做?
    • code Private Sub CheckBox1_Click() ClearContent = IIf(CheckBox1.Value, True, False) End Sub
    • @matley 我建议修改您的答案以包含您的评论中包含的代码。
    • 问题在于,我有很多复选框,即使我想为每个复选框手动编码,我也有一个系统可以添加新工作表并自动生成一个新工作表带有新工作表标题/名称的复选框,所以我想我需要编写一些新代码来循环遍历所有复选框以更改它们的属性?
    • 试试ActiveWorkbook.Sheets("Summary").Shapes(ws.name).OLEFormat.Object.Value而不是ActiveWorkbook.Sheets("Summary").CheckBoxes(ws.name).Value
    【解决方案3】:

    以下代码将向您展示如何遍历工作表上的 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
    

    【讨论】:

    • 有没有办法为表单控制复选框复制这个?
    • @George 我已经更新了我的答案以对表单控件做同样的事情,希望这会有所帮助.. .:)
    • ValueFalse 组合在一起将不起作用。必须改用xlOff 常量。
    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 2011-08-31
    • 2020-08-07
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多