как очистить и активировать ячейку как переменные? - PullRequest
0 голосов
/ 22 мая 2019

Я пытался очистить и активировать ячейку по функции, но она не работает.

 Function cts(a) As Range
 If IsEmpty(a.Value) = True Then
     MsgBox ("ok")
 ElseIf IsNumeric(a.Value) = False Then
     MsgBox "non-numeric entry"
     Range("a").ClearContents
     Range("a").Activate
 ElseIf Int(a.Value) = False Then
     MsgBox "integer required"
     Range("a").ClearContents
     Range("a").Activate
 ElseIf a.Value > 5 Or a.Value < 1 Then
     MsgBox "valid values are between 1 and 5"
     Range("a").ClearContents
     Range("a").Activate
 Else:
     MsgBox "ok"
 End If

 End Function

Появляется сообщение, но нет ни очистки, ни активации.

1 Ответ

1 голос
/ 22 мая 2019

Этот параметр 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...