Joe Scholes
Joe Scholes

Reputation: 23

How to determine if a macro was called by another macro in excel, and perform code accordingly

This is just an example of what I want to do. I have an elaborate macro that I want to do different things depending on whether it was called by another macro or not.

sub Example()
Call MyCode
end sub

sub MyCode()
If Called by Example GoTo SkipNextLine
Do these things
exit sub
SkipNextLine:
Do other things
end sub

Upvotes: 1

Views: 1124

Answers (3)

RowanC
RowanC

Reputation: 1649

I made my way to this post wanting a macro that changed things on the sheet, but not wanting to kick off event driven macros. In case it's also useful for someone else, it's possible to turn these off in excel using Application.EnableEvents in the parent macro using:

Sub parentMacro()
    Application.EnableEvents = False
    'Do stuf here
    Application.EnableEvents = True
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    'this now only is called on worksheet changes outside of parent macro, 
    'as it's disabled while parent runs
    'Note: This disables all event macros running, so might not be perfect for all cases
End Sub

Upvotes: 0

JohnyL
JohnyL

Reputation: 7152

You can create hidden name (which, actually, isn't tied to range). Think of it as global variable. The difference between global variable and this name is that name is persisted in workbook when you close it. When you open workbook again - you can start using it without any initialization. As a bonus, this name won't be displayed in Name Manager. The defining of name is required only once.

Sub SetHiddenName()
    Names.Add Name:="Caller", RefersTo:="StartValue", Visible:=False
End Sub

Sub FF()
    Names("Caller").Value = "FF"
    Call SS
End Sub

Sub SS()
    Select Case [Caller]
        Case "FF": MsgBox "Called by FF" '...
        Case "ZZ": MsgBox "Called by ZZ"
    End Select
End Sub

Upvotes: 3

icebird76
icebird76

Reputation: 762

A simple approach would be to use arguments and parameters.

Sub Example()
    Call MyCode("Example")
End Sub

Sub Example2()
    Call MyCode("Example2")
End Sub

Sub MyCode(Origin as String)
    Select Case Origin
        Case "Example"
            'Do stuff here
        Case "Example2"
            'Do other stuff here
    End Select
End Sub

Upvotes: 3

Related Questions