使用VBA基于两列中的匹配值和第三列值填充列

时间:2013-12-06 18:05:17

标签: excel vba excel-vba excel-2007

场景如下,我有一张表有两列,一列我要匹配,另一列包含我想要匹配的值。我有第二张表,其中包含要在匹配列中搜索的值以及如果我们匹配则要复制值列的列。

这看起来像VLOOKUP的主要候选者,但我想避免必须硬编码列号,因为数据表内容可能会有所不同。所以我根据标题的内容找到该列。如果有办法以这种灵活性对结果进行VLOOKUP,那么这也有效。我不能使用公式,这需要在VBA中。

下面定义了4列:

  1. toFindCol:这包含我要尝试的值的主列表 并在toMatch列中找到
  2. toMatchAgainstCol:这包含我想要匹配的toFindCol值的值列表
  3. valueCol:这包含我要复制的值,如果匹配,则该值必须来自发生匹配的行
  4. resultsCol:这是我要将值复制到的地方,需要将值复制到toFind值的行
  5. 由于某些原因,下面的代码会出现“类型不匹配”错误。

    最终我想把它包装成一个函数/子程序,这样我就可以传入工作表和列标题,让它发挥作用。布朗尼指出谁能做到这一点:)

    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
    

2 个答案:

答案 0 :(得分:1)

有一种方法可以在VLOOKUP中执行此操作。 vlookup的基本格式是vlookup(1,2,3,4)。

  1. 我将A2作为顶部单元格传递给我想要查找的值。然后可以向下复制此公式以填充其他单元格。替换适当的单元格引用。
  2. 使用“匹配”功能查找要设置的列 范围。由于我们只想要列字母(即 - “C:G”),我 使用。删除数字(总是1个字符) Len函数,然后使用indirect函数将其转换为 一个可用的范围,并查找它。 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))
  3. 然后我用了 MATCH("ValueCol",$1:$1,0)-MATCH("ToMatch",$1:$1,0)+1来计算 其中的列号包含我们要查找的值 那个范围。
  4. 我使用0来表示完全匹配而不是最接近的值
  5. 整件事看起来像这样: =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)