我使用的是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与工作表具有相同的名称。我现在没有任何错误,但是当我运行它时,它并没有清除我请求的任何单元格的内容。我似乎无法发现为什么这样做,如果有人可以发现它并让我知道,那就太好了。谢谢:)
答案 0 :(得分:1)
您的代码肯定将“ ws.name”视为文字字符串,因为它用双引号引起来。单击复选框,可以直接将 ClearContent 变量设置为true或false。这样,您不必测试其价值。
答案 1 :(得分:1)
您的代码有两个问题:
我认为这里可能存在的问题是了解Excel中复选框的名称:
您在复选框旁边看到的文本不是该复选框的实际名称。您可以通过以下方式为复选框指定名称:右键单击,然后在左上方的框中输入所需名称作为选择名称。
使用此示例代码查看您的复选框实际使用的名称和显示文本:
For Each CheckBox In Sheets("Summary").CheckBoxes
MsgBox "Name: " & CheckBox.Name & " Text: " & CheckBox.Text
Next CheckBox
它将产生类似这样的内容:
如果我是正确的话,要解决您的问题,您必须为复选框提供正确的名称(工作表的名称),或者不要比较Name
,而应使用Text
属性比较复选框。
复选框的值不是True
或False
,但是复选框的值可以是xlOn
或xlOff
。因此,请勿测试True
或False
,而要使用正确的常数。
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