首页 > 解决方案 > 使用 VBA 代码在多行上启用复选框

问题描述

在此处输入图像描述我有一个电子表格,其中每行有 3 个复选框选项,我创建了一个 VBA 以在创建复选框后禁用其他 2 个复选框(因此只能选中 1 个复选框),但是我的解决方案仅适用于一行,我需要一些帮助来重写它,以便它适用于所有行。(我是 VBA 新手)。

我使用的代码是这样的:

Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
  CheckBox2.Value = False
  CheckBox2.Enabled = False
  CheckBox3.Value = False
  CheckBox3.Enabled = False
Else
  CheckBox2.Value = False
  CheckBox2.Enabled = True
  CheckBox3.Value = False
  CheckBox3.Enabled = True
End If
End Sub
Private Sub CheckBox2_Click()
If CheckBox2.Value = True Then
  CheckBox1.Value = False
  CheckBox1.Enabled = False
  CheckBox3.Value = False
  CheckBox3.Enabled = False
Else
  CheckBox1.Value = False
  CheckBox1.Enabled = True
  CheckBox3.Value = False
  CheckBox3.Enabled = True
End If
End Sub

Private Sub CheckBox3_Click()
If CheckBox3.Value = True Then
  CheckBox1.Value = False
  CheckBox1.Enabled = False
  CheckBox2.Value = False
  CheckBox2.Enabled = False
Else
  CheckBox1.Value = False
  CheckBox1.Enabled = True
  CheckBox2.Value = False
  CheckBox2.Enabled = True
End If
End Sub

标签: excelvbacheckbox

解决方案


您可能应该只使用 Radios 它会简单得多。

如果您打算这样做,则需要删除所有框,然后输入此代码。它将创建并命名您的框并在单击时为其分配代码。

好的,这需要进入您的工作表模块:

Sub Worksheet_Activate()
    'Change Module2 to whatever the module name you are using is.
    Module2.ActivateCheckBoxes ActiveSheet
End Sub

接下来的内容将进入您从工作表模块引用的模块。

Sub ActivateCheckBoxes(sht As Worksheet)
    If sht.CheckBoxes.Count = 0 Then
        CreateCheckBoxes sht
    End If
    Dim cb As CheckBox
    
    For Each cb In sht.CheckBoxes
        'You may be able to pass sht as an object, It was giving me grief though
        cb.OnAction = "'Module2.CheckBoxClick """ & cb.name & """, """ & sht.name & """'"
    Next cb
End Sub

Sub CreateCheckBoxes(sht As Worksheet)
    Dim cell As Range
    Dim chkbox As CheckBox
    With sht
        Dim i As Long
        Dim prevrow As Long
        prevrow = 0
        For Each cell In .Range("B2:D5") 'Change this to whatever range you want.
            If prevrow < cell.row Then
                prevrow = cell.row
                i = 0
            End If
            Set chkbox = .CheckBoxes.Add(cell.Left, cell.Top, 30, 6)
            With chkbox
                .name = "CheckBox" & i & "_" & cell.row
                .Caption = ""
            End With
            
            i = i + 1
        Next cell
    End With                             
End Sub

Sub CheckBoxClick(chkname As String, sht As String)
    Dim cb As CheckBox
    With Worksheets(sht)

        For Each cb In .CheckBoxes
            If Split(cb.name, "_")(1) Like Split(chkname, "_")(1) And Not cb.name Like chkname Then
                cb.Value = -4146
            End If
        Next cb
    End With
            
End Sub

在此处输入图像描述


推荐阅读