Excel: списки диапазонов, нацеленных на косвенные формулы
Вопрос
У нас есть несколько очень больших рабочих книг Excel (десятки вкладок, по сравнению с MB, каждый, очень сложные расчеты) с множеством десятков, возможно, сотни формул, которые используют страшную косвенную функцию. Эти формулы распространяются по всей рабочей книге и нацелены на несколько таблиц данных для поиска значений.
Теперь мне нужно переместить диапазоны данных, которые нацелены на эти формулы в другое место в одной и той же рабочей книге.
(Причина не особенно актуальна, но интересна сама по себе. Нам нужно запустить эти вещи в службах расчетов Excel и задержку с загрузкой каждой из довольно больших таблиц, по одному, оказалось неприемлемо высоким. Мы перемещаем Таблицы в смежном диапазоне, чтобы мы могли загрузить их все в один выстрел.)
Есть ли способ найти все косвенные формулы, которые в настоящее время относятся к таблицам, которые мы хотим переместить?
Мне не нужно делать это в режиме онлайн. Я с радостью возьму что -то, что займет 4 часа, чтобы бежать, пока это надежно.
Имейте в виду, что методы. -Зависимых,.
(Также переписывание электронных таблиц в что бы ни не вариант для нас).
Спасибо!
Решение
Вы могли бы повторить всю рабочую книгу с помощью VBA (я включил код из @Pablog и @euro-micelli):
Sub iterateOverWorkbook()
For Each i In ThisWorkbook.Worksheets
Set rRng = i.UsedRange
For Each j In rRng
If (Not IsEmpty(j)) Then
If (j.HasFormula) Then
If InStr(oCell.Formula, "INDIRECT") Then
j.Value = Replace(j.Formula, "INDIRECT(D4)", "INDIRECT(C4)")
End If
End If
End If
Next j
Next i
End Sub
Этот пример заменяет каждое появление «косвенного (D4)» с «косвенным (C4)». Вы можете легко поменять функцию замены на что-то более сложное, если у вас есть более сложные косвенные функции. Производительность не так уж и плоха, даже для более крупных рабочих книг.
Другие советы
В: «Есть ли способ найти все косвенные формулы, которые в настоящее время относятся к таблицам, которые мы хотим переместить?»
Когда я читаю это, вы хотите заглянуть в аргументы косвенных ссылок на интересующие области. Ottomh я бы напишет VBA для использования анализатора регулярного выражения или даже простого инструмента, чтобы найти косвенное (считать на совпадение), а затем оценить () строку внутри, чтобы преобразовать его на фактический адрес, повторите по мере необходимости для множества косвенных (...) вызовы и сбросьте формулу и ее перевод на два столбца в листе.
Вы можете использовать что -то подобное в VBA:
Sub ListIndirectRef()
Dim rRng As Range
Dim oSh As Worksheet
Dim oCell As Range
For Each oSh In ThisWorkbook.Worksheets
Set rRng = oSh.UsedRange
For Each oCell In rRng
If InStr(oCell.Formula, "INDIRECT") Then
Debug.Print oCell.Address, oCell.Formula
End If
Next
Next
End Sub
Вместо Debug.print вы можете добавить код на ваш вкус
К сожалению, аргументы косвенного, как правило, более сложны, чем это. Вот реальная формула из одного из листов, а не самая сложная формула, которую мы имеем:
=IF(INDIRECT("'"&$B$5&"'!"&$O5&"1")="","",INDIRECT("'"&$B$5&"'!"&$O5&"1"))
HM, вы можете написать простой анализатор, игнорируя большинство персонажей и просто ищет соответствующие части (в этом примере: «A..Z», «0..9» и «!:» и т. Д.) Но вы будете столкнуться с проблемами, если аргументы в «косвенных» являются функциями.
Возможно, более безопасным подходом будет напечатать все события «косвенного» в третьем листе. Затем вы можете добавить желаемый вывод и написать небольшой поиск и заменить программу, чтобы написать ваши изменения обратно.
Если вы «получите» каждую ячейку в огромной электронной таблице, вам может потребоваться чудовищное количество памяти. Я все еще готов попытаться рискнуть.
Метод выбора используемого диапазона Pablog - это путь (добавил его в мой исходный код). Скорость довольно хороша, особенно если вы проверяете, содержит ли текущая ячейка формула. Очевидно, все зависит от размера вашей рабочей книги.
Я не уверен, что этот этикет касается упоминания о продуктах, с которыми подключен писатель, но Oak, набор для анализа Operis, дополнение Excel, может заменить косвенные функции на ссылки на ячейки, которые они решают. Затем вы можете использовать инструменты аудита Excel, чтобы определить, какие иждивенцы имеют каждый диапазон.
Вы, конечно, сделаете это со временной копией рабочей книги.
Больше в
- http://www.operisanalysiskit.com/oakpruning.htm
- http://www.operisanalisiskit.com/help/2007/index.html?oakconceptpruning.htm
Учитывая возраст этого вопроса, вы вполне могли бы найти альтернативное решение или обходной путь.