Переключение имен рабочих листов без обновления ссылок на эти листы - PullRequest
0 голосов
/ 07 ноября 2019

В моем файле есть два идентичных рабочих листа, чтобы пользователи могли вводить два разных набора предположительных переменных, называемых «InputA» и «InputB». Я хочу быстро переключить, какой лист ввода подается на другие листы модели.

Использование поиска и замены заняло более 5 минут, и было более 350 000 ссылок на «InputA».

Я попробовал следующий макрос, который запускается мгновенно, но, к сожалению, также изменяет все ссылки в книге, эффективно сохраняя все ссылки на исходный лист ввода.

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

Есть ли способ выполнить макросно помешать любым ссылкам на листы перейти на новое имя листа, в основном замораживая все, кроме изменения имени листа? Или, может быть, любое другое решение, которое будет работать быстро? Я не хочу проходить 350 000 экземпляров и переписывать с помощью INDIRECT (), так как это единственное другое решение, которое я видел, потому что мои ссылки сложны и вложены, и это займет много времени.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Предполагая, что ваши 2 входных листа имеют одинаковую структуру, я бы предложил следующее:

  1. Создайте именованный диапазон на уровне рабочей книги, назовите его, например, InputData. Этот диапазон должен содержать все данные от InputA.

  2. Создайте вспомогательный лист и назовите его Input - позже вы можете установить его скрытым.

  3. Отметьте диапазон на новом листе, который точно соответствует размеру Input-Data -Range, и введите формулу =InputData как Array -формула. Вы можете сделать это, введя Ctrl + Shift + Введите . Формула должна иметь фигурные скобки, и теперь на листе должны отображаться данные InputA.

  4. Измените все формулы, чтобы они ссылались на вспомогательный лист Input вместо InputA.

  5. Создать макрос:

    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
    

Эта подпрограмма просто изменит определение именованного диапазона, чтобы указывать либо на первый, либо на второйвходной лист. Как следствие, вспомогательный лист покажет данные выбранного входного листа. Все ваши формулы остаются без изменений.

0 голосов
/ 07 ноября 2019

Как указано в комментариях, вы можете воспользоваться подходом, рекомендованным Дамианом, и использовать условные выражения во всех соответствующих ячейках. Общее условное выражение будет

=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) более читабельным, чем несколько кавычек """, но это всего лишь предпочтение.

...