VBA灰色checkbox

我想灰色Excel VBA中的我的checkbox。 当使用Checkbox.Enabled = False ,checkbox不可编辑,但也不是灰色的。 我如何得到灰色的效果?

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

谢谢!

每当有人说“这是不可能的”,它会打我固执的痕迹。 所以我可以向你们介绍:“不可能的”。

“可见”并启用checkbox:

在这里输入图像说明

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

在这里输入图像说明

基本思路:在checkbox上放置一个半透明的形状,并为其分配一个虚拟macros。 现在您不能更改checkbox的值。 “切换”button在那里改变状态 – 要么放置的形状,要么删除它们。 它使用全局variables来跟踪当前状态。

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

轻微的黑客 – 但下面的工作。 我用两个控件创build了一个简单的用户窗体 – 一个常规的checkbox( CheckBox1 )和一个我用下面的代码调用“DisableButton”的button:

 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 

当我点击button时,checkbox变灰,不可用。 再次点击“使其恢复生机”。 我认为这是你正在寻找的效果。 如果不是 – 那是什么意见。

这是它的样子:

在这里输入图像说明在这里输入图像说明

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

也许这是你想要的。

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被选中时,checkbox2被禁用; 未经检查和forecollor变化。 颜色可以是你想要的。 在Excel工作表中直接使用checkbox。

基于弗洛里斯的想法 。

该代码假定所有控件都在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部分的保护设置。