VBA:使用Vlookup和Offset提取数据

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

比如我有

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

我将IDinput到电子表格中,然后想要使用VBA来查找该ID,然后将列B和C中的值放入另一个电子表格中。

inheritance人我有什么

  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后的以下行取数据?

使用工作表的MATCH函数将行号返回给INDEX函数,同时向其添加+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 

原生的工作表公式

这也可以通过标准(非数组)工作表公式来处理。 在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

我build议使用Power Query来完成这个任务(或者如果你已经在2016年了,可以进行Get&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" 

您有输出的所有格式选项,并且解决scheme是完全dynamic的: 在这里输入图像说明