Как подсчитать количество ячеек в диапазоне, названном с помощью инструкции Dim в VBA

Я пытаюсь понять, как использовать такие вещи, как .count, с диапазоном, который я сохранил как переменную в VBA.

Я сделал следующую функцию, которая работает

Function test2() As Variant

    test2 = Sheet12.Range("B1:B19").Count
    
End Function

Возвращается значение 19, поскольку в этом диапазоне 19 строк.

Когда я делаю следующее, он просто возвращает «#VALUE!» несмотря на то, что это то же самое, кроме того, как хранится диапазон

Function test2() As Variant

    Dim Grada As Variant
    Grada = Sheet12.Range("B1:B19")

    test2 = Grada.Count
    
End Function

Может ли VBA использовать такие операторы, как .count, для диапазонов, если они были сохранены таким образом, или что мне не хватает?

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
0
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Grada — это Variant, а не Object, поэтому без использования ключевого слова Set будет рассматриваться как значение. Другая тонкая проблема здесь — использование методов/свойств по умолчанию.

Sheet12.Range("B1:B19") имеет скрытый элемент по умолчанию, который возвращает значения, поэтому во втором коде вы вернули массив (причем двумерный массив) из Variant, который отражает содержимое этих 19 ячеек. Массив не является Object, поэтому не имеет методов. Здесь важно отметить, что использование скрытого элемента по умолчанию означает, что вы не возвращаете Range, как предполагали.

Set Grada = Sheet12.Range("B1:B19") возможно, дал желаемый результат, но такое позднее связывание означает, что вы не можете использовать IntelliText/AutoComplete, чтобы помочь вам определить, какие методы и свойства доступны.

Другой вариант — понять, что генерируется двумерный массив, и обобщить, что можно выбрать любой блок ячеек:

Function test2() As Variant

    Dim Grada As Variant
    Grada = Sheet12.Range("B1:B19").Value2 'I have added this last bit to make the default member explicit

    test2 = (UBound(Grada,1) - LBound(Grada,1) + 1) * (UBound(Grada,2) - LBound(Grada,2) + 1)

End Function

Я оставляю это как упражнение для ФП (причем простое упражнение), чтобы определить, почему эта формула работает. Использование UBound и LBound устраняет любые капризы в массивах с отсчетом от 0 или 1 - это то, что я теперь делаю по привычке, чтобы мой код по своей сути был безопаснее, если я копирую биты куда-то еще.

Я понимаю по кусочкам то, что вы здесь говорите. Попытка понять ваш код с некоторым успехом. '(UBound(Grada,1) Это должно дать мне 19, поскольку это верхняя граница моего массива - LBound(Grada,1) + 1) Это должно быть 2? поскольку нижняя граница равна 1 (UBound(Grada,2). Понятия не имею, что здесь происходит, поскольку массив имеет только одну запись?? Не могу найти никаких объяснений того, на что ссылается вторая переменная, с моим текущим уровнем понимания VBA - LBound(Grada,2) + 1)', а почему они вычитаются друг из друга, а затем умножаются, я совершенно запутался.

Izak Nash 20.07.2024 09:27

Нет, Grada быть Variant — это не то, что определяет тип назначения и использование или отсутствие использования свойств по умолчанию. Это наличие Set.

GSerg 20.07.2024 10:51

@GSerg- Спасибо, исправлено для полноты, учитывая ответ Балаза.

AJD 21.07.2024 21:55

@IzakNash: Понимание массивов (как считать и каковы границы) является важным фундаментальным навыком, но выходит за рамки этого вопроса и ответа. В Интернете есть множество руководств и статей, которые объяснят это с примерами.

AJD 21.07.2024 22:01
Ответ принят как подходящий

Когда вы определяете переменную как Variant, она может одинаково хранить значения или объекты. Но VBA должен знать, каков тип назначенного элемента. Если это значение, то имени переменной достаточно в левой части выражения. Если элемент, который вы хотите сохранить, является объектом любого типа, необходимо использовать объявление Set.

С помощью этого мода вы можете использовать переменную Grada с объектом в ней.

Function test2() As Variant

    Dim Grada As Variant
    Set Grada = Sheet12.Range("B1:B19")

    test2 = Grada.Count
    
End Function

Другие вопросы по теме