场景如下,我有一张表有两列,一列我要匹配,另一列包含我想要匹配的值。我有第二张表,其中包含要在匹配列中搜索的值以及如果我们匹配则要复制值列的列。
这看起来像VLOOKUP的主要候选者,但我想避免必须硬编码列号,因为数据表内容可能会有所不同。所以我根据标题的内容找到该列。如果有办法以这种灵活性对结果进行VLOOKUP,那么这也有效。我不能使用公式,这需要在VBA中。
下面定义了4列:
由于某些原因,下面的代码会出现“类型不匹配”错误。
最终我想把它包装成一个函数/子程序,这样我就可以传入工作表和列标题,让它发挥作用。布朗尼指出谁能做到这一点:)
Dim toFindCol As Range
Dim toMatchAgainstCol As Range
Dim valueCol As Range
Dim resultsCol As Range
Dim match As Variant
Set toFindCol = cohortDataSetSht.Columns(1).EntireColumn
Set toMatchAgainstCol = userSht.Cells.Find("id", , xlValues, xlWhole).EntireColumn
Set valueCol = userSht.Cells.Find("cdate", , xlValues, xlWhole).EntireColumn
Set resultsCol = cohortDataSetSht.Columns(4)
For Each findMe In toFindCol
Set match = toMatchAgainstCol.Find(What:=findMe, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows)
If Not match Is Nothing Then
resultsCol.Cells(findMe.Row, 0).Value = valueCol.Cells(match.Row, 0).Value
End If
Next findMe
答案 0 :(得分:1)
有一种方法可以在VLOOKUP中执行此操作。 vlookup的基本格式是vlookup(1,2,3,4)。
INDIRECT(LEFT(ADDRESS(1,MATCH("ToMatch",$1:$1,0),4),LEN(ADDRESS(1,MATCH("ToMatch",$1:$1,0),4))-1)&":"&LEFT(ADDRESS(1,MATCH("ValueCol",$1:$1,0),4),LEN(ADDRESS(1,MATCH("ValueCol",$1:$1,0),4))-1))
MATCH("ValueCol",$1:$1,0)-MATCH("ToMatch",$1:$1,0)+1
来计算
其中的列号包含我们要查找的值
那个范围。整件事看起来像这样:
=VLOOKUP(A2,INDIRECT(LEFT(ADDRESS(1,MATCH("ToMatch",$1:$1,0),4),LEN(ADDRESS(1,MATCH("ToMatch",$1:$1,0),4))-1)&":"&LEFT(ADDRESS(1,MATCH("ValueCol",$1:$1,0),4),LEN(ADDRESS(1,MATCH("ValueCol",$1:$1,0),4))-1)),MATCH("ValueCol",$1:$1,0)-MATCH("ToMatch",$1:$1,0)+1,0)
此代码假定列标题位于第1行。如果不是,请将上面的$ 1:$ 1替换为标题所在行的绝对引用(即-Row 5将为$ 5:$ 5)。
另一个需要注意的是,我们必须假设您要查找的值始终位于查阅列的右侧。
答案 1 :(得分:0)
好的解决了。我最终使用Rows作为toFind列:
设置toFindCol = cohortDataSetSht.Columns(1).Rows(“2:”& cohortDataSetSht.Columns(1).End(xlDown).Row)
然后在比赛中我使用了值:
设置match = toMatchAgainstCol.Cells.Find(What:= findMe.Value2,LookIn:= xlValues,LookAt:= xlWhole,SearchOrder:= xlByRows)