VBA灰色复选框

时间:2013-07-15 12:33:32

标签: excel vba excel-vba checkbox

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

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

谢谢!

5 个答案:

答案 0 :(得分:9)

每当有人说“这是不可能的”时,就会触及我的顽固连胜。所以我可以向你们展示:“不可能”。

“可见”并启用复选框:

enter image description here

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

enter image description here

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

最后 - 请注意,删除(或添加)形状时不能使用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

答案 1 :(得分: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

当我点击该按钮时,该复选框显示为灰色且不可用。再次点击它“让它恢复生机”。我认为这是你正在寻找的效果。如果不是 - 这就是评论的意思。

这是它的样子:

enter image description here enter image description here

答案 2 :(得分:1)

我担心你在工作表中尝试做什么是不可能的。如果您使用的是UserForm,可以参考Floris的答案。
有关(表单/工作表)属性的更多详细信息,请参阅MSDN

答案 3 :(得分:0)

也许这就是你想要的。

Private Sub 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时,复选框2被禁用;未经检查,前瞻性变化。颜色可以是你想要的。 这是直接在Excel工作表中使用复选框。

答案 4 :(得分:0)

基于Floris'idea

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

您可以在单击CheckBox1时调用此方法,也可以从另一个子系统调用它,并使用可选的勾选状态(True / False)来检查或取消选中CheckBox1。

在CheckBox2上绘制一个对象并将其命名为“mask”(您可以将其命名为其他内容,但之后您必须相应地更改代码)

为蒙版提供与背景颜色相同的填充色,不透明度约为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时,掩码会出现在前面以隐藏CheckBox2,当你取消它时,掩码会返回取消隐藏它。由于它是不透明的,它会为您提供灰色效果,您甚至不必担心启用/禁用。

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