Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VBA Grey Checkboxes

I would like to grey out my checkboxes in Excel VBA. When using Checkbox.Enabled = False, the checkbox is not editable, but it is also not grey. How do I get the greyed out effect?

Using form controls with Excel 2010. Inserted via developer tab directly into excel worksheet. Not used in a VBA userform.

Thanks!

like image 443
steventnorris Avatar asked Feb 14 '26 08:02

steventnorris


1 Answers

Whenever anyone says "it is impossible", it hits my stubborn streak. So may I present to you: "The Impossible".

"Visible" and enabled checkbox:

enter image description here

"Disabled" checkbox (you can tweak the degree of visibility by changing values in the code for both color and transparency of the cover shape):

enter image description here

Basic idea: you place a semi transparent shape over the checkbox, and assign a dummy macro to it. Now you can't change the value of the checkbox. The "toggle" button is there to change the state - either place the shapes, or remove them. It uses a global variable to track the current state.

Finally - note that you can't use For Each when you delete (or add) shapes as you should not modify the collection you are iterating over. I circumvented that with a simple "count shapes, then iterate backwards by numerical index".

Is it a hack? You bet! Does it do what you asked? Yes!

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
like image 140
Floris Avatar answered Feb 17 '26 00:02

Floris