Excel: списки диапазонов, нацеленных на косвенные формулы

StackOverflow https://stackoverflow.com/questions/34493

  •  09-06-2019
  •  | 
  •  

Вопрос

У нас есть несколько очень больших рабочих книг 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

Учитывая возраст этого вопроса, вы вполне могли бы найти альтернативное решение или обходной путь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top