我在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)您看,单引号会自动删除,因此新公式将失败!
对此有什么解决方案吗?
发布于 2018-04-03 15:55:09
您可以做的是将公式读取为字符串,在字符串中替换,然后将字符串作为新公式传递,如下所示:
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 SubA1中的单元格被格式化为文本并包含',但打印值中没有它。
编辑:通常情况下,只有当工作表名称包含空格时才需要',就像下面这样- 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发布于 2018-04-03 17:18:05
谢谢你Vityata的精彩解释,这让我找到了答案!
问题是,宏“首先”替换了公式中的名称(即测试),然后创建了新的选项卡"test“。
例如,如果在sheet1中设置此公式,则单元格A1:
=test2!A1(请注意,您尚未创建test2工作表)
所以很明显你得到了#REF!错误。
但是,如果您随后创建test2选项卡(通过宏或手动),并返回并检查sheet1中的单元格A1公式(也通过保存文件进行刷新),它仍然显示#REF!错误,即使现在test2选项卡真的存在!(您需要双击该单元格,然后按enter键,才能进行更新)
因此,我更改了宏,使其首先创建test选项卡,然后操作这些公式。
https://stackoverflow.com/questions/49623964
复制相似问题