Reputation: 215
I'm just wondering if you can create a Macro, that will hyperlink a cell and assign a separate macro to it?
I know you can use a hyperlink to run a macro using the following
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
Call Macro Name
End Sub
I also know you can use a macro to create a Hyperlink using the following
With Worksheets(1)
.Hyperlinks.Add Anchor:=.Range("a5"), _
Address:="", _
ScreenTip:="", _
TextToDisplay:= ""
End With
Is there anyway to put these together? Or is there a way to use the second code to assign a macro? instead of an address?
So if I made a macro that takes data from a raw data tab, and puts it into a table like this
The macro then needs to assign a hyperlink to the values (4,2,5,2,5) that will run a separate macro when clicked. I'm hoping it would look something like this
With Worksheets(1)
.Hyperlinks.Add Anchor:=.Range("B2"), _
Address:=Macro Name, _
ScreenTip:="", _
TextToDisplay:= ""
End With
There is much more to it as the table may have more rows so the hyperlinks will have to have a variable range etc, but i'd just to know if it's possible because I can't get it to work as above
Upvotes: 1
Views: 1218
Reputation: 57683
It is possible, but not by default. You will to perform some kind of workaround:
Create a hyperlink on eg cell B2 linking to B2 itself.
.Hyperlinks.Add Anchor:=Range("B2"), Address:="", SubAddress:=Range("B2").Address
And then use the Target
to decide which macro should be called, so you can use the address Target.Parent.Address
or the cell value Target.Parent.Value
to distinguish between the macros.
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
'decide by address
Select Case Target.Parent.Address
Case "$B$2"
CallMacro1
Case "$B$3"
CallMacro1
End Select
'or by intersection a range
Select Case True
Case Not Intersect(Target.Parent, Range("B4:B8")) Is Nothing
CallMacro1
End Select
'or by value
Select Case Target.Parent.Value
Case 2
CallMacro1
Case 4
CallMacro1
End Select
End Sub
Note that the Call
statement is deprecated and should not be used anymore. Just use the macro name itself to call a macro: Instead of Call MacroName
just use MacroName
.
Alternatively use the ScreenTip
as workaround to set the macro name
.Hyperlinks.Add Anchor:=Range("B4"), Address:="", SubAddress:= _
Range("B4").Address, ScreenTip:="MyMacro"
and then use the ScreenTip
to run that macro
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
Application.Run Target.ScreenTip
End Sub
Note that the MyMacro
has to be public in a Module otherwise you need to use eg. Sheet1.MyMacro
to tell in which scope the macro actually is. Otherwise it will throw an error that the macro name does not exist.
Note also that this is a kind of workaround, that miss-uses the ScreenTip
.
Upvotes: 2