Страницы: 1
RSS
Не получается осуществить фильтр массива
 
Добрый день.
Подскажите  как можно решить ошибку несоответствие типа(13)в данном коде:
Код
Sub test()
  Dim arrA
  Dim arrB
  
  arrA = Range("A1:A9").Value
  arrB = Filter(arrA, "январь")
  Range("B1").Resize(UBound(arrB)) = arrB
    
End Sub
Выдает что ошибка в типе переменной, предполагаю что функции  Filter не устраивает , что массив arrA не обозначен как string(хотя в окне локал он фигурирует какVatiant\String).
Но  arrA сделать типа string не могу,так как отладчик начнет ругаться на эту строку  arrA = Range("A1:A9").Value
при этом  при таком исполнении все работает
Код
Sub test()
  Dim arrA(3) As String
  Dim arrB As Variant
  arrA(1) = "a"
  arrA(2) = "b"
  arrA(3) = "c"
  arrB = Filter(arrA, "b")
End Sub
Фактически все одно и тоже за исключением что в первом варианте назначение идет через диапазон, а во втором в ручную. Спасибо
 
почитайте про Filter вот тут https://docs.microsoft.com/ru-ru/office/vba/language/reference/user-interface-help/filter-function?f...

Filter(sourcearray, match, [ include, [ compare ]])
sourcearray Required. One-dimensional array of strings to be searched.
Он используется только для одномерного массива, а arrA = Range("A1:A9").Value - это двумерный массив. С ним Filter не работает
Изменено: New - 11.01.2021 00:43:00
 
Вот-вот. В первом случае массив двумерный, во втором - одномерный
 
Hoc40, здравствуйте!

Подробнее о том, что выше посоветовали:
  1. При получении массива с листа методом arr=rng.Value, это ВСЕГДА будет ДВУМЕРНЫЙ массив (кроме случаев, когда диапазон или первая область диапазона состоит из одной ячейки — в таком случае, вы просто получите значение или ошибку, если переменная объявлена массивом)
  2. Вместо функции Filter используйте простой цикл с отбором - это и быстрее, и универсальнее (можно проверять как угодно), и не нужно преобразовывать "готовый" массив с листа в одномерный
Тестовый стенд
Матчасть по массивам
Изменено: Jack Famous - 11.01.2021 11:02:45
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
New, vikttur,Спасибо вам за  помощь
Jack Famous, Здравствуйте. Спасибо вам за подробный ответ, особенно за п1  а то уже начал думать как объявить одномерный массив на основе диапазона.

Не сочтите за наглость, просто мой опыт в программировании не такой большой... можно ли небольшой пример цикла с отбором ,где не нужно преобразовывать "готовый" массив с листа в одномерный? Или тут подразумевается обычный цикл For, внутри которого If перебирает значения ячейки на соответствие и если оно есть, то назначает в элемент массива?
И вопрос по процедуре, которую вы привели для наглядности размеров массива исходя из диапазона,
1-не могу понять как мне загуглить, чтобы почитать про такие  диапазоны - Range("A1,B1:B2")- просто впервые с ними сталкиваюсь
2 - изза чего выдает ошибку ? Ведь диапазон для каждого из двух массивов существует...
Код
arrAr = rng.Value
arrVar = rng.Value  При Set rng = Range("A1")

Изменено: Hoc40 - 11.01.2021 22:55:02
 
Цитата
Hoc40: тут подразумевается обычный цикл
да — ничего сложного. Более того - можно сразу внутри массива перекладывать, не создавая новый и выгрузить только отфильтрованные строки
Код

Цитата
Hoc40:как мне загуглить, чтобы почитать про такие  диапазоны - Range("A1,B1:B2")- просто впервые с ними сталкиваюсь
это просто диапазон, состоящий из нескольких областей (вручную можно получить, выделяя с зажатым Ctrl)
Пример

Цитата
Hoc40:из-за чего выдает ошибку?
разные переменные: var - вариативная, то есть может быть чем угодно (число, текст, диапазон, массив, объект), а ar - переменная массива и может быть только им. Значение диапазона, состоящего из 1ой ячейки — это просто значение этой ячейки (то, что в ней), а не массив. Для вариативной это не проблема - ей просто присваивается это значение, а вот переменной массива нужен только массив  ;)
Остальные вопросы не по этой теме прошу рассматривать в отдельных темах
Изменено: Jack Famous - 12.01.2021 10:07:47
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
а куда вика пропала в пересборе
 
Цитата
Тимофеев: куда вика пропала в пересборе
странная формулировка вопроса: она там и не должна быть — она же не ВАка  :D

Или вы неправильно понимаете принцип работы макроса - он НЕ СОХРАНЯЕТ все значения, а просто ПЕРЕЗАПИСЫВАЕТ с первой строки СОВПАВШИЕ (зелёные) в порядке появления, а остальная часть массива (жёлтая) просто остаётся как есть (хвост, который мы не выгружаем)
Можно создать второй массив, размером точно таким, как надо, но будет больше кода и дольше работать (может, незаметно дольше), так что, если "старый" массив не нужно сохранять для каких-либо целей, то перезапись — лучшее решение  :idea:
Изменено: Jack Famous - 12.01.2021 10:20:59
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, Огромное спасибо вам!!!
Страницы: 1
Наверх