I'm running a macro that automaticaly protects a worksheet when a cell value changes (with password). This macro runs all the time in all open sheets. This is supposed to be so. But when I have another excel file open, it also protects that sheet with the password. How can I limit my macro to only the file it is in?
Thanks!
Private Sub Worksheet_Calculate()
Dim FormulaRange As Range
Dim FormulaRange2 As Range
Dim NotSentMsg As String
Dim MyMsg As String
Dim SentMsg As String
Dim MyLimit As Double
NotSentMsg = "Niet verzonden"
SentMsg = "Verzonden"
'Above the MyLimit value it will run the macro
MyLimit = 0
'Set the range with the Formula that you want to check
Set FormulaRange2 = ActiveSheet.Range("D22")
On Error GoTo EndMacro:
For Each FormulaCell In FormulaRange2.Cells
With FormulaCell
If IsNumeric(.Value) = False Then
MyMsg = "Not numeric"
Else
If .Value > MyLimit Then
MyMsg = SentMsg
If .Offset(2, 10).Value = NotSentMsg Then
Call Mail_with_outlook2
End If
Else
MyMsg = NotSentMsg
End If
End If
Application.EnableEvents = False
ActiveSheet.Unprotect Password:="zou82pam"
.Offset(2, 10).Value = MyMsg
ActiveSheet.Protect Password:="zou82pam", DrawingObjects:=True, Contents:=True,
Scenarios:=True
ActiveSheet.EnableSelection = xlUnlockedCells
Application.EnableEvents = True
End With
Next FormulaCell
ExitMacro:
Exit Sub
EndMacro:
Application.EnableEvents = True
MsgBox "De onderstaande error is ontstaan. Neem contact op met Wouter van Leeuwen" _
& vbLf & vbLf & Err.Number _
& vbLf & Err.Description
End Sub
This is a perfect example on how
ActiveSheet
opens up possible bugs and should be avoided as much as possible.The first thing you need to do is always respect the following object hierarchy:
Translated into VBA this means that it is good practice to ALWAYS write down the entire hierarchy:
If you use multiple application objects or, more often workbooks, you have control on the objects that you want to manipulate.
Now instead of using:
You would have:
Now in case you need to loop through multiple sheets, you can always use the sheet index instead of sheet name. For example: