Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replacing dependents with another cell reference in VBA

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?

like image 575
Man of Leng Avatar asked Nov 12 '12 21:11

Man of Leng


Video Answer


1 Answers

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

like image 65
Julien Marrec Avatar answered Oct 04 '22 07:10

Julien Marrec