Добавить разделитель в связанный список - PullRequest
0 голосов
/ 30 августа 2011

Я нашел эту пользовательскую функцию 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 ]

8 голосов
/ 30 августа 2011

В этом UDF вы обнаружили несколько ошибок:

  • Конкатенация должна выполняться с "&" not "+".
  • Работа с ячейками в диапазонемедленнее, чем вариантный массив и работает чисто изнутри VBA.Каждый вызов в Excel приводит к небольшому снижению производительности, которое может увеличиваться.
  • Приведение к строке является бесполезным, если конкатенация была выполнена правильно.
  • Конкатенация должна быть оптимизирована так, чтобы меньшие части былисначала присоединяется, затем добавляется к результату, в противном случае результат копируется дважды для каждой конкатенации.
  • Имя не должно быть Join, поскольку в VBA есть функция с таким именем.
  • Не должно бытьнужно проверить LEN разделителя, так как это строка.По умолчанию это будет LEN (0), если он не существует, и вы можете без беспокойства вычесть 0 из len (результата).
  • Ничего страшного, но проверка на неравенство <> выполняется немного быстрее, чем>.

Вот моя версия.По умолчанию он разделяет каждую ячейку на «,», если оставить второй аргумент пустым (например, = 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
5 голосов
/ 30 августа 2011

Похоже, он уже делает это с необязательным параметром delimiter.

Просто назовите это так:

=JOIN(A1:A100,",")
...