Не совсем понятно, что вы ищете, когда вы упомянули, что в ячейках «B2: B500» есть значения, и счетчик должен вернуть 499, поскольку может быть несколько возможных сценариев:
Вы просто хотите подсчитать строки в диапазоне «B2: B500». Код будет:
Range("B2:B500").Rows.Count
Вы хотите подсчитать непустые ячейки в диапазоне «B2: B500». В этом случае, как предлагается в комментариях:
WorksheetFunction.CountA(Range("B2:B500"))
Как указано в вашем коде rng.End(xlDown)
, вы, вероятно, захотите подсчитывать непрерывные непустые ячейки, начиная с диапазона «B2» в общем диапазоне «B2: B500». Вы можете создать такую функцию:
Public Function countRows(rng As Range) As Long
Dim rw As Range
For Each rw In rng
If IsEmpty(rw) Then Exit For
countRows = countRows + 1
Next
End Function
Уточнение:
Основываясь на последующих комментариях, я подумал, что стоит объяснить, почему переменная countRows не была инициализирована добавлением строки countRows = 0
.
Некоторые языки программирования, такие как язык ассемблера, C, C ++, требуют явной инициализации. Это было специально разработано из-за философии, в которой конфликты между производительностью и безопасностью обычно разрешались в пользу производительности.
Однако это не относится к другим языкам программирования, таким как VBA или Java.
Что касается VBA, то при запуске макроса все переменные инициализируются значением. Числовая переменная инициализируется нулем, строка переменной длины инициализируется строкой нулевой длины (""), а строка фиксированной длины заполняется кодом ASCII 0. Переменные варианта инициализируются как пустые. Пустая переменная представлена нулем в числовом контексте и строкой нулевой длины ("") в строковом контексте.
Поэтому отдельная строка кода countRows = 0
не была добавлена в приведенный выше блок кода.
При кодировании нужно иметь в виду, что это может быть неверно для других языков.
person
curious
schedule
29.07.2017
COUNTA
.) - person YowE3K   schedule 29.07.2017If IsEmpty(Range(rng, rng.End(xlDown))) = True Then
, это то же самое, что иIf True = True Then
(в любом случае для пустых ячеек). ... просто используйтеIf IsEmpty(Range(rng, rng.End(xlDown))) Then
- person jsotola   schedule 30.07.2017=countRows(B2)
в ячейку C5, и она возвращает 499, потому что используются ячейки B2: B500, а затем вы вставляете несколько дополнительных строк (возможно, строки 501 и 502 ), ячейка C5 останется как 499, потому что функция зависит только от ячейки B2? Вам действительно следует передать B2: B500 (или B: B) в свою функцию, чтобы Excel знал, что ему необходимо пересчитать функцию, если что-либо в этом диапазоне изменится. (Или вы можете пометить функцию какVolatile
, но это снижает производительность и не рекомендуется.) - person YowE3K   schedule 31.07.2017Range()
, потому что он предполагаетActiveSheet.Range()
, и это может быть не вашим намерением. - person John Alexiou   schedule 31.07.2017