2013-11-06 2 views
1

Я вызываю функцию VBA из листа Excel. При изменении ячейки внутри кода функции VBA, Excel пытается повторно выполнить эту функцию снова (и снова во второй итерации и ...)Как предотвратить функцию VBA от повторного выполнения внутри кода

Пример: если у вас есть код:

Function test() As Variant 
    Range("A1") = 1 
    test = "test" 
End Function 

Когда вы используете "=test()" в любом месте, он вернется #VALUE!. Отладка покажет, что при обновлении A1 он попытается повторно выполнить test().

Можете ли вы предотвратить использование Excel? Например. говоря: «Не обновляйте ни одного из моих номеров, пока я не закончил эту функцию»? Я попытался Application.Calculation флаг, или делать какие-то внешние проверки параллельности, но это не похоже на работу ...

+5

Не пытайтесь изменить ячейку листа из UDF, только возвращайте значение через его заголовок. –

+1

@ Gary'sStudent действительная точка. Как правило, вы не можете изменить ДРУГИЕ ячейки, чем те, из которых вызывается функция. Измените его на Sub, тогда вы будете в порядке –

+2

Это возвращает ошибку из-за того, о чем упоминает Gary'sStudent. UDF не разрешается манипулировать листом, а строка 'Range (« A1 ») = 1' заставляет его завершать. Отладка покажет вам, что эта строка терпит неудачу. –

ответ

0

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

Другими словами, это не работает:

Function test() As Variant 
    Range("A1") = 1 
    test = "test" 
End Function 

Вместо позвонить test() из ячейки A1 и сделать это:

Function test() As Variant 
    test = 1 
End Function 

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

0

Try:

Function test() as Variant 
test="test" 
End Function 
+0

Целью было не возвращать «тест», это был самый простой пример, который я мог придумать, чтобы изменить значение внутри функции. – tb189

-1

Чтобы ответить на конкретный вопрос о том, как остановить функцию повторное выполнение при изменении A1 или вашей функции и прекращение его возврата #Value:
1. Используйте пользовательский интерфейс Excel (Формулы -> параметры расчета), чтобы изменить режим расчета на ручной
2. добавьте некоторые ошибки в вашу функцию как это.

Function test() As Variant 
    On Error Resume Next 
    Range("A1") = 1 
    test = "test" 
End Function 

как уже было сказано, эта функция не будет изменять значение A1

+0

Как я уже сказал: я пробовал флаг Application.Calculation или выполнял некоторые внешние проверки параллелизма (я думаю, это то, что вы имеете в виду с захватом ошибок), но это, похоже, не работает. У вас есть рабочий код, который показывает, что вы имеете в виду? – tb189

+0

это не сработает, OP пытается реализовать код, который специально запрещен к выполнению. –

+0

Вопрос OP состоял в том, как остановить функцию, возвращающую #Value и выполняемую каждый раз, когда он изменил функцию или ячейку, на которую он ссылался. Вот что я ответил. –

Смежные вопросы