Excel、VBA Vlookup、多行返回

Excel、VBA Vlookup、多行返回,excel,vba,vlookup,Excel,Vba,Vlookup,对VBA非常陌生,请原谅我的无知 如何更改下面的代码以将结果返回到行而不是字符串中 提前谢谢 资料 作用 =vlookupall("0001", A:A, 1, " ") 代码如下: Function VLookupAll(ByVal lookup_value As String, _ ByVal lookup_column As range, _ ByVal return_value_column As Long,

对VBA非常陌生,请原谅我的无知

如何更改下面的代码以将结果返回到行而不是字符串中

提前谢谢

资料

作用

=vlookupall("0001", A:A, 1, " ")
代码如下:

Function VLookupAll(ByVal lookup_value As String, _
                   ByVal lookup_column As range, _
                   ByVal return_value_column As Long, _
                   Optional seperator As String = ", ") As String

Application.ScreenUpdating = False
Dim i As Long
Dim result As String

For i = 1 To lookup_column.Rows.count
   If Len(lookup_column(i, 1).text) <> 0 Then
        If lookup_column(i, 1).text = lookup_value Then
            result = result & (lookup_column(i).offset(0, return_value_column).text &     seperator)
       End If
   End If
 Next

If Len(result) <> 0 Then
result = Left(result, Len(result) - Len(seperator))
End If

VLookupAll = result
Application.ScreenUpdating = True

 End FunctionNotes:
函数VLookupAll(ByVal lookup_值为字符串_
ByVal lookup_列作为范围_
ByVal返回值列的长度_
可选分隔符作为字符串=“,”)作为字符串
Application.ScreenUpdating=False
我想我会坚持多久
将结果变暗为字符串
对于i=1,查找_column.Rows.count
如果Len(lookup_column(i,1).text)为0,则
如果lookup\u列(i,1).text=lookup\u值,则
结果=结果和(查找列(i).偏移量(0,返回值列).文本和分隔符)
如果结束
如果结束
下一个
如果Len(结果)为0,则
结果=左(结果,透镜(结果)-透镜(分隔符))
如果结束
VLookupAll=结果
Application.ScreenUpdating=True
完注:
试试这个:

Option Explicit

Function VLookupAll(ByVal lookup_value As String, _
                    ByVal lookup_column As Range, _
                    ByVal return_value_column As Long) As Variant

    Application.ScreenUpdating = False
    Dim i As Long, _
        j As Long
    Dim result() As Variant

    ReDim result(1 To Application.Caller.Rows.Count, 1 To 1) As Variant
    j = LBound(result)

    For i = 1 To lookup_column.Rows.Count
        If Len(lookup_column(i, 1).Text) <> 0 Then
            If lookup_column(i, 1).Text = lookup_value Then
                If j > UBound(result, 1) Then
                    Debug.Print "More rows required for output!"
                    Exit For
                End If
                result(j, 1) = lookup_column(i).Offset(0, return_value_column).Text
                j = j + 1
            End If
         End If
    Next

    VLookupAll = result
    Application.ScreenUpdating = True

End Function
然后按ctrl+shift+enter键输入公式


请注意,如果选择的输出行太少,则立即窗口(在vb编辑器中按ctrl+g)将显示一条消息“输出所需的行数更多!”。我把它作为一个messagebox,但是它的自动计算有点疯狂。

如何像数组一样使用上面的代码


=VLookupAll(Main!$B$1,'Tes'!$A1:$A$1500,{1,2})

UDF不能改变其他单元格。这将不得不重写为宏,以其他方式调用,或者正如Sean Cheshire所指出的,如果要以UDF的方式调用它,则不能返回行。但是,更新函数以返回行的最简单方法可能是在最后调用Split。例如,
result=Split(result,separator)
您的源数据是否来自数据库、Access或其他Excel工作簿?如果是这样,您可以创建一个数据连接,然后将其插入工作表,它将自动在单元格和行中设置数据。
Option Explicit

Function VLookupAll(ByVal lookup_value As String, _
                    ByVal lookup_column As Range, _
                    ByVal return_value_column As Long) As Variant

    Application.ScreenUpdating = False
    Dim i As Long, _
        j As Long
    Dim result() As Variant

    ReDim result(1 To Application.Caller.Rows.Count, 1 To 1) As Variant
    j = LBound(result)

    For i = 1 To lookup_column.Rows.Count
        If Len(lookup_column(i, 1).Text) <> 0 Then
            If lookup_column(i, 1).Text = lookup_value Then
                If j > UBound(result, 1) Then
                    Debug.Print "More rows required for output!"
                    Exit For
                End If
                result(j, 1) = lookup_column(i).Offset(0, return_value_column).Text
                j = j + 1
            End If
         End If
    Next

    VLookupAll = result
    Application.ScreenUpdating = True

End Function
=vlookupall("0001",$A:$A, 1, " ")