Maybe move all Shape deeds to separate functions???
stMacroLink = GetAction(wsSht, stctrl)
Function GetAction(Sht as Worksheet, ShpName as String) As String
GetAction = Sht.Shapes(ShpName).OnAction
End Function
after that, it gets complicates. Class Modules run in their own Thread, if Multithreading is available. Create your own Shapes collection Class with Properties for each Shape property you need to use. Class Properties can have the same name as Application Properties, which would leave the rest of your code almost unchanged.