Страницы: 1
RSS
VBA массив для отфильтрованных данных
 
Уважаемые спецы, это макрос аналога ВПР который я нашел на форуме, подскажите как можно исправить код, чтоб он корректно работал с отфильтрованными данными, сейчас данные  для сравнения забираются с W2 какие бы строки не были отфильтрованы.  Спасибо!
Код
  a = Range(.[w2], .Range("W" & iLastrow)).Value
а вот полный код
Код
Sub Macro4()


Dim a, b, c, iLastrow As Long, i As Long, ii As Long
 

   Selection.AutoFilter Field:=1, Criteria1:="add4"

   
    With Worksheets("Proj1")
   
        iLastrow = .Cells(Rows.Count, 23).End(xlUp).Row
        a = Range(.[w2], .Range("W" & iLastrow)).Value
 
         
    End With

    With Worksheets("base")
        iLastrow = .Cells(Rows.Count, 5).End(xlUp).Row 
       b = Range(.[e2], .Range("Y" & iLastrow)).Value 
     
    End With

    
    ReDim c(1 To UBound(a), 1 To 20)

    With CreateObject("Scripting.Dictionary")
    
    
        For i = 1 To UBound(b)
            .Item(b(i, 1)) = i
        Next

       
           For i = 1 To UBound(a)
           
            If .exists(a(i, 1)) Then
                c(i, 1) = b(.Item(a(i, 1)), 2)
                c(i, 2) = b(.Item(a(i, 1)), 3)
                c(i, 3) = b(.Item(a(i, 1)), 4)
                c(i, 4) = b(.Item(a(i, 1)), 5)
                c(i, 5) = b(.Item(a(i, 1)), 6)
                c(i, 6) = b(.Item(a(i, 1)), 7)
                c(i, 7) = b(.Item(a(i, 1)), 8)
                c(i, 8) = b(.Item(a(i, 1)), 9)
                c(i, 9) = b(.Item(a(i, 1)), 10)
                c(i, 10) = b(.Item(a(i, 1)), 11)
                c(i, 11) = b(.Item(a(i, 1)), 12)
                c(i, 12) = b(.Item(a(i, 1)), 13)
                c(i, 13) = b(.Item(a(i, 1)), 14)
                c(i, 14) = b(.Item(a(i, 1)), 15)
                c(i, 15) = b(.Item(a(i, 1)), 16)
                c(i, 16) = b(.Item(a(i, 1)), 17)
                c(i, 17) = b(.Item(a(i, 1)), 18)
                c(i, 18) = b(.Item(a(i, 1)), 19)
                c(i, 19) = b(.Item(a(i, 1)), 20)
                c(i, 20) = b(.Item(a(i, 1)), 21)
            
            End If
        Next
    End With

    With Worksheets("Proj1")   
   
        .[x2].Resize(UBound(c), 20) = c 
        .Activate
    End With

 
End Sub
 
Цитата
Alexander Kruglov: исправить код, чтоб он корректно работал с отфильтрованными данными
13я и 20я строки: вместо Range().Value надо написать Range().SpecialCells(xlCellTypeVisible).Value
Но вам это не особо поможет, т.к. массив надо будет собирать по областям и вообще проще заново написать
Приложите файл-пример  - я посмотрю
Изменено: Jack Famous - 03.03.2021 09:07:56
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Сообственно файл с примером
Range().SpecialCells(xlCellTypeVisible).Value - к сожалению не работаеи
 
Alexander Kruglov, плохой пример - много лишнего. Оставьте только то, что нужно для проверки и покажите результат руками
Изменено: Jack Famous - 05.03.2021 09:20:23
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Alexander Kruglov Надо конкретнее объяснять задачу. Какие данные есть и что вы хотите получить. Если просто выдернуть отфильтрованные строки автофильтром. и что то потом с ними делать такой макрос не нужен. и оператор ниже как раз будет работать нормально. но нужно написать другую процедуру
Код
 Range().SpecialCells(xlCellTypeVisible).Value
Изменено: Евгений Смирнов - 05.03.2021 09:26:20
Страницы: 1
Наверх