VBA 灰色复选框

Posted

技术标签:

【中文标题】VBA 灰色复选框【英文标题】:VBA Grey Checkboxes 【发布时间】:2013-07-13 07:49:01 【问题描述】:

我想在 Excel VBA 中使我的复选框变灰。使用Checkbox.Enabled = False 时,复选框不可编辑,但也不是灰色的。如何获得灰显效果?

在 Excel 2010 中使用表单控件。通过开发人员选项卡直接插入到 Excel 工作表中。未在 VBA 用户表单中使用。

谢谢!

【问题讨论】:

@mehow 该答案显示了如何取消选中所有复选框,而不是将它们变灰并禁用它们。 它向您展示了如何遍历复选框。您是在谈论 ActiveX 复选框还是表单控件? gray them out 是什么意思?没有这样的属性,举个例子什么的 @mehow 我知道如何遍历复选框。我正在使用表单控件。将表单中的字段变灰是一个常用术语,其中字段被禁用并呈现灰色外观,几乎是幻影。通常,这是使用表单时的自动功能,并且控件被禁用。 您使用的是什么版本的 Excel。在 Excel 2007 中,我无法重现此内容。 Checkbox proerties 看看你能不能找到你要找的东西 【参考方案1】:

每当有人说“这是不可能的”时,它都会触动我的顽固。那么我可以向您介绍:“不可能的事”。

“可见”并启用复选框:

“禁用”复选框(您可以通过更改代码中封面形状颜色和透明度的值来调整可见度):

基本思想:在复选框上放置一个半透明的形状,并为其分配一个虚拟宏。现在您无法更改复选框的值。 “切换”按钮用于更改状态 - 放置形状或删除它们。它使用一个全局变量来跟踪当前状态。

最后 - 请注意,当您删除(或添加)形状时,您不能使用 For Each,因为您不应该修改您正在迭代的集合。我通过一个简单的“计算形状,然后按数字索引向后迭代”来规避这一点。

这是一个黑客吗?你打赌!它做你问的吗?是的!

Dim checkBoxesVisible As Boolean
Option Explicit

Sub toggleIt()
' macro assigned to "Toggle visibility" button
  checkBoxesVisible = Not checkBoxesVisible
  toggleCheckboxes checkBoxesVisible
End Sub

Sub grayOut(cb)
' put a "cover" shape over a checkbox
' change the color and transparency to adjust the appearance
  Dim cover As Shape
  Set cover = ActiveSheet.Shapes.AddShape(msoShapeRectangle, cb.Left, cb.Top, cb.Width, cb.Height)
  With cover
    .Line.Visible = msoFalse
    With .Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(255, 255, 255)
        .Transparency = 0.4
        .Solid
    End With
  End With
  cover.Name = "cover"
  cover.OnAction = "doNothing"
End Sub

Sub doNothing()
' dummy macro to assign to cover shapes
End Sub

Sub unGray(cb)
' find the cover shape for the checkbox passed as the argument
' and delete it
' "correct shape" has the name "cover" and is properly aligned with top left
  Dim sh As Shape
  For Each sh In ActiveSheet.Shapes
    If sh.Name = "cover" And sh.Left = cb.Left And sh.Top = cb.Top Then
      sh.Delete
      Exit For
    End If
  Next sh
End Sub

Sub toggleCheckboxes(onOff)
  Dim s As Shape
  Dim n As Integer, ii As Integer

  n = ActiveSheet.Shapes.Count
  ' loop backwards over shapes: if you do a "For Each" you get in trouble
  ' when you delete things!

  For ii = n To 1 Step -1
    Set s = ActiveSheet.Shapes(ii)
    If s.Type = msoFormControl Then
      If s.FormControlType = xlCheckBox Then
        If onOff Then
          unGray s
        Else
          grayOut s
        End If
      End If
    End If
  Next ii

End Sub

【讨论】:

而不是添加/删除我宁愿带到前面/发送到后面 @robotik 好主意 - 我写这篇文章时没有想到(三年前...)【参考方案2】:

一个小技巧 - 但以下确实有效。我创建了一个带有两个控件的简单用户表单 - 一个常规复选框 (CheckBox1),以及一个我称之为“DisableButton”的按钮,代码如下:

Private Sub DisableButton_Click()

  CheckBox1.Enabled = Not (CheckBox1.Enabled)
  If CheckBox1.Enabled Then
    CheckBox1.ForeColor = RGB(0, 0, 0)
  Else
    CheckBox1.ForeColor = RGB(128, 128, 128)
  End If

End Sub

当我点击按钮时,复选框灰显且不可用。再次单击它“使它恢复生机”。我想这就是你想要的效果。如果不是 - 这就是 cmets 的用途。

这是它的样子:

【讨论】:

这就是我想要的,但代码不起作用。使用前景色时出现“对象不支持此属性或方法”错误。澄清一下,使用开发人员选项卡将复选框直接插入到 Excel 工作表中,而不是在 VBA 中创建的用户表单中。也许这就是这个错误的原因? @mehow 无法添加复选框或无法将其更改为灰色? 显然是灰色的东西 @mehow 只是检查。不幸的答案,但谢谢。如果您提交这样的答案,我会接受。【参考方案3】:

恐怕您在工作表中尝试做的事情是不可能的。如果您使用的是用户表单,您可以参考 Floris 的回答。 有关(表单/工作表)复选框属性的更多详细信息,请参阅MSDN

【讨论】:

“不可能”仅使用 CheckBox 工作表 FormControl 的属性和方法。但是在Excel中是否可能。请参阅我的第二个答案。【参考方案4】:

也许这就是你想要的。

私有子 CheckBox1_Click()

If CheckBox1.Value = True Then
    CheckBox2.Value = False
    CheckBox2.Enabled = False
    CheckBox2.ForeColor = rgbBlue

Else
    CheckBox2.Visible = True
    CheckBox2.ForeColor = rgbAntiqueWhite
    CheckBox2.Enabled = True

End If

代码告诉当 checkbox1 被选中时, checkbox2 被禁用;未选中并且前色更改。颜色可以是你想要的。 直接在 excel 工作表中使用复选框进行此操作。

【讨论】:

【参考方案5】:

基于弗洛里斯的idea。

代码假定所有控件都在 ActiveSheet 上,它们被称为 CheckBox1 和 CheckBox2,如果不是,则相应地进行更改。

您可以在单击 CheckBox1 时调用它,也可以从另一个子调用它,并带有可选的勾选状态(True/False)以选中或取消选中 CheckBox1。

在 CheckBox2 上绘制一个对象并将其命名为“掩码”(您可以将其命名为其他任何名称,但您必须相应地更改代码)

为蒙版提供与背景颜色相同的填充颜色和大约 50% 的不透明度。

Public Sub CheckBox1_Click(Optional ticked As Variant)
    Application.ScreenUpdating = False
    ActiveSheet.Unprotect
    If Not IsMissing(ticked) Then
        If ticked = True Then ActiveSheet.Shapes("CheckBox1").OLEFormat.Object.Value = 1 Else ActiveSheet.Shapes("CheckBox1").OLEFormat.Object.Value = -4146
    End If
    If ActiveSheet.Shapes("CheckBox1").OLEFormat.Object.Value > 0 Then
        ActiveSheet.Shapes("mask").OLEFormat.Object.ShapeRange.ZOrder msoSendToBack
    Else
        ActiveSheet.Shapes("mask").OLEFormat.Object.ShapeRange.ZOrder msoBringToFront
    End If
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    Application.ScreenUpdating = True
End Sub

现在每次你勾选 CheckBox1 时,mask 会回到前面来隐藏 CheckBox2,当你取消勾选它时,mask 会回到后面来取消隐藏它。因为它是不透明的,所以它会给你灰色的效果,你甚至不必担心启用/禁用。

工作表应该受到保护,这样用户就不会意外移动或编辑掩码,但应该不受保护,SendToBack/BringToFront 才能工作,所以代码就是这样做的。请检查Application.Protect部分的保护设置。

【讨论】:

以上是关于VBA 灰色复选框的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 主题下使用 Delphi 显示“灰色”只读复选框

vba中有啥类型的电子表格复选框?

如何在颤动中更改复选框边框颜色?默认情况下,它显示为黑色,但我希望它为灰色

是否可以选择一个复选框并取消选择另一个复选框? (需要 VBA)

在 VBA 中动态定义复选框的事件

使用VBA获取Excel中所有复选框的值