我在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)
你看,单个引号被自动删除,所以新公式失败了!
对此有任何解决方案吗?
答案 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