Страницы: 1
RSS
Подсчет указанных элементов массива без использования цикла
 
Доброго времени суток, уважаемые форумчане. Подскажите, что сейчас не так в моем коде. Ситуация такая: имеется готовый одномерный массив Arr_Count с данными, необходимо подсчитать сколько раз в массиве встречается тот или иной элемент (в примере буква с). Делать я это пытаюсь с помощью Application.CountIf, но почему-то не получается, код ругается на несовпадение типов 8-0 . Что сейчас написано неверно и как это исправить?
Код
Dim Arr_Count(4)
        Arr_Count(0) = "a"
        Arr_Count(1) = "b"
        Arr_Count(2) = "c"
        Arr_Count(3) = "c"
        Arr_Count(4) = "d"
    MsgBox Application.CountIf([Arr_Count], "c")
Заранее спасибо всем откликнувшимся.
 
Добрый день
CountIf на диете сидит. Питается только Range.
Код
Sub ddd_1()
Dim Arr_Count(5)
[a1].Resize(, 5) = Application.Index(Arr_Count, 1, 0)
MsgBox Application.WorksheetFunction.CountIf([a1].Resize(, 5), "c")
End Sub
 
Цитата
k61 написал:
CountIf на диете сидит
Спасибо за ответ. Жаль, хотелось бы обойтись без выгрузки (пусть даже на какой-нибудь черновой лист). k61, скажите, а решить этот мой вопрос без выгрузки как-нибудь кроме цикла (этот вариант был у меня запасным) можно?  
Изменено: OlegO - 23.03.2020 09:25:53
 
Код
Sub main()
    Dim Arr_Count(4)
    Dim arr$()
    Arr_Count(0) = "a"
    Arr_Count(1) = "c"
    Arr_Count(2) = "c"
    Arr_Count(3) = "c"
    Arr_Count(4) = "d"
    arr = Filter(Arr_Count, "c")
    MsgBox UBound(arr) + 1
End Sub


Но фильтруемый массив должен быть одномерным.
Изменено: Nordheim - 23.03.2020 09:27:49
"Все гениальное просто, а все простое гениально!!!"
 
И вам спасибо, Nordheim. Вроде понял логику, буду прикручивать к реальному коду (про размерность массива понял)
 
Цитата
OlegO: необходимо подсчитать сколько раз в массиве встречается тот или иной элемент
про CountIf вам уже ответили, а решается задача обычным циклом
Код
Dim arr, x, iTarget$, n&

arr=Array("a", "aa", "a", "aa", "aaa")
iTarget="a"

   For Each x In arr
      If x=iTarget Then n=n+1
   Next x
MsgBox n
Изменено: Jack Famous - 23.03.2020 10:02:15
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Nordheim написал:
массив должен быть одномерным
Учитывая и другие ограничения функции Filter, надёжнее считать по критерию в цикле.
Второе наступление на грабли:
Код
Dim Arr_Count(4)
 
Про цикл я и сам предполагал, но оставил этот вариант запасным, а что касается замечания от k61 (Dim Arr_Count(4)), то граблей не увидел (или не понял). В реальном коде данные в этот массив попадут из словаря, массив будет конечно динамическим (но одномерным)
 
Цитата
OlegO написал:
В реальном коде данные в этот массив попадут из словаря
Если есть словарь, для чего массив? а так же если из ключей словаря, то тут можно сразу сказать что они уникальные и больше единицы вы в итоге не получите при пересчете
"Все гениальное просто, а все простое гениально!!!"
 
В реальном коде в ключах словаря находится информация по номерам счетчиков электроэнергии + служебная инфа, в items - показатели счетчиков. Но при этом возможна ситуация при  которой 1 счетчик закреплен за 2 подразделениями и, следовательно, данные соответствующего item необходимо разделить на нужное кол-во. Для этого я создаю доп. массив (из ключей словаря) куда входят только номера. Ну а далее, при формировании массива для выгрузки, используя подсказку от Nordheim, я делю значение item-а словаря на полученное число (для абсолютного большинства случаев конечно на 1) и готово (по крайней мере сейчас ошибок в данных не вижу ;) )
Изменено: OlegO - 23.03.2020 14:06:50
 
Цитата
OlegO: без использования цикла
просто на всякий случай: если вы не видите цикл, то это ещё не значит, что его нет. например внутри функций CoutIf и Filter они точно есть, поэтому расскажите о причинах избегания цикла в его явном виде…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Если совсем честно, то просто код кажется красивее (а про скрытые циклы в функциях я догадываюсь)
 
Цитата
OlegO написал: одномерный массив Arr_Count с данными, необходимо подсчитать сколько раз в массиве встречается тот или иной элемент
Если уж циклы не нравятся: выгружаете массив на лист и считаете. Но красивее ли это цикла?
Страницы: 1
Наверх