将另一张纸上的范围传递给vlookup

时间:2016-02-08 00:42:17

标签: excel vba excel-vba

我无法像使用= vlookup一样使用工作表引用范围。

这有效:=MVLOOKUP(a2,B:C,2,",",", ")
这不是=MVLOOKUP(a2,Sheet3!B:C,2,",",", ")

代码:

Public Function MVLookup(Lookup_Values, Table_Array As Range, Col_Index_Num As Long, Input_Separator As String, Output_Separator As String) As String

 Dim in0, out0, i
 in0 = Split(Lookup_Values, Input_Separator)
 ReDim out0(UBound(in0, 1))

 For i = LBound(in0, 1) To UBound(in0, 1)  

  out0(i) = Application.WorksheetFunction.VLookup(in0(i), Table_Array, Col_Index_Num, False)

 Next i

 MVLookup = Join(out0, Output_Separator)

End Function

我不懂基本知识而且我不打算学习它,我甚至很少使用excel,所以对于这个蹩脚的问题感到抱歉。我想基本是真的"基本"我花了30分钟从参考文献(包括阅读)到达这一点,但其他60分钟因为上述问题而感到沮丧。
帮助我,让我可以回到我的vba自由生活!

编辑:虽然上面的代码在excel重启后工作,但Jeeped给了我更安全的解决方案和更多通用功能。谢谢你。

我不打算在字符串以外使用它,但感谢添加,我错误地认为每次都会检查数据类型并在后台传递类型并且vlookup会相应地执行操作。我还学习了如何将默认值设置为函数输入变量。

见解决方案。

再次感谢,Jeeped!

2 个答案:

答案 0 :(得分:1)

这不是Excel B:Sheet3!C中任何地方的有效范围引用。

使用B:CSheet3!B:C

编辑。根据Jeeped的评论进行了修正。

答案 1 :(得分:1)

你让1"1"混淆,不管你对VBA的个人厌恶,我真的不知道任何将它们视为相同值的编程语言(除了工作表之外) COUNTIF function)。

Public Function MVLookup(Lookup_Values, table_Array As Range, col_Index_Num As Long, _
                         Optional Input_Separator As String = ",", _
                         Optional output_Separator As String = ", ") As String

    Dim in0 As Variant, out0 As Variant, i As Long

    in0 = Split(Lookup_Values, Input_Separator)
    ReDim out0(UBound(in0))

    For i = LBound(in0) To UBound(in0)
        If IsNumeric(in0(i)) Then
            If Not IsError(Application.Match(Val(in0(i)), Application.Index(table_Array, 0, 1), 0)) Then _
                out0(i) = Application.VLookup(Val(in0(i)), table_Array, col_Index_Num, False)
        Else
            If Not IsError(Application.Match(in0(i), Application.Index(table_Array, 0, 1), 0)) Then _
                out0(i) = Application.VLookup(in0(i), table_Array, col_Index_Num, False)
        End If

    Next i

    MVLookup = Join(out0, output_Separator)

End Function

当你将Split字符串放入变量数组时,最终得到一个字符串元素数组。当然,他们看起来喜欢数字,但他们不是真正的数字;仅仅是真实数字的文本代表性传真。当 table_array 参数中的第一列填充真数时,VLOOKUP function不会将它们视为数字。

IsNumeric function可以重新组合一个看起来像数字的字符串,然后Val function可以将那个看起来像数字的文本转换为真正的数字。

我还添加了一个快速检查,以确保在您尝试将返回值填充到数组之前确实存在的内容。

您的拆分字符串是一维变体数组。无需在LBound / UBound函数中提供排名。

mvlookup_sample mvlookup
Sheet3的样本数据 MVLOOKUP的结果