我想在 Excel VBA 中使我的复选框变灰。使用Checkbox.Enabled = False
时,复选框不可编辑,但也不是灰色的。如何获得灰显效果?
在 Excel 2010 中使用表单控件。通过开发人员选项卡直接插入到 Excel 工作表中。不在 VBA 用户窗体中使用。
谢谢!
每当有人说“这是不可能的”时,它就会触动我的顽固。所以我可以向您介绍:“不可能”。
“可见”并启用复选框:
“禁用”复选框(您可以通过更改代码中封面形状颜色和透明度的值来调整可见度):
基本思想:在复选框上放置一个半透明的形状,并为其分配一个虚拟宏。现在您无法更改复选框的值。“切换”按钮用于更改状态 - 放置形状或删除它们。它使用全局变量来跟踪当前状态。
最后 - 请注意,当您删除(或添加)形状时不能使用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
一个轻微的黑客攻击 - 但以下确实有效。我创建了一个带有两个控件的简单用户表单——一个常规复选框 ( 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
当我单击该按钮时,该复选框灰显且不可用。再次单击它“使它恢复生机”。我想这就是你想要的效果。如果不是 - 这就是评论的目的。
这是它的样子:
恐怕您在工作表中尝试做的事情是不可能的。如果您使用的是用户表单,您可以参考 Floris 的回答。
有关(表单/工作表)复选框属性的更多详细信息,请参阅MSDN
也许这就是你想要的。
私有子 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 工作表中使用复选框执行此操作。
基于弗洛里斯的想法。
代码假定所有控件都在 ActiveSheet 上,它们被称为 CheckBox1 和 CheckBox2,如果不是,则相应地进行更改。
您可以在单击 CheckBox1 时调用它,也可以从另一个 sub 调用它,并带有可选的勾选状态(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
部件的保护设置。