Почему VBA UDF "Range.Formula =" не работает?

Я хочу скопировать формулу из одной ячейки/ячеек в другую ячейку/ячейки с помощью Range.Formula = . Но это не работает, как ожидалось.

Если я запускаю VBA шаг за шагом, функция завершится на Range.Formula = без ошибок.

Function test1(sOURCE As Range, tARGET As Range)
    tARGET.Formula = sOURCE.Formula
    test1 = tARGET.Formula
End Function

Excel cells value

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это ограничение по дизайну.

Поскольку пользовательская функция не может изменить никакие другие ячейки/формулы. UDF может возвращать ценность только в ячейку, в которой использовалась UDF. Поэтому tARGET.Formula = sOURCE.Formula невозможно.

Также test1 = tARGET.Formula вернет формулу tARGET в виде текста. Он не заменит формулу, используемую в ячейке, и не будет оценивать формулу.

Ответ принят как подходящий

Вы пытаетесь изменить формулу другой ячейки с помощью UDF. Согласно документация Майкрософт, это невозможно сделать, но Райан Уэллс на самом деле нашел хороший обходной путь. См.: Как изменить другую ячейку с помощью функции VBA UDF. Сравните также: VBA: как изменить значение другой ячейки с помощью функции?

Нам нужно использовать Evaluate на «вспомогательной» подпрограмме. Я немного изменил первый пример, предоставленный Уэллсом, чтобы он соответствовал вашим потребностям:

Function copyFormula(copyFrom As Range, copyTo As Range)

copyFrom.Parent.Evaluate "copyOver(" & copyFrom.Address() _
                        & "," & copyTo.Address() & ")"
                        
copyFormula = "Formula " & copyFrom.Address() & " -> " & copyTo.Address()

End Function

Private Sub copyOver(copyFrom As Range, copyTo As Range)

copyTo.Formula = copyFrom.Formula
    
End Sub

Это работает, но имейте в виду, что (что интересно) формула не будет автоматически рассчитываться после вставки, даже если расчет установлен на автоматический. Реализация:

enter image description here Результат:

enter image description here

Один из способов решить эту проблему — включить вкладку Worksheet_Change для рабочего листа, на котором вы используете формулу. Например. просто:

Private Sub Worksheet_Change(ByVal Target As Range)

Calculate

End Sub

Но любое последующее действие на листе запускает расчет. Кроме того, имейте в виду, что вы не сможете перезаписать целевую ячейку, пока вы используете copyFormula с этой ячейкой. Поскольку он просто будет немедленно перезаписывать его формулой (с 0 в качестве вывода, если вышеуказанный трюк не применяется). Это может сбить с толку ваших пользователей.

Другие вопросы по теме