代码之家  ›  专栏  ›  技术社区  ›  sudonym

如何使用VBA执行带有动态lookup_值的excel vlookup?

  •  1
  • sudonym  · 技术社区  · 7 年前

    我是VBA新手,需要执行 vlookup 具有动态 lookup_value . 原因是,对于不同的输入表,实际lookup_value列可以位于不同的列索引上。

    原始vlookup公式如下所示:

    "=VLOOKUP(C2,lookup!$A$2:$B$14,2,FALSE)" 'static vlookup
    

    我努力实现的目标应该是这样的:

    1) 查找包含lookup_值的实际列索引(在上述情况下为C2)

    With ws
        Set FindRng = .Rows(1).Find(what:="Column Name") ' should be 3 for C
            FiltCol = FindRng.Column ' get the column number where "Column Name" was found
    End With
    

    2) 动态设置lookup_值(在本例中为C2)

    Dim dynamic_lookup_value as Range
    dynamic_lookup_value = ws.Cells(FiltCol, 2) ' should be column C cell 2
    

    3) 将lookup_值的动态参考设置为实际vlookup公式(即,参考C2重新定位硬编码C2 )

    foobar = "=VLOOKUP(dynamic_lookup_value,lookup!$A$2:$B$14,2,FALSE)" 'dynamic vlookup
    

    然而,(3)收益率 Run-time error '91' Object variable or With-block variable not set .

    如何使用VBA执行带有动态lookup_值的excel vlookup?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Scott Craner    7 年前

    首先在此处反转列和行:

    ws.Cells(FiltCol, 2)

    它应该是:

    ws.Cells(2,FiltCol) 
    

    然后设置范围:

    Set dynamic_lookup_value = ws.Cells(2,FiltCol) 
    

    然后你不把变量放在引号里,而是用 &

    foobar = "=VLOOKUP(" & dynamic_lookup_value.Address(0,0) & ",lookup!$A$2:$B$14,2,FALSE)" 
    

    另一条建议:

    FiltCol = FindRng.Column

    如果找不到值,则将出错。将其放入If语句中,以检查是否找到该值:

    If  not FindRng is nothing Then
        ...
    End IF