Преобразование диапазона в строку с разделителями-запятыми

Если бы у меня был столбец:

Col1
abc
def
ghi
jkl

Как я могу преобразовать его в строку следующим образом:

"abc,def,ghi,jkl"

Ответ 1

Вы можете использовать функцию Join() для объединения всех элементов 1-мерного массива с разделителем.

Функция Transpose() используется ниже для формирования размерного массива (этот подход работает на одном столбце или строке).

Sub Main()
    Dim arr
    arr = Join(Application.Transpose(Range("A2:A5").Value), ",")
    MsgBox arr
End Sub

или как UDF

Public Function Merge(r As Range) As String
    Merge = Join(Application.Transpose(r.Value), ",")
End Function

Ответ 2

На случай, если вам понадобится более тяжелая техника, используйте одно из решений, представленных в ответе ниже. У меня была похожая проблема для диапазонов, содержащих миллионы клеток. В таких случаях JOIN приведет к краху.

Проверьте вопрос здесь: Превратите диапазон Excel в строку VBA

Я проверил все подходы, указанные в ссылке выше. Решения, основанные на функции JOIN имеют низкую производительность или даже приводят к сбою.

Обычный цикл через все ячейки намного быстрее, чем функция JOIN. Жало в принятом ответе еще быстрее. С помощью строителя строк строки, состоящие из миллионов ячеек, создаются за считанные секунды. Это решение, которое у меня есть.

Ответ 3

Double-transpose работает для объединения строк в значениях из одной строки. Спасибо @user2140173 и @brettdj!

debug.print join(Application.Transpose(Application.Transpose(Range("A1:G1").Value)),",")