在VBA中用另一个单元格引用替换依赖项

在VBA中用另一个单元格引用替换依赖项,vba,replace,cut-and-paste,Vba,Replace,Cut And Paste,我已经编写了一些VBA代码,它接受单个单元格,并在工作簿中标识其所有依赖项(通过NavigateArrow分析),并将它们的范围位置添加到数组中。从这里,我希望能够更新每个依赖项,并将对原始单个单元格的引用更改为另一个指定单元格 我在这里遇到的特别困难是,尽管我知道每个依赖项在哪里,但对原始单元格的引用可能位于公式的开头、中间或结尾,可能未编排,行/列/两者都被锚定,可能位于不同的工作表上,因此在其前面有一个工作表引用,等等,因此,由于这些潜在差异,我无法在每个依赖单元格中轻松找到和替换,而且我

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

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


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

正则表达式,或者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
干杯,
Julien

为什么不让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

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

似乎只需要替换引用/地址的四个变量(相对/固定行/固定列/固定行+列),因此您可以循环遍历所有这些变量并在找到时替换(相应地调整替换地址)是的,我看不到其他的方式,这是一个遗憾,因为它似乎有点笨重。谢谢你的帮助!我认为这些不是唯一的变体——它不也包括命名范围吗?或者它们被算作单独的参考资料?正确处理这一点可能非常棘手。尝试一下(我编写的一个应用程序),因为它按照您描述的方式移动引用依赖项。