切换工作表名称而不更新对这些工作表的引用
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 具有相同的结构,我建议如下:
在工作簿级别创建一个命名范围,例如将其命名为InputData
。此范围应包含来自 InputA
.
的所有数据
创建一个助手-sheet并将其命名为Input
- 您稍后可以将其设置为隐藏。
在新的 sheet 中标记正好是 Input-Data
-Range 大小的范围,然后输入公式 =InputData
作为 数组-公式。您可以通过输入 Ctrl+Shift+Enter 来执行此操作。该公式应该有大括号,sheet 现在应该显示 InputA
.
的数据
更改所有公式以引用助手 Sheet Input
而不是 InputA
.
创建宏:
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 的数据。您所有的公式本身都保持不变。
我的文件有两个相同的 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 具有相同的结构,我建议如下:
在工作簿级别创建一个命名范围,例如将其命名为
InputData
。此范围应包含来自InputA
. 的所有数据
创建一个助手-sheet并将其命名为
Input
- 您稍后可以将其设置为隐藏。在新的 sheet 中标记正好是
Input-Data
-Range 大小的范围,然后输入公式=InputData
作为 数组-公式。您可以通过输入 Ctrl+Shift+Enter 来执行此操作。该公式应该有大括号,sheet 现在应该显示InputA
. 的数据
更改所有公式以引用助手 Sheet
Input
而不是InputA
.创建宏:
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 的数据。您所有的公式本身都保持不变。