Excel VBA - 替换单元格公式中的文本

时间:2018-04-03 06:53:56

标签: excel-vba vba excel

我在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)

你看,单个引号被自动删除,所以新公式失败了!

对此有任何解决方案吗?

2 个答案:

答案 0 :(得分:1)

感谢Vityata的精彩解释,这让我得到了答案!

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

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

=test2!A1

(请注意,您还没有创建test2表)

所以你明显得到#REF!错误。

但是,如果你那么创建test2标签(通过宏或手),然后返回并检查sheet1中的单元格A1公式,(也通过保存文件刷新),它仍然显示{ {1}}错误,即使现在#REF!标签确实存在! (您需要双击单元格,然后按Enter键,以便更新)

因此,我更改了我的宏,以便它首先创建test2标签,然后操纵这些公式。

答案 1 :(得分:0)

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

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中的单元格被格式化为文本并包含',但打印的值没有它。

修改 通常,仅当工作表名称包含空格时才需要',例如General Inputs & Summary。名称中没有空格,例如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