Простое выражение поиска и замены для формул

У меня есть многочисленные ячейки по всему месту на листе, которые выглядят как =((E9-E8)/E8). Я хочу использовать первые два значения для этой новой формулы, (EXP((LN(E9/E8)/14.32))-1).

Как я могу изменить их все на новую формулу одним махом?

Ответ 1

Если формулы идентичны, вы можете использовать Find и Replace с помощью Match entire cell contents checked и Look in: Formulas. Выберите диапазон, перейдите в "Найти и заменить", введите свои записи и "Заменить все".

enter image description here

Или вы имеете в виду, что есть несколько формул с этой же формой, но разные ссылки на ячейки? Если это так, то один способ пойти - это регулярное выражение и замена. Регулярные выражения не встроены в Excel (или VBA), но могут быть доступны через библиотеку Microsoft VBScript Regular Expressions.

Следующая функция обеспечивает необходимую совместимость и возможность замены. Его можно использовать в подпрограмме, которая будет идентифицировать ячейки с формулами в указанном диапазоне и использовать формулы в качестве входных данных для функции. Для строк формул, которые соответствуют шаблону, который вы ищете, функция будет производить формулу замены, которая затем может быть записана обратно на рабочий лист.

Function RegexFormulaReplace(formula As String)
    Dim regex As New RegExp
    regex.Pattern = "=\(\(([A-Z]+\d+)-([A-Z]+\d+)\)/([A-Z]+\d+)\)"
'   Test if a match is found
    If regex.Test(formula) = True Then
        RegexFormulaReplace = regex.Replace(formula, "=(EXP((LN($1/$2)/14.32))-1")
    Else
        RegexFormulaReplace = CVErr(xlErrValue)
    End If
    Set regex = Nothing
End Function

Чтобы функция работала, вам нужно добавить ссылку на библиотеку Microsoft VBScript Regular Expressions 5.5. На вкладке Developer основной ленты выберите VBA, а затем References с главной панели инструментов. Прокрутите страницу вниз, чтобы найти ссылку на библиотеку и установите флажок рядом с ней.

Ответ 2

Оказывается, решение было переключиться на R1C1 Cell Reference. Мой рабочий лист был структурирован таким образом, что каждая формула имела ту же структуру, что и другие ссылки. Однако удача всегда была одинаковой.

=((E9-E8)/E8) 

стал

=((R[-1]C-R[-2]C)/R[-2]C)

и

(EXP((LN(E9/E8)/14.32))-1)

стал

=(EXP((LN(R[-1]C/R[-2]C)/14.32))-1)

В R1C1 Reference каждая формула была идентичной, поэтому поиск и замена не требовали подстановочных знаков. Спасибо тем, кто ответил!

Ответ 3

Используйте команду find и replace, доступную с помощью ctrl + h, убедитесь, что вы просматриваете функции ячеек. Вы можете затем подстановочные знаки, чтобы учесть любые отклонения формулы. * для # подстановочных знаков,? для символьных символов charcter и ~? или ~ * для поиска? или *.

Ответ 4

Я обычно обрабатываю это со вторым программным обеспечением. Для Windows я использую Notepad ++, для OS X я использую Sublime Text 2.

  • В Excel нажмите Control + ~ (OS X)
  • Excel преобразует все значения в свою версию формул
  • CMD + A (обычно я делаю это дважды), чтобы выбрать весь лист
  • Скопируйте все содержимое и вставьте их в Notepad ++/Sublime Text 2
  • Найти/заменить содержимое формулы здесь
  • Скопируйте содержимое и вставьте обратно в Excel, подтвердив любые проблемы с различиями в размерах ячеек.
  • Control + ~ для возврата в режим значений