2016-09-11 7 views
0

WorksheetFunction.Or оценивает все аргументы или немедленно возвращает True после аргумента True?Excel WorksheetFunction.Or

Дело в том, я пытаюсь проверить, является ли переменная числовая, и если это так, я хочу, чтобы проверить, если он меньше 1. Вы можете увидеть ниже:

If IsNumeric(lvl) Or lvl < 1 Then 
    Do sth... 
End If 

Описан here , оператор Or в VBA оценивает все аргументы, и я получаю ошибку несоответствия типа, когда _lvl_ не является числовым. WorksheetFunction.Or ведут себя одинаково?

+0

Я знаю, что у VBA нет ленивого ИЛИ, но функции рабочего листа Excel все написаны на C и довольно оптимизированы. Я бы определил некоторые UDF в VBA, у которых есть побочные эффекты (например, показ окна сообщений), а затем запустить три из них через функцию ИЛИ, чтобы проверить это. – JamesFaix

+0

Я думаю, вы хотите использовать 'And' вместо' Or' в вашем примере. Тем не менее, это все та же проблема. – arcadeprecinct

+0

@arcadeprecinct Да, вы правы. Просто хотел составить пример, плохой пример. Спасибо, что заметили. –

ответ

1

Да, WorksheetFunction.Or ведет себя одинаково.

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

Для того чтобы ленивая оценка была удачной, конструктор оценки должен быть частью синтаксиса языка. У VBA нет синтаксиса, поэтому он не будет работать при вызове какой-либо функции.

+0

Интересно, так что даже если функция рабочего листа будет использовать ленивую оценку, вызов ее из VBA не поможет? – arcadeprecinct

+0

@arcadeprecinct Вы не можете сделать такой вывод, основываясь на том, что так оно работает на стороне VBA. Это может очень хорошо работать по-разному на стороне Excel, потому что формула Excel, вызванная с листа, представляет собой другой язык/синтаксис, который может поддерживать короткое замыкание. В действительности это не поддерживает, но это не потому, что VBA также не поддерживает его. – GSerg