6

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

我在这里遇到的特别困难是,虽然我知道每个依赖项在哪里,但对原始单元格的引用可能位于公式的开头、中间或结尾,并且可能是未锚定的、行/列/都锚定的,可能在不同的工作表上,因此在其前面有一个工作表引用,等等等等。因此,由于这些潜在的差异,我无法在每个依赖单元格中轻松查找和替换,而且我想保持原来的锚定在每个单元格引用。

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

4

2 回答 2

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 的内容...使用字符串操作构造正则表达式模式,应该很好。

您需要参考(工具 > 参考)“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

干杯,朱利安

于 2013-07-02T19:04:32.713 回答
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目标单元格。

于 2013-07-15T21:14:11.857 回答