Passing controls as arguments isn't something I do, so I had to play with this a bit. It turns out that if you declare a sub or function with a parameter like this:
Sub Toggle(ByRef ckBox As CheckBox)
and try to use properties of the object ckBox in the procedure's code, you get (for most of the properties) an error that the object doesn't have any such property, or in some cases you'll get a type mismatch error at run time. It turns out that using just "CheckBox" like that gives you an entirely different kind of object with just a handful of properties.
Instead, declare it this way:
Sub Toggle(ByRef ckBox As MSForms.CheckBox)
and everything works when you call it like
Toggle CheckBox1