IsEmpty возвращает True как для пустого диапазона, так и для диапазона, содержимое ячейки которого пустое, как определить разницу? - PullRequest
0 голосов
/ 28 февраля 2020
Dim R1, R2, R3 as Range
Set R1 = Range("A1")
Debug.Print IsEmpty(R1), IsEmpty(R2)
' Assuming A1 is blank, both will return True

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

Любые идеи, кроме попыток On Error Resume Next доступа, например, R.Cells?

РЕДАКТИРОВАНИЕ

По какой-то причине последний определенный диапазон автоматически инициализируется в Ничего. У меня более 3-х диапазонов - это мой фактический код, я добавил код R3 в приведенном выше коде.

Итак, после Dim: R1 пуст, R2 пуст, R3 пуст

Опять R2 пуст не Ничего. Тестирование на R2 Is Nothing завершается с ошибкой 424.

РЕДАКТИРОВАТЬ 2

Sub zero()
 Dim R1, R2, R3, R4 As Range
 Set R1 = Range("a1") ' a1 is blank
 On Error GoTo ERROR
 If R2 Is Nothing Then Debug.Print "nothing" Else Debug.Print "not nothing"
ERROR:
  Debug.Print Err.Number, Err.Description
End Sub

Результаты 424

РЕДАКТИРОВАТЬ 3

 Dim R1 As Range, R2 As Range, R3 As Range, R4 As Range

работает

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Когда вы объявляете диапазон в VBA, объектная переменная Is Nothing. Однако, если вы объявляете переменную как вариант, IsEmpty возвращает False (хотя ей ничего не назначено), а Is Nothing возвращает ошибку.

Ваше утверждение, что Dim R1, R2 As Range "работает нормально", содержит квалифицированную правду. Варианту может быть назначен любой тип данных, даже объект, но он не может принимать свойства диапазона, пока ему не назначен диапазон. Лучше объявлять переменные такими, какие они есть.

Кажется, что IsEmpty возвращает ожидаемый результат, только если он применяется к одной ячейке, но всегда имеет значение False для диапазона ячеек. Честно говоря, я избегаю IsEmpty в своем программировании, потому что я никогда не изучал запутанные сложности. Я использую функцию Len() для отдельных ячеек, иногда в сочетании с Trim(), и WorksheetFunction.CountA(), если я хочу знать, является ли диапазон ячеек пустым.

1 голос
/ 28 февраля 2020

Ничего

Во многом как переменная типа Long по умолчанию равна 0, пока не указано иное, переменная типа Range по умолчанию равна Nothing, пока не указано иное.

Dim R1 as Range, R2 as Range
Set R1 = Range("A1")

'Outputs
'R1 Is Nothing = FALSE
'R2 Is Nothing = TRUE
'IsBlank(R1) = TRUE/FALSE
'IsBlank(R2) = Type Mismatch Error

Правильное объявление переменных

Вышесказанное относится только к Range переменным. Вы только что объявили свою последнюю переменную как Range, а остальные по умолчанию Variant, которая является источником вашей второй ошибки.


enter image description here

https://docs.microsoft.com/en-us/office/vba/language/concepts/getting-started/declaring-variables

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