Excel VBA-替换单元格内的文本';s公式

Excel VBA-替换单元格内的文本';s公式,excel,vba,Excel,Vba,我在Excel VBA编码中遇到了一件奇怪的事情 我有一张满是公式的表格,每一个都引用了其他表格中的单元格 这是单元格A1中的示例公式,例如: =IF('General Inputs & Summary'!B6="","",'General Inputs & Summary'!B6) 我想用新的选项卡名称动态更改公式中的旧选项卡名称 当我尝试此代码时: oldStr = "'General Inputs & Summary'" newStr = "'test'" R

我在Excel VBA编码中遇到了一件奇怪的事情

我有一张满是公式的表格,每一个都引用了其他表格中的单元格

这是单元格A1中的示例公式,例如:

=IF('General Inputs & Summary'!B6="","",'General Inputs & Summary'!B6)
我想用新的选项卡名称动态更改公式中的旧选项卡名称

当我尝试此代码时:

oldStr = "'General Inputs & Summary'"
newStr = "'test'"  
Range("A1").Formula = Replace(Range("A1").Formula, oldStr, newStr)
其结果是:

=IF(test!B6="","",test!B6)
而不是:

=IF('test'!B6="","",'test'!B6)
你看,单引号会自动删除,因此新公式失败


有什么解决办法吗?

您可以将公式读入字符串,替换字符串,并将字符串作为新公式传递,如下所示:

Sub TestMe()

    Dim oldStr$, newStr$

    oldStr = "'General Inputs & Summary'"
    newStr = "'test'"
    newStr = Replace(Range("A1").Formula, oldStr, newStr)
    Range("A1").Formula = newStr

End Sub

要说明
,请看以下示例:

Sub TestMe()

    Dim a As Range
    Dim b As String
    Set a = Range("A1")

    b = "'12"
    a = b

    Debug.Print a 'prints 12
    Debug.Print b 'prints '12

End Sub
A1
中的单元格格式为文本并包含
,但打印的值没有该值


编辑: 通常,只有当工作表名称包含空格时才需要
,如下面的-
常规输入和摘要
。如果名称中没有空格,例如
test
,则不太需要它,因此此示例也适用:

Public Sub TestMe()

    Dim a As Range: Set a = Range("A1")
    Dim oldStr$, newStr$

    a.Formula = "=IF('GI S'!B6="","",'GI S'!B6)"

    oldStr = "'GI S'"
    newStr = "'test'"
    Range("A1").Formula = Replace(Range("A1").Formula, oldStr, newStr)

End Sub

谢谢Vityata的精彩解释,这让我找到了答案

问题是,宏“首先”替换公式中的名称(即测试),然后创建新选项卡“测试”

例如,如果在
sheet1
单元格A1中设置此公式:

=test2!A1
(请注意,您尚未创建
test2
工作表)

所以你显然得到了
#REF错误

但是,如果随后创建
test2
选项卡(通过宏或手动),然后返回并检查
sheet1
中的单元格A1公式,(也通过保存文件进行刷新),它仍然显示
#REF错误,即使现在
test2
选项卡也确实存在!(需要双击单元格,然后按enter键,才能更新该单元格)


因此,我更改了我的宏,使其首先创建
测试
选项卡,然后操作这些公式。

我尝试了您的代码,它对我很有效。在您的示例中,删除引号实际上是正确的,因为只有当工作表名称包含空格时才需要引号。引号会自动删除,因为
test
不包含任何空格,并且只有当工作表名称中有空格时才需要引号。您的公式可能会因为其他原因而失败,但不是因为此处的引号。你能更具体地解释一下“失败”是什么意思吗?它显示了什么错误?是否有一张名为
test
的表格?是否已将计算转到
xlAutomatic
?如果不在更改公式后运行calculate。仅出于我的兴趣:您能解释一下替换为变量与替换不同吗?公式=替换(
),为什么这会有帮助?我的意思是替换的第一个参数是一个
字符串
,所以您可以使用
替换(范围(“A1”).Formula,
您已经将该公式转换为字符串,因此实际上是在字符串中替换,而不是在单元格或公式中。然后将替换返回的字符串写入单元格的公式中。我看不出使用变量作为中间步骤有什么不同。@Pᴇʜ-感谢您的关注-我已经更新了示例。当然,我在您的示例中知道这一事实。但我想知道这与OPs问题有什么关系?在OPs公式中,
从来都不是第一位的,而是在
IF
语句中。替换不会改变这一事实。原始字符串
“常规输入”s&Summary“
也包含一个
,因此在替换
后,它们仍然处于与以前相同的位置,只是它们之间的某些东西发生了变化。也许我只是瞎了眼,但我看不到任何使用您的代码而不是OPs代码的解决方案。OPs代码与您的代码完全相同。我测试了它。
只是省略了ted,因为sheetname
test
不包含空格,因此不需要引号。两个代码都在工作。没有区别。并且replace根本不会忽略任何
。即使手动键入
='test'!A1
,它也会删除引号。我刚刚意识到“test”!A1确实等于test!A1,所以s不是我得到#REF!的原因,我在回答中解释了原因…谢谢