【问题标题】:Unchecking Check boxes and corresponding data in VBA取消选中 VBA 中的复选框和相应数据
【发布时间】:2013-11-16 09:53:11
【问题描述】:

我正在尝试编写一个 VBA 代码,该代码将取消选中 Excel 中工作表上的所有复选框,并删除复选框左侧单元格中的数据(这是一个从另一个宏填充的日期,当复选框已检查)。

我的复选框来自表单工具栏。我可以取消选中这些框,但只要我插入代码以删除我得到的日期

运行时错误“1004”“无法获取工作表类的复选框属性”。

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

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

这是复选框中用于添加日期并将信息记录在另一个工作表中的代码:

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

【问题讨论】:

  • 变量LRow的值在哪里设置? LRange 永远不会等于仅显示代码的有效范围地址。
  • 另外,什么在调用这个函数(正如@DavidZemens 在下面询问的那样,运行它会导致错误,除非调用它的对象与复选框同名)?而且这不会总是将 cBox 设置为 FALSE 并始终清除日期吗?
  • LRow 上的好消息。我已经调整为将 DIM LRow 添加为整数,但仍然出现错误。我通过表单工具栏创建的工作表上的按钮调用代码。我对 VBA 很陌生,所以我从我编写的代码中提取了很多这些内容,以添加选中复选框的日期并在未选中时将其删除。我希望按钮一次将其全部删除。
  • 这是我用于复选框的代码。它在另一张表中添加日期和记录信息:

标签: excel vba checkbox


【解决方案1】:

根据您的描述,这应该可以完成工作。
几点:

  • 尽可能避免使用 ActiveSheet。如果代码在工作表上,请直接参考相关工作表或使用Me.。例如For Each cBox In Me.CheckBoxes
  • 您没有将 LRow 添加到 ClearAllCheckBoxes 函数中,这是它缺少的地方。如果您直接引用 cBox.TopLeftCell.Row.Column 值,则不需要它。
  • 您不需要将每个函数调用都保存到一个变量中。
    • 代替:LName = Application.Caller, Set cBox = ActiveSheet.CheckBoxes(LName)
    • 做:Set cBox = ActiveSheet.CheckBoxes(Application.Caller)
  • 同样,如果您以后不再使用答案,您可以直接在If 语句中使用Msgbox
  • 在尝试设置和获取对象的值时,通常不需要引用对象的 Value 属性,只需引用对象即可。
  • 您可以在一行上标注多个变量。只需确保在每个变量名称旁边加上 as <type>,否则没有它的变量将被标注为变量。
  • 您无需将正在循环的变量放在 Next 语句之后(除非您连续有一堆并且看起来很混乱)。
  • 下面的 colOffset 变量可以用整数代替。我不知道你的日期单元格有多远,所以我把它放进去。在我的测试表中,它是框右侧的一个单元格。


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

【讨论】:

  • 谢谢!工作完美,解决了很多问题!
【解决方案2】:

如果您要对此进行调试,您可能会发现LName 的值为Error 2023。当我在调试模式下使用F8 单步执行此代码时,这就是发生在我身上的事情,这会在下一行Set cBox = ... 中引发错误

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

我不清楚您在这里做什么或如何调用此过程。当您逐步了解它时,LName 的值是多少?您期望它是什么?

请注意,此行需要来自 CheckBoxes 集合的字符串(名称)或整数/索引值:

Set cBox = ActiveSheet.CheckBoxes(LName)

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

【讨论】:

  • cBox 由 LName 定义,稍后在For Each 循环中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多