将分隔符添加到连接列表

时间:2011-08-29 20:18:50

标签: excel vba excel-vba user-defined-functions

我找到了这个自定义Excel函数:

Function Join(source As Range, Optional delimiter As String) As String
'
' Join Macro
' Joins (concatenates) the values from an arbitrary range of cells,
' with an optional delimiter.
'

'optimized for strings
'   check len is faster than checking for ""
'   string Mid$ is faster than variant Mid
'   nested ifs allows for short-circuit + is faster than &

    Dim sResult As String
    Dim oCell As Range

    For Each oCell In source.Cells
        If Len(oCell.Value) > 0 Then
            sResult = sResult + CStr(oCell.Value) + delimiter
        End If
     Next

    If Len(sResult) > 0 Then
        If Len(delimiter) > 0 Then
            sResult = Mid$(sResult, 1, Len(sResult) - Len(delimiter))
        End If
    End If

    Join = sResult
End Function

我想调整它以显示它组合的每个单元格之间的逗号以创建列表。

2 个答案:

答案 0 :(得分:8)

您发现的UDF存在一些问题:

  • 连接应该用“&”来完成不是“+”。
  • 使用范围中的单元格比变体数组更慢,并且纯粹从VBA内部工作。每次调用Excel都会产生很小的性能损失。
  • 如果连接正确,则转换为字符串是不合格的。
  • 应优化连接,以便首先连接较小的部分,然后将其添加到结果中,否则将结果复制两次以进行每个连接。
  • 名称不应为加入,因为VBA具有该名称的功能。
  • 因为它是一个字符串,所以不需要检查分隔符的LEN。默认情况下,如果不存在,它将为LEN(0),您可以毫不费力地从len(结果)中减去0。
  • 不是很重要,但检查不平等<>略快于>。

这是我的版本。默认情况下,如果将第二个参数留空,则将每个单元格分隔“,”(例如= ConcatenateRange(A1:A100)

Function ConcatenateRange(ByVal cell_range As range, _
                    Optional ByVal seperator As String = ", ") As String

Dim cell As range
Dim newString As String
Dim vArray As Variant
Dim i As Long, j As Long

vArray = cell_range.Value

For i = 1 To UBound(vArray, 1)
    For j = 1 To UBound(vArray, 2)
        If Len(vArray(i, j)) <> 0 Then
            newString = newString & (seperator & vArray(i, j))
        End If
    Next
Next

If Len(newString) <> 0 Then
    newString = Right$(newString, (Len(newString) - Len(seperator)))
End If

ConcatenateRange = newString

End Function

答案 1 :(得分:5)

看起来它已使用可选的delimiter参数执行此操作。

就这样称呼它:

=JOIN(A1:A100,",")