Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Countif для vba массива
 
Пример кода:
Код
Sub Test()
Dim MyArr(3)
MyArr(0) = 0
MyArr(1) = 0
MyArr(2) = 1
MyArr(3) = 1
Test = Application.WorksheetFunction.CountIf(MyArr, 0)
End Sub

Если в первом аргументе, поставить не диапазон на листе, а массив VBA, то VBA выдаст сообщение о ошибке.
Какая есть альтернатива WorksheetFunction.CountIf, что бы можно было бы использовать только VBA массив в аргументе (не выводить на лист)?
 
Альтернатива - цикл
 
Для строковых массивов есть функция VBA Filter
Владимир
 
Filter работает и с массивами Variant, как в примере. Проблема в том, что эта функция ищет вхождение, т.е. число 10 будет найдено по условию 0.
Можно так
Код
Sub Test()
Dim MyArr(3), x
MyArr(0) = 3
MyArr(1) = 0
MyArr(2) = 30
MyArr(3) = 0
x = UBound(Split(" " & Join(MyArr, "  ") & " ", " 3 "))
End Sub
Изменено: Казанский - 30 Апр 2019 14:03:11
 
sokol92, Filter "фильтрует" по типу Like/Not Like со звёздочками по краям, то есть по признаку "0" отфильтрует и 10 и 100 и т.д.
Казанский,
Тогда можно ещё вот так
только вряд ли такой подход будет быстрее прямого подсчёта  :D
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
Казанский написал: x = UBound(Split(" " & Join(MyArr, "  ") & " ", " 3 "))
Если вместо "3" вставить переменную, например в цикле:
Код
For i = 0 To 3
x = UBound(Split(" " & Join(MyArr, "  ") & " ", " i "))
Next i 

Тогда функция будет искать и считать "i". А можно как нибудь записать чтобы вместо "i" считала значения переменной(0, затем 1,2,3)?
Изменено: OSA913 - 30 Апр 2019 16:00:42
 
Руководствуясь вышесказанным, нужно признать, что "устами младенца..." (#2)
Владимир
 
OFF
sokol92, я когда-то тоже думал, что все штатные функции (листа и VBA) вычисляют каким-то волшебным образом. Но на самом-то деле в них тоже циклы и всё такое — просто более грамотно написано (и на других языках).
Так, например, с Join в скорости можно сравняться, а Split легко обогнать
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
OSA913, можно. И часть операций желательно вынести из цикла
Код
  s = " " & Join(MyArr, "  ") & " "
  For i = 0 To 3
    x = UBound(Split(s, " " & i & " "))
Debug.Print i, x 'например
  Next i
 
Круто) Всех благодарю !
Страницы: 1
Читают тему (гостей: 1)
Наверх