Why do good Excel macros suddenly go bad? Does that ever happen to you? Here’s my latest adventure, and maybe it will help you prevent (or solve) a similar problem.
Unprotect Sheets With a Macro
When making changes to client files, I use macros to quickly and easily protect or unprotect all the sheets in an Excel file, like the examples shown below.
- This macro protects all the worksheets in the active workbook, with no password.
Sub ProtectAllSheetsNoPwd()
Dim ws As Worksheet
On Error Resume Next
For Each ws In ActiveWorkbook.Worksheets
ws.Protect DrawingObjects:=True, _
Contents:=True, Password:=""
Next ws
End Sub
- And this macro unprotects all the worksheets, with no password.
Sub UnProtectAllSheetsNoPwd() Dim ws As Worksheet On Error Resume Next For Each ws In ActiveWorkbook.Worksheets ws.Unprotect Next ws End Sub
The Protect Macro Fails
However, even a simple macro can run into problems, as I’m sure you’ve already discovered with your own macros. It worked yesterday, but the macro won’t run correctly today, in the same file. And you’re sure that nothing was changed in the file – so what’s the problem?
That’s what happened to me recently, while trying to unprotect a file, so I could make some changes. The macro ran, but the sheet’s weren’t unprotected.
Excel error
I commented out the macro’s error handling, to try and solve the problem, and this run-time error 1004 popped up:
Method ‘Unprotect’ of object ‘_Worksheet’ failed.

Prevent the Macro Problem
After a bit of head scratching, I realized what the problem was – I had grouped some of the sheets, because they all needed a formatting change. Oops! Because the sheets were grouped, they couldn’t be unprotected.
I added a line of code to the macro, to ungroup the sheets, if necessary, and the problem is solved. You could do something fancier, like identifying the active sheet, and selecting it, instead of the first sheet.
Revised Excel VBA Code
Sub ProtectAllSheetsNoPwd()
Dim ws As Worksheet
On Error Resume Next
Sheets(1).Select '<====== selects first sheet in workbook
For Each ws In ActiveWorkbook.Worksheets
ws.Protect DrawingObjects:=True, _
Contents:=True, Password:=""
Next ws
End Sub
The same line was added to the Unprotect macro.
Sub UnProtectAllSheetsNoPwd() Dim ws As Worksheet On Error Resume Next Sheets(1).Select '<====== selects first sheet in workbook For Each ws In ActiveWorkbook.Worksheets ws.Unprotect Next ws End Sub
Watch the Protect Macro Fails Video
To see the problem that occurs when you try to protect or unprotect group sheets, and the code change that fixes it, you can watch this short Excel video tutorial.
___________
There’s a story making the rounds, about a guy who rated all his online dating prospects, by using an Excel worksheet.






