Этот параметр a
является объектом Range
- его следует объявить следующим образом:
Public Function cts(ByVal a As Range) As Range
IsEmpty
возвращает Boolean
; сравнение его с логическим литералом является излишним:
If IsEmpty(a.Value) = True Then
Должно быть:
If IsEmpty(a.Value) Then
Выражение ("Ok")
бесполезно оценивается как значение String
(это уже строковый литерал). Не используйте скобки, когда вы отбрасываете возвращаемое значение функции :
MsgBox "Ok"
a
объект Range
, это:
Range("a").ClearContents
Range("a").Activate
Вероятно, значит быть таким ("a"
не является допустимой ссылкой на ячейку, поэтому Range("a")
не может быть оценено):
a.ClearContents
a.Activate
Объявляя a As Range
, вы получаете IntelliSense и Ctrl + пробел для его вызовов участников; в вашем коде это неявное значение Variant
, поэтому все вызовы участников разрешаются во время выполнения (и Option Explicit
не может спасти вас от опечатки).
Функция ничего не возвращает, и неясно, что Range
вы хотите вернуть (или почему).
Если бы вы хотели, чтобы он возвратил a
, вы бы сделали это так:
Set cts = a
Если процедуре не нужно ничего возвращать, то это должна быть процедура Sub
, а не Function
.
ElseIf Int(a.Value) = False Then
что вызов функции Int
завершится с ошибкой несоответствия типов , если a.Value
содержит значение Variant/Error
, потому что условный блок сначала не оценивал, является ли IsError(a.Value)
истинным; = False
также приводит Integer
к Boolean
, поэтому выражение будет ошибочно принимать значение False
, если a.Value
равно 0
(поскольку ноль равен False
, а любое ненулевое значение равно True
). Функция Int
принимает 123.456
и выводит 123
, то есть возвращает целочисленную часть заданного значения - , она не оценивает, является ли аргумент целым числом или нет .
Чтобы оценить, является ли значение целочисленным, сначала необходимо убедиться, что вы смотрите на числовое значение:
If IsNumeric(a.Value) Then
Затем сравните Int(a.Value)
с a.Value
и посмотрите, совпадают ли они:
If Int(a.Value) = a.Value Then
Убедитесь, что вы поставили проверку ElseIf a.Value > 5 Or a.Value < 1 Then
в регистре IsNumeric
, в противном случае это условие также будет взорвано при значении ошибки, поскольку Variant/Error
нельзя сравнивать с любым значением, отличным от значения Error
.