我正在尝试使用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之后如何轻松地从以下行获取数据?
答案 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")
答案 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"