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

Это относительно простая задача; все, что вам нужно сделать, это пройти макрос по ячейкам и выяснить, содержит ли ячейка формулу. Если да, проверьте, есть ли в формуле восклицательный знак. В ссылках на формулы используются восклицательные знаки, например:

=Sheet2!A1

Итак, если формула содержит восклицательный знак, вы можете игнорировать его. Если он не содержит восклицательного знака, вы можете заменить его его значением.

Sub ConvertFormulas1()

Dim c As Variant     Dim frm As String

On Error Resume Next

For Each c In Selection         If c.HasFormula Then             frm = c.Formula             If InStr(1, frm, "!") = 0 Then                 c.Value = c.Value             End If         End If     Next c End Sub

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

=[OtherWorksheet.xls]Sheet1'!$C$9

Обратите внимание, что имя другой книги заключено в квадратные скобки.

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

Sub ConvertFormulas2()

Dim c As Variant     Dim OtherSheet As Boolean     Dim frm As String

On Error Resume Next

For Each c In Selection         If c.HasFormula Then             frm = c.Formula             OtherSheet = False             If InStr(1, frm, "!") Then                 OtherSheet = True                 If InStr(1, frm, "[") Then                     OtherSheet = False                 End If             End If             If Not OtherSheet Then                 c.Value = c.Value             End If         End If     Next c End Sub

Следует отметить, что было бы относительно легко изменить формулу, используемую в этом макросе, чтобы она избавлялась от всех внешних ссылок, оставляя ссылки на текущий рабочий лист не повреждены. Фактически, все, что вам нужно сделать, это избавиться от проверки скобки, а затем избавиться от ключевого слова «Not» в структуре, которая проверяет переменную OtherSheet.

_Примечание: _

Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу с полезной информацией .

`ссылка: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новая вкладка браузера] `.

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (12158) применим к Microsoft Excel 2007, 2010, 2013 и 2016.

Вы можете найти версию этого совета для старого интерфейса меню Excel здесь:

link: / excel-Replacing_Some_Formulas_with_the_Formula_Results [Замена некоторых формул результатами формул].