VBA:使用Vlookup和Offset提取数据

时间:2016-02-18 03:08:44

标签: excel vba excel-vba offset vlookup

我正在尝试使用VBA从大型电子表格中提取数据。 A列包含ID,它可以根据存储在其中的数据重复。

例如我有

ID           Value1             Value2
1111         item1               item2
1111         item3               item4
2222         item3               item4
3333         item3               item4
3333         item3               item4

我将ID输入电子表格,然后想要使用VBA来查看ID,然后将值从B列和C列拉到另一个电子表格中。

继承人我拥有的

    Sub populate()
Dim ID As String    
Dim Value1 As String
ID = Range("D5")
   Value1 = Application.WorksheetFunction.VLookup(ID, Worksheets("Required").Range("A4:J1913"), 2, False)
Response = Application.WorksheetFunction.VLookup(ID, Worksheets("Required").Range("A4:J1913"), 7, False)
Worksheets("Coversheet").Range("D8") = Value1
Worksheets("Coversheet").Range("D10") = Value2
Dim Value1address As Long
Value1address = VarPtr(Value1)
Worksheets("Coversheet").Range("D15").Value = Cells(Value1address).Offset(1, 0)
End Sub

除了最后3行之外,代码工作得非常好。我试图从Value1获得1行的偏移,但是它保存为空白,因此将空白值放入单元格D15。

任何人都可以帮我解决这个问题,或者在Vlookup之后如何轻松地从以下行获取数据?

2 个答案:

答案 0 :(得分:1)

使用工作表的MATCH function将行号返回INDEX function,同时为其添加 +1

with Worksheets("Required")
    Worksheets("Coversheet").Range("D15").Value = _
      Application.Index(.Range("B4:B1913"), Application.Match(ID, .Range("A4:A1913"), 0) + 1))
End With

如果您要找到该行,请将其存储并继续重复使用。

    Dim ID As String, val1 As String, val2 As String, val3 As String, rw As Long
    ID = Range("D5")

    With Worksheets("Required")
        If Not IsError(Application.Match(ID, .Range("A4:A1913"), 0)) Then
            rw = Application.Match(ID, .Range("A4:J1913"), 0)
            val1 = .Cells(rw + 3, 2).Value
            val2 = .Cells(rw + 3, 7).Value
            val3 = .Cells(rw + 4, 2).Value
        End If
    End With

    With Worksheets("Coversheet")
        .Range("D8") = val1
        .Range("D10") = val2
        .Range("D15") = val3
    End With

<强> Native Worksheet formulas

这也可以通过标准(非数组)工作表公式来处理。在D8,D10和D15中,

=INDEX(Required!$B$4:$B$914, MATCH($D$5, Required!$A$4:$A$914, 0))
=INDEX(Required!$J$4:$J$914, MATCH($D$5, Required!$A$4:$A$914, 0))
=IFERROR(INDEX(Required!$B$4:$B$914, AGGREGATE(15, 6, ROW($1:$911)/(Required!$A$4:$A$914=$D$5), 2)), "n/a")

find_second_item

答案 1 :(得分:0)

我建议您使用Power Query执行此任务(如果您已经在2016年,请使用Get&amp; Transform):  https://www.dropbox.com/s/my59casl9y8ac3y/SO_ExtractDataUsingVLookupAndOffset.xlsx?dl=0

代码很短(即对于Var1):

let
    Filter= Excel.CurrentWorkbook(){[Name="ID"]}[Content][Column1]{0},
    Source = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
    #"Filtered Rows" = Table.SelectRows(Source, each [ID] = Filter)
in
    #"Filtered Rows"

您拥有输出的所有格式选项,解决方案是完全动态的: enter image description here