I've written some VBA code which takes a single cell and identifies all its dependents in the workbook (via a NavigateArrow analysis) and adds their range location to an array. From here I want to be able to update each dependent and change the reference to the original single cell to another single specified cell.
The particular difficulty I'm having here is that although I know where each dependent is, the reference to the original cell may be at the start, middle or end of a formula, and may be unanchored, row/column/both anchored, may be on a different worksheet and hence have a worksheet reference preceding it, etc, etc. Therefore I can't make an easy find and replace in each dependent cell, because of these potential differences, plus I want to maintain the original anchoring held in each cell reference.
Is there an elegant - or even inelegant - VBA solution to this problem?
Regular Expressions, or Regexp, are what you are looking for I think.
The following Pattern
([A-Z0-9]*)!(\${0,1})([A-Z]{1,3})(\${0,1})([0-9]*)
will match anything like "Sheet1!A1", "Sheet1!$A$1", "Sheet1!$A1", "Sheet1!A$1"
Explanation:
([A-Z0-9]*)! = Find anything that is before "!"
(\${0,1}) = $ or nothing
([A-Z]{1,3}) = between one and three letters
([0-9]*) = Any number
You should easily be able to modify that pattern to match only what you want. In particular, ([A-Z0-9]*)!(\${0,1})B(\${0,1})1, will only match something with B($)1 in it... Construct the Regexp pattern with string manipulation and should be good.
You'll need to reference (Tool > Reference) the "Microsoft VBScript Regular Expressions 5.5"
Try 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})([A-Z]{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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With