用VBA中的其他单元格引用替换依赖项

时间:2012-11-12 21:07:19

标签: vba replace cut-and-paste

我编写了一些VBA代码,它接受单个单元格并在工作簿中识别其所有依赖项(通过NavigateArrow分析)并将其范围位置添加到数组中。从这里开始,我希望能够更新每个依赖项,并将对原始单个单元格的引用更改为另一个指定单元格。

我在这里遇到的特殊困难是,虽然我知道每个依赖的位置,但对原始单元格的引用可能位于公式的开头,中间或末尾,并且可能是未锚定的,行/列/两者锚定,可能在不同的工作表上,因此在它之前有一个工作表参考,等等。因此,我不能在每个依赖单元格中轻松查找和替换,因为这些潜在的差异,加上我想保持原始锚定在每个单元格参考中。

这个问题是否有优雅甚至不优雅的VBA解决方案?

2 个答案:

答案 0 :(得分:1)

我认为正常表达式或Regexp是您正在寻找的。

以下模式

([A-Z0-9]*)!(\${0,1})([A-Z]{1,3})(\${0,1})([0-9]*)

将匹配任何类似“Sheet1!A1”,“Sheet1!$ A $ 1”,“Sheet1!$ A1”,“Sheet1!A $ 1”

说明:

([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

您应该可以轻松地修改该模式以仅匹配您想要的模式。特别是,([A-Z0-9] *)!(\ $ {0,1})B(\ $ {0,1})1,只会匹配B($)1中的内容... 使用字符串操作构造Regexp模式,应该很好。

您需要参考(工具>参考)“Microsoft VBScript正则表达式5.5”

尝试以下代码,这应该为您提供实现目标的所有工具

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

干杯, 于连

答案 1 :(得分:0)

为什么不让VBA剪切并粘贴源单元?然后,Excel将调整所有光荣变化的单元格引用。

我创建了几个带引用的单元格,然后使用宏录制器查看选择单元格,剪切和复制内容时生成的VBA中可能发生的情况。行为符合预期,如下:

Range("A1").Select
Selection.Cut
Range("B1").Select
ActiveSheet.Paste

这将适用于以下工作表:

A1  1
A2  =A1
A3  =$A$1
A4  =1+A1
A5  =1+A1+1

运行宏后,所有引用都指向B1目标单元格。