我无法像使用= 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!
答案 0 :(得分:1)
这不是Excel B:Sheet3!C
中任何地方的有效范围引用。
使用B:C
或Sheet3!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可以将那个看起来像数字的文本转换为真正的数字。
我还添加了一个快速检查,以确保在您尝试将返回值填充到数组之前确实存在的内容。