Excel 中的嵌入式复选框

Excel 中的嵌入式复选框

我想在每个单元格 E2:E30 和 F2:F30 中插入复选框,其中每行的 E 列或 F 列中必须选中一个复选框。

答案1

就你的情况而言,使用选项按钮无疑是更好/更实用的解决方案。如果你需要模拟带有复选框的选项组,请参阅下文

选项组

手动方式:

  1. 插入组框(开发人员选项卡->插入->表单控件->组框) - 这是一个矩形,您可以在其中放置不同的选项按钮
  2. 将您需要的选项按钮放置在矩形中(开发人员选项卡->插入->表单控件->选项按钮)
  3. 选择组中的任一选项按钮并将其链接到您想要的单元格 - 在“格式控制”对话框中(右键单击后)或=$E$1在公式栏中简单输入。

此链接单元格现在将保存所按下的选项按钮的编号,在您的情况下,这可能是 1、2 或 3。您现在可以将其与任何其他功能相结合,例如INDEX/OFFSET/CHOOSE

VBA 方式

以下例程将在每个单元格旁边放置一个选项组:

私有 Const cStrPrefix 作为字符串 = “o_”
私有 Const cDblHorizo​​ntalSpacing As Double = 2
私有 Const cDblLabelWidth As Double = 40

私人 mWS 作为工作表
私有 mStrAddr 作为字符串
私有 mRngLink 作为范围
Private mVarLabels() 作为变体
私有 mIntCount 作为整数

公共子 subPlaceOptionGroupsInRange(rngLinks 作为范围,_
                         intNumberOfButtons 作为整数,_
                         ParamArray varLabels() 作为变体)

    Dim intOldCalcMode 作为整数

    应用程序.ScreenUpdating = False
    intOldCalcMode = 应用程序.计算
    应用程序.计算 = xlCalculationManual

    '初始化变量
    设置 mWS = rngLinks.Worksheet
    mIntCount = int按钮数量
    mVarLabels = varLabels

    对于 rngLinks.Cells 中的每个 mRngLink
        mStrAddr = mRngLink.地址

        子删除选项组
        子地点选项组
        子位置选项按钮

    下一个

    应用程序.计算 = intOldCalcMode
    应用程序.ScreenUpdating = True
子目录结束

私有子类 subDeleteOptionGroup()
    Dim i 作为整数

    出错时继续下一步
    对于 i = 1 到 mIntCount
        mWS.OptionButtons(cStrPrefix & mStrAddr & "_" & i).删除
    下一个
    mWS.GroupBoxes(cStrPrefix 和 mStrAddr).删除

子目录结束

私人子子PlaceOptionGroup()
    Dim objGroupBox 作为 GroupBox

    设置 objGroupBox = mWS.GroupBoxes.Add( _
        mRngLink.Offset(, 1).Left,mRngLink.Top,_
        (mIntCount + 2)* cDblHorizo​​ntalSpacing + _
         mIntCount * cDblLabelWidth,_
        mRngLink.高度)
    使用 objGroupBox
        .字符.文本 = “”
        .名称 = cStrPrefix & mStrAddr
        .Display3DSading = True
    结尾

子目录结束

私有子类 subPlaceOptionButtons()
    Dim i 作为整数
    Dim objOptionButton 作为选项按钮
    对于 i = 1 到 mIntCount
        设置 objOptionButton = mWS.OptionButtons.Add( _
            mRngLink.偏移(,1).左_
            + i * cDblHorizo​​ntalSpacing + (i - 1) * cDblLabelWidth, _
            mRngLink.Top,cDblLabelWidth,mRngLink.Height)
        使用 objOptionButton
            .Characters.Text = mVarLabels(i - 1)
            .Display3DSading = True
            .名称 = cStrPrefix & mStrAddr & "_" & i
            .LinkedCell = mStrAddr
        结尾
    下一个
子目录结束

您可以通过运行“subPlaceOptionGroupsInRange Sheets("yourSheet").Range("E2:E30"), 3, "Label1", "Label2", "Label3" 来放置选项按钮

复选框

如果您想要 3 个复选框以类似选项组的方式链接,则需要为三个按钮/选项分别设置一个单元格/列。例如,单元格 A1、B1、C1 链接到属于一个组的 3 个复选框。

为了实现互斥状态,您需要为每个选项按钮分配以下宏:

公共子子更改复选框()
    Dim cb 作为复选框
    Dim rngTarget 作为范围
    Dim intCol 作为整数

    设置 cb = ActiveSheet.CheckBoxes(Application.Caller)
    设置 rngTarget = ActiveSheet.Range(cb.LinkedCell)

    '防止取消选中
    如果 rngTarget.Value = False 那么
        rngTarget.Value = True
        退出子程序
    万一

    '取消选择之前选中的复选框
    对于 intCol = 1 到 3
        如果 rngTarget.Column intCol 则
            ActiveSheet.Cells(rngTarget.Row,intCol).值 = False
        万一
    下一 intCol

子目录结束

相关内容