As they say, to get where you're going, I wouldn't start from here.
The code as written is too inflexible.
I would put the locations on two similar userforms.
The first to be used initially to set locations that would show relevant columns on every month.
The second would be used to adapt each sheet as required. It would be populated based on the active sheet and changes would affect that sheet only.
Rather than hard coding cell references, use Find based on Row 10 to locate areas and show/hide as appropriate. Get rid of the merged cells, they make things more difficult.
Try and use modular code. Pass the Checkbox values to another sub to carry out the procedure e.g.
Private Sub CheckBox10_Click()
With CheckBox10
ColShow .Caption, .Value
End With
End Sub
Sub ColShow(Loc As String, Val As Boolean)
Dim c As Long
With ActiveSheet
.Unprotect
c = .Rows(10).Find(Loc).Column
.Columns(c).Resize(, 4).EntireColumn.Hidden = Not (Val)
.Protect
End With
End Sub
Create code that can be used on all worksheets by refering to the data structure
Sub ClearWorksheet()
' ClearWorksheet Macro
Dim i As Long
Dim arr, a
Dim LR As Long
Dim LC As Long
With ActiveSheet
.Unprotect
LR = .Cells(11, 4).End(xlDown).Row
LC = .Cells.Find("TAKEN", lookat:=xlPart, After:=.Cells(1, 1), searchdirection:=xlPrevious, searchorder:=xlByColumns).Column
arr = Array(0, 1, 3)
For i = 6 To (LC - 3) Step 4
For Each a In arr
Range(.Cells(12, i), .Cells(LR, i)).Offset(, a).Select 'ClearContents
Next a
Next i
End With
Columns(10).Resize(, LC - 9).EntireColumn.Hidden = True
DoProtect ActiveSheet
End Sub
Sub ShowAll()
' Keyboard Shortcut: Ctrl+Shift+S
ActiveSheet.Unprotect
Cells.EntireColumn.Hidden = False
DoProtect ActiveSheet
End Sub
Sub DoProtect(sh As Worksheet)
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
AllowFormattingRows:=True, AllowInsertingColumns:=True, _
AllowDeletingColumns:=True, AllowDeletingRows:=True
End Sub