Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Поиск по сцепленному значению в огромном массиве данных - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск по сцепленному значению в огромном массиве данных (Макросы/Sub)
Поиск по сцепленному значению в огромном массиве данных
akobir Дата: Суббота, 16.09.2017, 17:22 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 201
Репутация: 9 ±
Замечаний: 0% ±

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

Возникла следующая сложность: имеется огромный массив данных (500-600 тысяч строк), в которых хранятся необходимые данные.
Их нужно перенести на другой лист, если они будут соответствовать условиям.
В приложенном примере:
На листе 1 в ячейку B2 введена формула
Код
=ВПР($A2&B$1;Лист2!$C:$D;2;0)
(на лист2 добавлен доп. столбец C, объединяющий ячейки, который не хотелось бы создавать).
Так как массив огромный, ВПР заполняет все ячейки примерно час.

Прочитал, что можно использовать словари и в соседней теме нашел код от соклубника Hugo, за что ему огромное спасибо!
[vba]
Код
Sub tt()
    Dim a(), b(), c(), i&, t&

    With CreateObject("Scripting.Dictionary"): .comparemode = 1
        a = [Лист2!A1].CurrentRegion.Value
        For i = 2 To UBound(a): .Item(a(i, 1)) = i: Next
        b = [Лист1!A1].CurrentRegion.Columns(1).Value
        c = [Лист1!A1].CurrentRegion.Columns(2).Resize(, 3).Value
        For i = 2 To UBound(b)
            If .exists(b(i, 1)) Then
                t = .Item(b(i, 1))
                c(i, 1) = a(t, 2)
                c(i, 2) = a(t, 3)
                c(i, 3) = a(t, 4)
            Else
                c(i, 1) = "нет данных": c(i, 2) = "нет данных": c(i, 3) = "нет данных"
            End If
        Next
        [Лист1!A1].CurrentRegion.Columns(2).Resize(, 3).Value = c
    End With
End Sub
[/vba]

Но не могу приурочить этот код к своему примеру, так как со словарями не работал и не могу понять, как задать ключи по сцепленным ячейкам, и как потом осуществлять поиск по сцепленному значению.
Пример прикладываю.
Буду признателен!
К сообщению приложен файл: _2.xlsm (17.7 Kb)


e-mail: akobir.ismailov@gmail.com
 
Ответить
СообщениеДобрый день, уважаемые форумчане!

Возникла следующая сложность: имеется огромный массив данных (500-600 тысяч строк), в которых хранятся необходимые данные.
Их нужно перенести на другой лист, если они будут соответствовать условиям.
В приложенном примере:
На листе 1 в ячейку B2 введена формула
Код
=ВПР($A2&B$1;Лист2!$C:$D;2;0)
(на лист2 добавлен доп. столбец C, объединяющий ячейки, который не хотелось бы создавать).
Так как массив огромный, ВПР заполняет все ячейки примерно час.

Прочитал, что можно использовать словари и в соседней теме нашел код от соклубника Hugo, за что ему огромное спасибо!
[vba]
Код
Sub tt()
    Dim a(), b(), c(), i&, t&

    With CreateObject("Scripting.Dictionary"): .comparemode = 1
        a = [Лист2!A1].CurrentRegion.Value
        For i = 2 To UBound(a): .Item(a(i, 1)) = i: Next
        b = [Лист1!A1].CurrentRegion.Columns(1).Value
        c = [Лист1!A1].CurrentRegion.Columns(2).Resize(, 3).Value
        For i = 2 To UBound(b)
            If .exists(b(i, 1)) Then
                t = .Item(b(i, 1))
                c(i, 1) = a(t, 2)
                c(i, 2) = a(t, 3)
                c(i, 3) = a(t, 4)
            Else
                c(i, 1) = "нет данных": c(i, 2) = "нет данных": c(i, 3) = "нет данных"
            End If
        Next
        [Лист1!A1].CurrentRegion.Columns(2).Resize(, 3).Value = c
    End With
End Sub
[/vba]

Но не могу приурочить этот код к своему примеру, так как со словарями не работал и не могу понять, как задать ключи по сцепленным ячейкам, и как потом осуществлять поиск по сцепленному значению.
Пример прикладываю.
Буду признателен!

Автор - akobir
Дата добавления - 16.09.2017 в 17:22
KuklP Дата: Суббота, 16.09.2017, 19:08 | Сообщение № 2
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
[vba]
Код
Sub test()
    Dim a(), b(), i&, j&
    With CreateObject("Scripting.Dictionary")
        a = [Лист2!A1].CurrentRegion.Value
        For i = 1 To UBound(a): .Item(a(i, 1) & a(i, 2)) = a(i, 4): Next
        b = [Лист1!A1].CurrentRegion.Value
        For i = 2 To UBound(b)
            For j = 2 To UBound(b, 2)
                If .exists(b(i, 1) & b(1, j)) Then
                    b(i, j) = .Item(b(i, 1) & b(1, j))
                Else
                    b(i, j) = "нет данных"
                End If
            Next
        Next
        [Лист1!A1].CurrentRegion.Value = b
    End With
End Sub
[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
Сообщение[vba]
Код
Sub test()
    Dim a(), b(), i&, j&
    With CreateObject("Scripting.Dictionary")
        a = [Лист2!A1].CurrentRegion.Value
        For i = 1 To UBound(a): .Item(a(i, 1) & a(i, 2)) = a(i, 4): Next
        b = [Лист1!A1].CurrentRegion.Value
        For i = 2 To UBound(b)
            For j = 2 To UBound(b, 2)
                If .exists(b(i, 1) & b(1, j)) Then
                    b(i, j) = .Item(b(i, 1) & b(1, j))
                Else
                    b(i, j) = "нет данных"
                End If
            Next
        Next
        [Лист1!A1].CurrentRegion.Value = b
    End With
End Sub
[/vba]

Автор - KuklP
Дата добавления - 16.09.2017 в 19:08
akobir Дата: Воскресенье, 17.09.2017, 14:26 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 201
Репутация: 9 ±
Замечаний: 0% ±

Excel 2010
KuklP, Спасибо!
Просто до жути...


e-mail: akobir.ismailov@gmail.com
 
Ответить
СообщениеKuklP, Спасибо!
Просто до жути...

Автор - akobir
Дата добавления - 17.09.2017 в 14:26
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск по сцепленному значению в огромном массиве данных (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!