Возникла следующая сложность: имеется огромный массив данных (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]
Но не могу приурочить этот код к своему примеру, так как со словарями не работал и не могу понять, как задать ключи по сцепленным ячейкам, и как потом осуществлять поиск по сцепленному значению. Пример прикладываю. Буду признателен!
Добрый день, уважаемые форумчане!
Возникла следующая сложность: имеется огромный массив данных (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
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]
[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