切换工作表名称而不更新对这些工作表的引用

Switch Worksheet Names without Updating References to those Sheets

我的文件有两个相同的 Worksheet 供用户输入两组不同的假设变量,称为 "InputA" 和 "InputB"。我想快速切换哪个输入 sheet 正在输入模型的其他 sheet。

使用“查找和替换”花费了 5 分钟多的时间,并且有超过 350,000 个对 "InputA" 的引用。

我尝试了以下宏,它会立即 运行,但不幸的是也更改了工作簿中的所有引用,有效地保留了对原始输入 sheet.[=11= 的所有引用]

Sheets("InputA").Name = "temp"
Sheets("InputB").Name = "InputA"
Sheets("temp").Name = "InputB"

有没有一种方法可以执行宏但阻止对 worksheet 的任何引用更改为新的 sheet 名称,基本上冻结除 sheet 名称更改之外的所有内容?或者可能有任何其他可以快速工作的解决方案?我不想遍历 350,000 个实例并使用 INDIRECT() 重写,因为这是我见过的唯一其他解决方案,因为我的引用很复杂且嵌套,并且需要很长时间。

谢谢。

如评论中所述,您可以采用 Damian 推荐的方法并在所有相关单元格中使用条件。通用条件将是

=IF(A1="InputA",FORMULA INPUTA,FORMULA INPUTB)

此公式使 A1 单元格决定拉取哪个输入。这将使更改工作簿中大约 350.000 个输出公式成为瓶颈,以下宏负责更改所有公式以包含条件:

Sub changeFormulas()

Dim rng As Range, cll As Range

Set rng = shOutput.Range("A2:C10") 'Your relevant worksheet and range here

Dim aStr As String, bStr As String, formulaStr As String

aStr = "InputA"
bStr = "InputB"

For Each cll In rng
    If cll.HasFormula And InStr(1, cll.Formula, aStr, 1) Then
        formulaStr = Right(cll.Formula, Len(cll.Formula) - 1)
        cll.Formula = "=IF(A1=" & Chr(34) & aStr & Chr(34) & "," & formulaStr & "," & Replace(formulaStr, aStr, bStr) & ")" 'Change A1 to the reference most suited for your case
    End If
Next cll

End Sub

这可能需要一点时间,因为它必须一个接一个地访问所有相关单元格,但它只需要 运行 一次。

解释一下:此宏将遍历顶部指定范围 rng 中的所有单元格。如果一个单元格中有一个公式并且该公式包含 "InputA" 它将更改该公式以适合通用条件(当然是单元格自己的公式)。 Chr(34) 是引号 ",我发现使用 Chr(34) 比使用多个引号 """ 更具可读性,但这只是偏好。

假设您的 2 个 Input-Sheet 具有相同的结构,我建议如下:

  1. 在工作簿级别创建一个命名范围,例如将其命名为InputData。此范围应包含来自 InputA.

  2. 的所有数据
  3. 创建一个助手-sheet并将其命名为Input - 您稍后可以将其设置为隐藏。

  4. 在新的 sheet 中标记正好是 Input-Data-Range 大小的范围,然后输入公式 =InputData 作为 数组-公式。您可以通过输入 Ctrl+Shift+Enter 来执行此操作。该公式应该有大括号,sheet 现在应该显示 InputA.

  5. 的数据
  6. 更改所有公式以引用助手 Sheet Input 而不是 InputA.

  7. 创建宏:

    Sub switchInput()
    
        Const sheetAName = "InputA"
        Const sheetBName = "InputB"
    
        With ThisWorkbook.Names("inputData")
            If InStr(.RefersTo, sheetAName) > 0 Then
                .RefersTo = Replace(.RefersTo, sheetAName, sheetBName)
            Else
                .RefersTo = Replace(.RefersTo, sheetBName, sheetAName)
            End If
        End With
    End Sub
    

此例程将更改命名范围的定义以指向第一个或第二个输入 sheet。因此,助手 sheet 将显示所选 Input-Sheet 的数据。您所有的公式本身都保持不变。