Страницы: 1
RSS
VBA поиск значения по двум критериям и вывод поиска, поиск с использованием VBA
 
Добрый день, в вложении написана формула в "E2:G4", она полностью устраивает за исключением того что придется ее протягивать вправо на 4500 столбов и вниз на 5000 строк
Можно ли эту проблему решить написанием макроса в замен формулы =ЕСЛИОШИБКА(ИНДЕКС(Sheet1!$D:$D;ПОИСКПОЗ(Лист2!$D2&Лист2!E$1;Sheet1!$I:$I&Sheet1!$M:$M;0);1);"")
 
при условии что на листе нет формул.
Код
Sub Button1_Click()
    arr = ActiveSheet.UsedRange.Value
    arr2 = Sheets("Sheet1").UsedRange.Value
    Set slov = CreateObject("scripting.dictionary")
    For i = 2 To UBound(arr)
        slov(arr2(i, 9) & arr2(i, 13)) = arr2(i, 4)
    Next
    For i = 2 To UBound(arr)
        For j = 5 To UBound(arr, 2)
            arr(i, j) = slov(arr(i, 4) & arr(1, j))
        Next
    Next
    [A1].Resize(UBound(arr), UBound(arr, 2)) = arr
End Sub
 
Код
Option Explicit

Sub Заполнить()
    Dim r2 As Range
    Set r2 = Sheets("Лист2").Range("D1").Resize(4501, 5001)
    
    Dim dic As Object
    Set dic = GetDic(Sheets("Sheet1"))
    
    Dim arX As Variant
    Dim arY As Variant
    Dim arr As Variant
    arX = r2.Rows(1)
    arY = r2.Columns(1)
    ReDim arr(2 To UBound(arY, 1), 2 To UBound(arX, 2))
    
    Dim sKey As String
    Dim y As Long
    Dim x As Long
    For y = 2 To UBound(arr, 1)
        Application.StatusBar = Format(y / UBound(arr, 1), "0%")
        For x = 2 To UBound(arr, 2)
            If dic.Exists(arY(y, 1)) Then
                If dic.Item(arY(y, 1)).Exists(arX(1, x)) Then
                    arr(y, x) = dic.Item(arY(y, 1)).Item(arX(1, x))
                End If
            End If
        Next
    Next
    
    r2.Cells(2, 2).Resize(UBound(arr, 1) - LBound(arr, 1) + 1, UBound(arr, 2) - LBound(arr, 2) + 1) = arr
    Application.StatusBar = False
End Sub

Function GetDic(sh As Worksheet) As Object
    With sh
        Dim y As Long
        y = .Cells(.Rows.Count, "D").End(xlUp).Row
        If y = 1 Then y = 2
        Dim d As Variant
        Dim i As Variant
        Dim m As Variant
        d = .Range(.Cells(1, "D"), .Cells(y, "D"))
        i = .Range(.Cells(1, "I"), .Cells(y, "I"))
        m = .Range(.Cells(1, "M"), .Cells(y, "M"))
    End With
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    For y = 1 To UBound(d, 1)
        If Not dic.Exists(i(y, 1)) Then Set dic.Item(i(y, 1)) = CreateObject("Scripting.Dictionary")
        dic.Item(i(y, 1)).Item(m(y, 1)) = d(y, 1)
    Next
    
    Set GetDic = dic
End Function
 
Код
Sub InsKvo()
  Dim a, d, r&, c&, k$, tm
  tm = Timer
  a = Intersect(Worksheets(3).Range("D:M"), Worksheets(3).UsedRange)
  Set d = CreateObject("Scripting.Dictionary")
  For r = 1 To UBound(a): d(a(r, 6) & a(r, 10)) = a(r, 1): Next
  With Worksheets(1)
    a = .[d1].CurrentRegion
    For r = 2 To UBound(a)
      For c = 2 To UBound(a, 2)
        k = a(r, 1) & a(1, c): If d.exists(k) Then a(r, c) = d(k)
      Next
    Next
    .[d1].Resize(UBound(a), UBound(a, 2)) = a
  End With
  MsgBox Timer - tm
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,
Я ничего не понял в вашем коде но он работает просто супер.
Вопрос, как можно перенять ваш опыт? есть ли какие нибудь онлайн занятия?
Страницы: 1
Наверх