Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态检查与工作表同名的复选框-VBA Excel_Vba_Excel_Checkbox_Userform - Fatal编程技术网

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

动态检查与工作表同名的复选框-VBA Excel,vba,excel,checkbox,userform,Vba,Excel,Checkbox,Userform,我在excel上,我有大约30个UserForm复选框,每个复选框都位于一个名为“摘要”的页面上的一个大栏中。每一个都对应一个工作表。我正在尝试循环检查这些复选框,以查看哪些已勾选,哪些未勾选。我已经在所有工作表的循环中放置了一些代码,这是不起作用的部分: Private Sub Run_Click() Dim SummaryFirstBlankRow As Integer Dim LastRow As Integer Dim LastRowH As Integer Dim rng As R

我在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”。我尝试过从引号中删除它,以及其他各种方法,如“checkbox”(“ws.Name”)”,但它们似乎都有相同的问题

我发帖是想看看是否有人能给我提供另一种方法,或者告诉我哪里出了问题,因为我认为我还没有完全理解语法

感谢您的帮助。提前感谢:)

更新


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

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

您的代码明确地将“ws.name”视为文字字符串,因为它包含在双引号中。单击复选框后,您可以直接将ClearContent变量设置为true或false。这样您就不必测试其值。

您的代码有两个问题:

方面1:名称还是文本? 我认为这里可能存在的问题是理解Excel中复选框的名称:

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

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

For Each CheckBox In Sheets("Summary").CheckBoxes
    MsgBox "Name: " & CheckBox.Name & " Text: " & CheckBox.Text
Next CheckBox
它将产生如下结果:

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

方面2:值不是真/假 复选框的值不是
True
False
,但复选框的值可以是
xlOn
xlOff
。因此,不要测试
True
False
,而是使用正确的常量

使用显示的文本而不是名称并使用正确的值常量工作代码
有没有一种方法可以复制表单控件的复选框?@George我已经更新了我的答案,以便对表单控件执行相同的操作,希望这有帮助……:)将
Value
False
进行复制将不起作用。必须使用
xlOff
常量。使用
.Shapes(ws.Name)
有什么问题?“对象不支持此属性或方法”我们在代码中看不到
ws
的来源。
ws
在何处以及如何初始化?我已经更新了代码,因此您可以更容易地看到我做了什么/我正在尝试做什么。我已尝试将形状(ws.Name)更改为复选框(ws.Name)。。。但我仍然收到一条错误消息:“无法获取工作表类的checkbox属性”我再次更新了代码,我非常确信循环等没有问题。我唯一能想到的是,以下内容不适用于表单控件复选框(仅适用于ActiveX)
CheckBox.name=ws.name,然后如果CheckBox.Value=False,那么ClearContent=True
我该怎么做?
code
Private Sub CheckBox1\u Click()ClearContent=IIf(CheckBox1.Value,True,False)终点Sub@matley我建议修改您的答案,以包含您评论中包含的代码。问题在于,我有很多复选框,即使我想手动为每个复选框编写代码,我有一个系统,有人可以添加一个新工作表,它会自动生成一个带有新工作表标题/名称的新复选框,因此我想我需要编写一段新代码来循环访问所有复选框以更改其属性?请尝试
ActiveWorkbook.Sheets(“Summary”).Shapes(ws.name).OLEFormat.Object.Value
而不是
ActiveWorkbook.Sheets(“摘要”)。复选框(ws.name)。Value
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