取消选中VBA中的checkbox和相应的数据

我正在尝试编写一个VBA代码,它将取消选中Excel中工作表上的所有checkbox,并从checkbox左侧的单元格中删除数据(这是checkbox被选中时从另一个macros填充的date) 。

我的checkbox来自表单工具栏。 我可以取消框,但一旦我插入代码来删除我得到的date

运行时错误“1004”“无法获得工作表类的checkbox属性”。

以下是我正在尝试使用的代码:

Sub ClearAllCheckboxes() Dim Answer As String Dim MyNote As String Dim CB As Object Dim LRange As String Dim cBox As CheckBox LName = Application.Caller Set cBox = ActiveSheet.CheckBoxes(LName) MyNote = "This will Clear all CheckBoxes Proceed? " Answer = MsgBox(MyNote, vbQuestion + vbYesNo, "???") LRange = "F" & CStr(LRow) If Answer = vbNo Then Exit Sub Else For Each CB In ActiveSheet.CheckBoxes CB.Value = xlOff If cBox.Value = 0 Then ActiveSheet.Range(LRange).Value = Null End If Next CB End If End Sub 

下面是在checkbox中使用的代码添加date并将信息logging在另一个工作表中:

 Sub Process_CheckBox() Dim cBox As CheckBox Dim LRow As Integer Dim LColumn As Integer Dim RRow As Integer Dim LRange As String Dim RRange As String Dim ERange As String Dim FRange As String LName = Application.Caller Set cBox = ActiveSheet.CheckBoxes(LName) 'Find row that checkbox resides in LRow = cBox.TopLeftCell.Row LRange = "F" & CStr(LRow) RRow = cBox.TopLeftCell.Row RRange = "B" & CStr(RRow) ERange = "E" & CStr(RRow) FRange = "F" & CStr(RRow) 'Change date in column B, if checkbox is checked If cBox.Value > 0 Then ActiveSheet.Range(LRange).Value = Date ActiveSheet.Range(RRange).Select Application.CutCopyMode = False Selection.Copy Sheets("Log").Select Range("A" & ActiveSheet.Rows.Count). _ End(xlUp).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Columns("A:A").EntireColumn.AutoFit Sheets("Daily").Select ActiveSheet.Range(ERange).Select Application.CutCopyMode = False Selection.Copy Sheets("Log").Select Range("D" & ActiveSheet.Rows.Count). _ End(xlUp).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Daily").Select ActiveSheet.Range(FRange).Select Application.CutCopyMode = False Selection.Copy Sheets("Log").Select Range("C" & ActiveSheet.Rows.Count). _ End(xlUp).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False 'Clear date in column B, if checkbox is unchecked Else ActiveSheet.Range(LRange).Value = Null End If End Sub 

根据你的描述,这应该做的工作。
几点:

  • 如果可能,避免使用ActiveSheet。 直接参考有问题的表格或使用Me. 如果代码在工作表上。 例如For Each cBox In Me.CheckBoxes
  • 您没有将LRow添加到ClearAllCheckBoxes函数,这是缺less的地方。 如果直接引用cBox.TopLeftCell.Row.Column值,则不需要它。
  • 您不需要将每个函数调用保存到一个variables。
    • 而不是: LName = Application.Caller, Set cBox = ActiveSheet.CheckBoxes(LName)
    • 做: Set cBox = ActiveSheet.CheckBoxes(Application.Caller)
  • 同样, If以后不再使用答案,则可以直接在If语句中使用Msgbox
  • 在尝试设置和获取它的值时,通常不需要引用对象的Value属性,仅仅是对象。
  • 您可以在一行上标注多个variables。 只要确保在每个variables名旁边放置一个as <type> ,或者没有它的那个将被标注为变体。
  • 你不需要把你正在循环的variables放在Next语句之后(除非你有一堆行,他们看起来很混乱)。
  • 下面的colOffsetvariables可以用一个整数代替。 我不知道你的date单元格有多远,所以我把它放在里面。在我的testing表中,它是盒子右边的一个单元格。

 Sub ClearAllCheckboxes() Dim cBox As CheckBox, colOffset as Integer colOffset= 1 'You need to set this to however far away the date cell is from your checkbox If MsgBox("This will Clear all CheckBoxes Proceed? ", vbQuestion + vbYesNo, "???") = vbYes Then For Each cBox In ActiveSheet.CheckBoxes cBox = xlOff ActiveSheet.Cells(cBox.TopLeftCell.Row,cBox.TopLeftCell.Column + colOffset) = Null Next End If End Sub 

如果你要debugging这个,你可能会发现LNameError 2023值为Error 2023 。 当我在debugging模式下使用F8步执行此代码时,这就是我所遇到的情况,这会在下一行中引发错误Set cBox = ...

 LName = Application.Caller Set cBox = ActiveSheet.CheckBoxes(LName) 

我不清楚你在这里做什么或者如何调用这个程序。 当你一步一步来, LName的价值是什么,你期望它是什么?

请注意,此行需要CheckBoxes集合中的string(名称)或整数/索引值:

 Set cBox = ActiveSheet.CheckBoxes(LName) 

如果确保传递给Lname的值不是错误值并且它正确地引用了ActiveSheet上的CheckBox ,则代码应该按预期工作。