Excel: список диапазонов с таргетингом по НЕПРАВИЛЬНЫМ формулам - PullRequest
5 голосов
/ 29 августа 2008

У нас есть несколько очень больших рабочих книг Excel (десятки вкладок, по МБ каждая, очень сложные вычисления) с множеством десятков, возможно, сотен формул, в которых используется страшная функция INDIRECT. Эти формулы распределены по всей рабочей книге и предназначены для поиска нескольких таблиц данных.

Теперь мне нужно переместить диапазоны данных, на которые нацелены эти формулы, в другое место в той же книге.

(Причина не особенно актуальна, но интересна сама по себе. Нам нужно запустить эти вещи в Excel Calculation Services, и задержка загрузки каждой из довольно больших таблиц по одной за один раз оказалась неприемлемо высокой. перемещают столы в непрерывном диапазоне, чтобы мы могли загрузить их все за один выстрел.)

Есть ли способ найти все НЕПРАВИЛЬНЫЕ формулы, которые в настоящее время ссылаются на таблицы, которые мы хотим переместить?

Мне не нужно делать это онлайн. Я с радостью возьму что-то, что будет работать 4 часа, пока это будет надежно.

Имейте в виду, что методы .Precedent, .Dependent и т. Д. Отслеживают только прямые формулы.

(Кроме того, переписывание таблиц в независимо от того, нам не подходит).

Спасибо!

Ответы [ 5 ]

5 голосов
/ 29 августа 2008

Вы можете перебирать всю книгу с помощью 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)». Вы можете легко заменить функцию замены на что-то более сложное, если у вас есть более сложные косвенные функции. Производительность не так уж плоха, даже для больших книг.

1 голос
/ 16 сентября 2008

В: «Есть ли способ найти все НЕПРАВИЛЬНЫЕ формулы, которые в настоящее время ссылаются на таблицы, которые мы хотим переместить?»

Пока я читаю, вы хотите заглянуть в аргументы INDIRECT, чтобы найти ссылки на области, представляющие интерес. В общем, я бы написал VBA, чтобы использовать синтаксический анализатор регулярных выражений или даже простой INSTR, чтобы найти INDIRECT (чтение перед совпадением), затем EVALUATE () строку внутри, чтобы преобразовать ее в фактический адрес, повторить, как требуется для нескольких INDIRECT. (...) вызывает и выводит формулу и ее перевод в два столбца на листе.

0 голосов
/ 15 сентября 2009

Я не уверен, что этикет SO касается упоминания продуктов, с которыми связан писатель, но OAK, Operis Analysis Kit, надстройка Excel, может заменить функции INDIRECT ссылками на ячейки, которые они разрешают к. Затем вы можете использовать инструменты аудита Excel, чтобы определить, какие иждивенцы имеют каждый диапазон.

Вы бы, конечно, сделали это с временной копией рабочей книги.

Больше на

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

0 голосов
/ 29 августа 2008

К сожалению, аргументы НЕПОСРЕДСТВЕННЫЕ обычно более сложны, чем тот. Вот фактическая формула из один из листов, не самый Сложная формула у нас есть:

=IF(INDIRECT("'"&$B$5&"'!"&$O5&"1")="","",INDIRECT("'"&$B$5&"'!"&$O5&"1"))

хм, вы можете написать простой парсер, игнорируя большинство символов и просто ища соответствующие части (в этом примере: «A..Z», «0..9» и «!:» И т. Д.) но вы столкнетесь с проблемами, если аргументы в «косвенном» являются функциями.

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

Если вы «получите» каждую клетку в огромном электронная таблица, которая может вам понадобиться чудовищные объемы памяти. я все еще готов попробовать и принять это риск.

Метод выбора используемого диапазона в PabloG - это путь, по которому я пошел (добавил его в мой оригинальный код). Скорость довольно хорошая, особенно если вы проверите, содержит ли текущая ячейка формулу. Очевидно, все зависит от размера вашей рабочей книги.

0 голосов
/ 29 августа 2008

Вы можете использовать что-то подобное в 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 вы можете добавить код на свой вкус

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...