В этом 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