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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2017, 12:42   #1
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию Вытащить из словаря номер строки

Добрый день, уважаемые форумчане!

Есть такая задача: есть большой массив, строк эдак за 300 тысяч, есть значение (номер товара в примере) и варианты его написания. Искать в массиве и там определить номер строки на листе ну очень долго, потому как это значение берется из другой процедуры, в которой массив тоже очень большой и каждый элемент этого массива и есть то значение, которое проверяется в массивом вариантов. Решил использовать словарь для поиска, написал такой код:
Код:
Set sh2 = Sheets("Товары")

    CurrentRegionAddress = sh2.Cells(1, 1).CurrentRegion.Address
    LastRow = sh2.Cells(1, 1).CurrentRegion.Rows.Count
    LastColumn = sh2.Cells(1, 1).CurrentRegion.Columns.Count
    y = 2
    For i = 2 To LastColumn
        Set oDict = CreateObject("scripting.dictionary")
        a = sh2.Range(Cells(2, i), Cells(LastRow, i))
        For ii = 1 To UBound(a)
            oDict.Item(a(ii, 1)) = a(ii, 1)
        Next
        'тут проверка на наличие
        If oDict.Exists(y) Then 'и вот здесь получить номер строки
        
    Next
В примере специально ищу значение y=2, которое в массиве только в одном месте, строка 3. Вроде понимаю, что номер строки в данном случае будет номер записи в словаре +1, а вот как это прописать - не соображу.
Прошу помощи и заранее спасибо!
Вложения
Тип файла: xls пример.xls (36.5 Кб, 25 просмотров)
strannick вне форума Ответить с цитированием
Старый 28.08.2017, 12:47   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

А чем классичесний .FIND на листе не подходит?
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 28.08.2017, 12:51   #3
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

FIND дольше ищет
strannick вне форума Ответить с цитированием
Старый 28.08.2017, 13:35   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Номер записи в словаре не гарантируется!
Заводите другой словарь, куда кладите ключ с номером. Или в существующем сохраняйте к одному ключу массив значений.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 28.08.2017, 14:00   #5
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

О, привет старожилам! Давно не слышались) А как? Что-то типа:
Код:
oDict.Item("Key " & CStr(ii)) = a(ii, 1)
И как потом вытащить номер кейса?
Кстати, а зачем массив значений, если словарь создается в цикле по каждому столбцу?
И почему не гарантируется? Это на случай, если такое же значение еще где-то будет?

Последний раз редактировалось strannick; 28.08.2017 в 14:02.
strannick вне форума Ответить с цитированием
Старый 28.08.2017, 14:03   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Нет, не так.
Можно так:
Код:
oDict.Item(a(ii, 1)) = a(ii, 1) & "|" & ii
Затем извлекать из split(oDict.Item(a(ii, 1)),"|")
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 28.08.2017, 14:10   #7
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Ага, понял) Щас попробую...
strannick вне форума Ответить с цитированием
Старый 28.08.2017, 14:26   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ещё вариант - сохранять только индекс массива a, когда нужно значение - брать его по этому индексу, так и быстрее будет. Но нужно будет созранять в памяти массив с данными.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 28.08.2017, 15:01   #9
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Так, чего-то наверное не так. Наполнили словарь в цикле по массиву а:
Код:
oDict.Item(a(ii, i)) = a(ii, i) & "|" & ii
Потом берем значение игрека (в примере y=2), а в реальности это значение из другого массива, и проверяем есть ли оно в словаре:
Код:
If oDict.Exists(y) Then
и вот тут не поняточка чего писать если игрек в словаре есть.
Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Ещё вариант - сохранять только индекс массива a, когда нужно значение - брать его по этому индексу, так и быстрее будет. Но нужно будет созранять в памяти массив с данными.
С этим проблем нет, и массив и словарь убиваются после того, как прошла проверка. Но мы ж проверяем наличие не a(ii, i), а игрека.
strannick вне форума Ответить с цитированием
Старый 28.08.2017, 15:49   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Код:
oDict.Item(a(ii, i)) =  ii
...
If oDict.Exists(y) Then msgbox a(oDict.Item(y),1)
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выводить только измененные строки. Перед каждой строкой записывать номер строки в исходном тексте.используя строки и текст.файл nero4ka C++ Builder 1 13.06.2015 07:14
Выводить только измененные строки. Перед каждой строкой записывать номер строки в исходном тексте nero4ka Помощь студентам 1 11.06.2015 11:08
Ввести число N. Вывести N строк с номером строки, двоеточием и набором чисел от 1 до N+1-k (где k-номер строки) ( в С ) Eduard12345 Помощь студентам 1 11.10.2013 07:25
Вытащить номер из X-Lite Letnab Работа с сетью в Delphi 7 03.05.2012 12:20
Как вывести на экран номер строки с максимальной суммой элементов и номер столбца с минимальной суммой? Vetal888888 C# (си шарп) 4 20.12.2011 13:46