【问题标题】:Creating a macro which Select/ Unselect All checkboxes within a variable range as defined创建一个宏,该宏在定义的变量范围内选择/取消选择所有复选框
【发布时间】:2020-03-19 22:25:04
【问题描述】:

该宏旨在查找主复选框 (application.caller) 的位置,然后选择该列中最多 14 行以下的所有复选框。我的工作表在其他地方有各种复选框,当前宏检查工作表中的所有复选框。我做错了什么?

Sub SelectAll_Click()
'Select / Clear All macro
Dim xCheckBox As CheckBox, n As Variant, rng As Range, loc As Range, loc1 As Range
'Application.Caller.Name
n = ActiveSheet.CheckBoxes(Application.Caller).Name

With ActiveSheet

Set loc = ActiveSheet.CheckBoxes(Application.Caller).TopLeftCell
'Set loc1 = loc.Address
'MsgBox loc1
loc.Select
Set rng = Range(loc.Address, ActiveCell.Offset(13, 0))
MsgBox (rng.Address)
End With




For Each xCheckBox In Application.ActiveSheet.CheckBoxes
'MsgBox (xCheckBox.TopLeftCell.Address)
'With xCheckBox.Select
   If Not Intersect(loc, rng) Is Nothing Then

        If xCheckBox.Name <> Application.ActiveSheet.CheckBoxes(n).Name Then
       ' If Not Intersect(rngShp, rng) Is Nothing Then

        xCheckBox.Value = Application.ActiveSheet.CheckBoxes(n).Value
        End If

    End If
    'End With

    Next
    End Sub

【问题讨论】:

  • 你没有检查xCheckBox的位置。
  • 您好@SJR,感谢您的评论,您能说得更具体点吗?
  • 你不需要检查rngxcheckbox的交集吗?
  • 另外我建议不要使用ActiveCell,也不要使用.Select,参见How to avoid using Select in Excel VBA。这很容易失败并且不是很可靠。
  • 我尝试更改交点值,但出现错误。我如何编写确切的代码?

标签: excel vba checkbox


【解决方案1】:

以下情况适用于所有不是您单击的复选框的复选框。

If xCheckBox.Name <> Application.ActiveSheet.CheckBoxes(n).Name Then
    xCheckBox.Value = Application.ActiveSheet.CheckBoxes(n).Value
End If

您还需要检查xCheckBox.TopLeftCell 是否与您想要的范围rng 相交。所以它只适用于TopLeftCell 在范围内的所有其他复选框:

If xCheckBox.Name <> Application.ActiveSheet.CheckBoxes(n).Name And Not Intersect(xCheckBox.TopLeftCell, rng) Is Nothing Then
    xCheckBox.Value = Application.ActiveSheet.CheckBoxes(n).Value
End If

最后你的代码可能看起来像这样:

Option Explicit

Public Sub SelectAll_Click()
    Dim ws As Worksheet
    Set ws = ActiveSheet

    Dim MasterChkBox As CheckBox
    Set MasterChkBox = ws.CheckBoxes(Application.Caller)


    Dim MasterLocation As Range
    Set MasterLocation = ws.CheckBoxes(Application.Caller).TopLeftCell

    Dim Rng As Range
    Set Rng = MasterLocation.Resize(RowSize:=14)

    'MsgBox (Rng.Address)

    Dim xCheckBox As CheckBox
    For Each xCheckBox In ws.CheckBoxes
        If xCheckBox.Name <> MasterChkBox.Name And _
           Not Intersect(xCheckBox.TopLeftCell, Rng) Is Nothing Then

            xCheckBox.Value = MasterChkBox.Value

        End If
    Next xCheckBox
End Sub

图 1:如果您选中主框,它将仅选择主框下方的 13 个框。

【讨论】:

  • 此代码仍在选择工作表中的其他复选框!
  • @Yusuf 再次检查我的答案
  • 又是同样的问题,一直选中其他列的所有复选框。我们还必须定义列吗?
  • @Yusuf 你一定做错了什么。请参阅我添加的动画。它仅影响 14 个框,但不会影响除这 14 个框之外的其他列或其他行中的其他框。
  • 我很困惑为什么它在我的工作表上没有产生相同的结果。我复制粘贴了完全相同的代码..但它也一直选择其他框..
猜你喜欢
  • 2017-10-15
  • 2011-03-10
  • 2015-05-08
  • 1970-01-01
  • 2013-06-07
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多