Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2018, 14:22   #1
Maksim_V
Пользователь
 
Регистрация: 06.07.2017
Сообщений: 21
По умолчанию Массивы: номер строки элемента

Добрый день!
С массивами только начинаю знакомиться. Подскажите пожалуйста как вывести в результат номера строк excel соответствующие элементам заполненного массива, а не их значения?


Массив значений формирую так:

Код:
    ReDim avArr(1 To Rows.Count, 1 To 1)
    With New Collection
        On Error Resume Next
        For Each vItem In Range("A11", Cells(Rows.Count, 1).End(xlUp)).Value
            If vItem Like "**.**.****" And vItem <> "--.--.----" Then
                .Add vItem, CStr(vItem)
                If Err = 0 Then
                    x = x + 1
                    avArr(x, 1) = vItem
                Else
                    Err.Clear
                End If
            MyResult = MyResult & vItem & Chr(13)
            End If
            
        Next
    End With
    
    MsgBox MyResult
Maksim_V вне форума Ответить с цитированием
Старый 29.03.2018, 14:41   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

трудно понять чего Вы добиваетесь этим кодом...
особенно, когда Вы:
- первой фразой говорите о работе с массивами
- собираете коллекцию
- используете несуразную маску "**.**.****"
- и выводе как результат строку

а что нужно-то?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 29.03.2018, 14:54   #3
Maksim_V
Пользователь
 
Регистрация: 06.07.2017
Сообщений: 21
По умолчанию

Да, наверное путаю, массивы и коллекции для меня пока один дремучий лес...
Маска "**.**.****" нужна в конкретной задаче, но не суть.
Чтобы понятнее стало, просто на отрешенном примере попробую объяснить:

Есть диапазон ячеек A1:A10, заполненный числовыми значениями, например от 10 до 20 по порядку.
Нужно записать в коллекцию только номера строк тех элементов, которые больше 15.
Т.е. на выходе будет: 6, 7, 8, 9, 10

Я знаю как это сделать в цикле, но для ускорения работы, мне нужно это сделать на коллекциях или массивах, вот моя задача.
Спасибо!
Maksim_V вне форума Ответить с цитированием
Старый 29.03.2018, 15:21   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

вот чтобы стало понятнее - опишите задачу, которую Вы решаете, а не метод, которым Вы пытались ее решить

а по поводу маски
Ваша "**.**.****" ничем не отличается от более скромной "*.*.*"
возможно с Вашей точки зрения это "**.**.****" маска даты типа 29.03.2018, то с точки зрения VBA это "*.*.*" маска абсолютно аналочичная вашей и под это маску подходит ЛЮБАЯ СТРОКА, в которой есть хотябы 2 точки.
например:
.. - подходит! несмотря на все ее аскетичность (причем подходит даже без " - подходит!" после двух точек)
зорин.зоман.в-газы - подходит!
содержание романа "Война и мир" - полностью подходит под эту маску, потому что там есть как минимум 2 точки в тексте (покойный Лев Толстой именно таким способом отделял одно предложение от другого)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 29.03.2018, 15:51   #5
Maksim_V
Пользователь
 
Регистрация: 06.07.2017
Сообщений: 21
По умолчанию

По маске у меня фильтруется код проекта, который имеет структуру xx.xx.xxxx, например 12.12.1234. С помощью нее я отсеиваю ячейки пустые, нулевые, с пробелом, с текстом, хотя здесь мог бы напороться если бы в тексте оказалось 2 точки. Теперь буду знать, спасибо!
Но суть не только в маске, задача в следующем:
- на листе в столбце A коды проектов, их много, но там не только коды, но и ячейки с прочими данными, которые не нужны для дальнейшего анализа
- на текущий момент я написал код состоящий из большого количества циклов, которые по маске и прочим параметрам, выбирают только строки с нужным кодом, а дальше происходят различные операции.
Цикл фильтрации по маске повторяется много раз в различных блоках кода. И я не могу написать один цикл фильтрации, а внутри остальные операции, поверьте на слово, такая особенность. Для того чтобы каждый раз не пробегать весь столбец, отфильтровывая нужные строки с кодами, я и хочу оптимизировать скорость процесса - т.е. 1 раз занести отфильтрованные строки в коллекцию (массив), а дальше уже обращаться к этой коллекции (массиву) сколько угодно раз.
Maksim_V вне форума Ответить с цитированием
Старый 29.03.2018, 16:06   #6
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Maksim_V Вашей маске больше подошла б ??.??.???? ведь в переводе на человеческий "**" означает "БезсконечностьБесконечность", а из школы мы знаем что БесконечностьБесконечность = Бесконечность, следовательно ** = *
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 29.03.2018, 16:22   #7
Maksim_V
Пользователь
 
Регистрация: 06.07.2017
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Вашей маске больше подошла б ??.??.????
Спасибо! Да, это больше подходит, хотя в реальных файлах у меня работает и имеющаяся маска, т.к. там ограниченный набор вероятных значений. Но мы не туда ушли с этой маской, это дело десятое, главное для меня оптимизация кода, как описал выше. Надеюсь на подсказку.
Maksim_V вне форума Ответить с цитированием
Старый 29.03.2018, 16:45   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
БесконечностьБесконечность = Бесконечность
Саша, все не так просто... был один эпизод,
когда Чак Норрис выступал с лекцией перед студентами-математиками, ведущий представил его:
- А сейчас перед вами выступит Чак Норрис - единственный человек в мире, который досчитал до бесконечночти!
- Дважды, - скромно поправил Час Норрис
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 29.03.2018, 17:28   #9
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

см.вложение
добавляйте данные в колонку А. жмите кнопку
как видите для масок E1 и G1 - выводятся аналогичные результаты! похоже Вам-таки нужна маска: ??.??.????
Вложения
Тип файла: zip ДанныеПоМаске.zip (15.4 Кб, 10 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 29.03.2018, 17:45   #10
Maksim_V
Пользователь
 
Регистрация: 06.07.2017
Сообщений: 21
По умолчанию

Спасибо! Да я понял что маска нужна другая, не спорю, точнее в моём случае, если не ошибаюсь лучше даже "##.##.####", т.к. внутри должны быть только числовые элементы, и не должно быть буквенных. Правильно?

Собственно основное решение я похоже нашел (на зарубежном сайте) на словаре:

Код:
   Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary")
   Dim r As Range
 
   dic.CompareMode = vbTextCompare
   For Each r In Range(Cells(11, 1), Cells(itog, 1))
        If r Like "##.##.####" Then
           If Not dic.Exists(r.Row) Then dic.Add r.Row, ""
        End If
   Next r
   MsgBox Join(dic.Keys, Chr(10))
Сейчас тестирую.
Еще раз спасибо!
Maksim_V вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти номер строки и столбца максимального элемента.(PascalABCNET) FlayGlam Помощь студентам 3 04.12.2016 04:42
Номер элемента последовательности lefok Помощь студентам 1 28.11.2015 17:08
Выводить только измененные строки. Перед каждой строкой записывать номер строки в исходном тексте.используя строки и текст.файл nero4ka C++ Builder 1 13.06.2015 07:14
3. Вывести номер строки наименьшего элемента в двумерном массиве zebatic Помощь студентам 1 11.06.2010 00:14