Excel2011:Vlookup和Combine

时间:2017-06-22 17:46:54

标签: excel excel-vba udf textjoin vba

我在组合多个函数时遇到了一些困难,无法在70000+行excel文件中执行我想要的操作。任何提示或指示或建议都非常感谢。

我有2列(大约70000行)。在第1列中,我有客户的帐号(有重复项),在第2列旁边我有我要提取的数据。我还有第三栏(第3栏),这是一个帐号列表,但已被删除重复。我试图让Vlookup查看第三列的第一行(lookup_value),然后在(table_array)中的第1列中搜索该值,并返回第2列中与第1列值相邻的值。

问题,我希望Vlookup为所有70000行执行此功能,这样,它返回与(lookup_value)提供给它的特定帐号匹配的所有数据。那么,我想使用Combine函数使用这个Combine函数将数据字符串放入一个单元格中:

Function Combine(WorkRng As Range, Optional Sign As String = ", ") As String

    'Update 20130815
    Dim Rng As Range
    Dim OutStr As String
    For Each Rng In WorkRng
        If Rng.Text <> ", " Then
            OutStr = OutStr & Rng.Text & Sign
        End If
    Next
    Combine = Left(OutStr, Len(OutStr) - 1)

End Function

最后,在第3列旁边,我希望在每个帐号旁边的单个单元格中用逗号分隔数据。以下是我尝试做的一个例子。我有前3列,但我想将其转换为第4列。

Acct #  Data        Accounts    Desired Data formating
1001    80100       1001        80100, 80250, 80255
1001    80250       1005        81000, 81222, 81235, 85213
1001    80255       1099        82250, 82323, 80100, 80150
1005    81000           
1005    81222           
1005    81235           
1005    85213           
1099    82250           
1099    82323           
1099    80100           
1099    80105           

我认为这将是一个简单的功能或公式,但也许我没有使用正确的功能或公式。

1 个答案:

答案 0 :(得分:1)

使用CSE作为数组公式输入时,函数可以采用条件。

=TEXTJOIN(", ", TRUE, IF(A2:INDEX(A:A,MATCH(1E+99,A:A))=C2, B2:INDEX(B:B,MATCH(1E+99,A:A)), TEXT(,)))

enter image description here

如果您的Excel版本中没有较新的功能,请在此网站的标记中搜索VBA UDF和工作表公式。我使用static dict as scripting.dictionary创建了一对。

这是一些标准的公共模块代码,它们将使用二维数组和脚本字典来收集它们。

  

此子程序要求您使用工具,参考文献将Microsoft Scripting Runtime添加到VBA项目。

Option Explicit

Sub qwewrety()
    Dim delim As String, arr As Variant
    Dim d As Long, dict As New Scripting.dictionary

    delim = Chr(44) & Chr(32)

    With Worksheets("sheet3")
        arr = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "B").End(xlUp)).Value2

        For d = LBound(arr, 1) To UBound(arr, 1)
            If dict.exists(arr(d, 1)) Then
                dict.Item(arr(d, 1)) = dict.Item(arr(d, 1)) & delim & arr(d, 2)
            Else
                dict.Item(arr(d, 1)) = arr(d, 2)
            End If
        Next d

        .Cells(2, "C").Resize(dict.Count) = Application.Transpose(dict.keys)
        .Cells(2, "D").Resize(dict.Count) = Application.Transpose(dict.items)

    End With
End Sub