Regular expressions, or regexp, are what you are looking for, I think.
Next template
([A-Z0-9]*)!(\${0,1})([AZ]{1,3})(\${0,1})([0-9]*)
will match any type of "Sheet1! A1", "Sheet1! $ A $ 1", "Sheet1! $ A1", "Sheet1! A $ 1"
Explanation:
([A-Z0-9]*)! = Find anything that is before "!" (\${0,1}) = $ or nothing ([AZ]{1,3}) = between one and three letters ([0-9]*) = Any number
You can easily modify this template to fit only what you want. In particular, ([A-Z0-9] *)! (\ $ {0,1}) B (\ $ {0,1}) 1, will only match something with B ($) 1 in it ... Build a Regexp template with string manipulations and should be good.
You will need a link (Tool> Link) to "Microsoft VBScript Regular Expressions 5.5"
Try using the following code, this should give you all the tools to achieve your goal.
Sub ReplaceReference() ' Reference: Microsoft VBScript Regular Expressions 5.5 Dim RegEx As Object Set RegEx = New RegExp Dim s As String ' Here I have hardcoded the reference to the original cell for demonstration purposes s = "Sheet1!$AB$2" ' Replacement: New sheetname, New Column, new row number Dim NewCol As String, NewRow As String NewCol = "C" NewRow = "10" Dim NewSheet As String NewSheet = "Sheet2" With RegEx .Pattern = "([A-Z0-9]*)!(\${0,1})([AZ]{1,3})(\${0,1})([1-9]*)" .IgnoreCase = True .Global = True End With Debug.Print RegEx.Replace(s, NewSheet & "!" & "$2" & NewCol & "$4" & NewRow) End Sub
Cheers, Julien