【问题标题】:Select / unselect all CheckBoxes in a range EXCEL VBA macro选择/取消选择范围 EXCEL VBA 宏中的所有复选框
【发布时间】:2017-10-15 15:54:55
【问题描述】:

我正在创建一个 VBA 宏来选择工作表中的所有复选框,它工作正常,但现在我想调整我的代码以仅选择和取消选择特定范围内的复选框。

这是我的代码。

Sub Select_all()

Dim Cbox As CheckBox
Dim Rng As Range

Set Rng = ActiveWorkbook.Sheets("Sheet4").Range("B7, B104")

For Each Cbox In ActiveSheet.CheckBoxes

If Not Intersect(Cbox.TopLeftCell, Rng) Is Nothing Then
  If Cbox.name <> ActiveSheet.CheckBoxes("Check Box 104").name Then
    Cbox.Value = ActiveSheet.CheckBoxes("Check Box 104").Value
  End If
End If

Next Cbox

End Sub

我加了

If Not Intersect(Cbox.TopLeftCell, Rng) 什么都不是

但它不会改变任何东西,当我删除这部分时,它会选择工作表中的所有复选框,我只需要 Range("B7:B104")

有什么建议吗?非常感谢。

【问题讨论】:

  • 为什么将范围定义为Range("B7, B104")?这意味着它只有两个单元格,B7 和 B104,而不是单元格 B7:B104 的范围。然后在你的代码下你把Range("B7:B104")的正确定义,所以改变它。
  • 它们是 ActiveX 复选框还是表单控件复选框?
  • @tigeravatar 我和你一样,我只是错误地粘贴了代码。
  • @RobinMackenzie 表单控制复选框

标签: vba excel checkbox


【解决方案1】:

这对我有用。但是我将 cb# 更改为“1”,因为我的测试表上没有 104 个。 B7:B104 范围内的任何 cb 都将更改为 cb1 的值,您可以在脚本中将其更改为 cb104。

Sub Link_Checkboxes_To_Cells()

    Dim cBox As CheckBox

        For Each cBox In Sheet1.CheckBoxes
            If Not Intersect(cBox.TopLeftCell, Range("B7:B104")) Is Nothing Then
                If cBox.Name <> ActiveSheet.CheckBoxes("Check Box 1").Name Then
                    cBox.Value = ActiveSheet.CheckBoxes("Check Box 1").Value
                End If
            End If
        Next cBox

    End Sub

【讨论】:

  • 感谢您的回答。但奇怪为什么它不起作用。我尝试了一个新的工作簿,它是一样的。我需要添加一些参考吗?还是一些配置?
【解决方案2】:

@JuniorDev

上述代码不适合您的原因有几个。我会尝试列出它们。

以上代码适用于“表单控件”复选框 - 不是 ActiveX 类型的复选框。 ActiveX 复选框需要不同的代码。或者您可能没有名为“复选框 1”的表单复选框。但我认为这会给你一个错误。或者您的其他复选框可能不在 Range("B7:B104") 中。您可以尝试将其更改为 Range("A1:Z10000") 以确保您的复选框在范围内。

如果您不确定您有什么类型的复选框,那么您可以运行以下代码来查找它们的名称以及它们是什么类型的控件,无论是 form 还是 activex。它将在 VB 编辑器的即时窗口中打印信息。

Sub CheckboxLoop()
'PARTIAL SOURCE: www.TheSpreadsheetGuru.com/the-code-vault
Dim cb As Shape

'Loop through Form Checkboxes
  For Each cb In ActiveSheet.Shapes
    If cb.Type = msoFormControl Then
      If cb.FormControlType = xlCheckBox Then
            Debug.Print "Form Control: " & cb.Name
      End If
    End If
  Next cb

'Loop through ActiveX Checkboxes
Dim ChkBx As OLEObject
For Each ChkBx In ActiveSheet.OLEObjects
  If TypeName(ChkBx.Object) = "CheckBox" Then
        Debug.Print "ActiveX Control: " & ChkBx.Name
  End If
Next ChkBx
End Sub

【讨论】:

    【解决方案3】:

    很抱歉恢复旧帖子,但我讨厌没有提供解决方案并且我知道答案的情况,这很少见。谢谢,这对我目前正在进行的项目有所帮助。

    如果您像我一样,为了清楚起见,我会更改所有工作表名称。

    For Each cBox In Sheet1.CheckBoxes
    

    John Muggins 代码中的这一行将您限制为工作表名称“Sheet1”。
    我能够将线路更改为...

    For Each cBox In ActiveSheet.CheckBoxes
    

    ...而且效果很好。

    【讨论】:

      猜你喜欢
      • 2013-09-26
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 2015-05-08
      相关资源
      最近更新 更多