Лет несколько назад возникла необходимость сцепить в одну строку значения, получаемые в результате работы формулы массива. Естественно, функция "СЦЕПИТЬ" в таких условиях работать отказалась пришлось сделать свою, что и хочу представить. [vba]
Код
Function СУММСТРОК(Разделитель As String, ParamArray ДИАПАЗОН()) As String 'Суммирует (сцепляет) строковые значения, заданные в виде ячеек, диапазонов ячеек, строковых и числовых констант, 'разделяя их Разделитель'ем 'Предназначена для вызова из листа 'Может работать в формулах массива. Не работает сос ссылками типа Лист2:Лист3!B1 'Используется рекурсия Dim x As Variant 'Переменная цикла для перебора элементов ДИАПАЗОН'а Dim Y As Variant 'Переменная цикла для перебора элементов "х" Dim Result As String 'Результирующая строка Result = "" For Each x In ДИАПАЗОН 'ДИАПАЗОН может содержать: текст, число, диапазон, массив диапазонов, массив значений If IsObject(x) Then If TypeName(x) = "Range" Then 'Обработка диапазона If x.Count > 1 Then 'Если больше одной ячейки в диапазоне For Each Y In x 'Перебираем все ячейки диапазона FixResult Result, СУММСТРОК(Разделитель, Y), Разделитель Next Y Else FixResult Result, CStr(x.Value), Разделитель 'Всего одна ячейка End If End If ElseIf IsArray(x) Then 'Обработка массивов For Each Y In x 'Перебираем все элементы массива FixResult Result, СУММСТРОК(Разделитель, Y), Разделитель Next Y Else 'Обработка простых типов FixResult Result, CStr(x), Разделитель End If Next x СУММСТРОК = Result End Function Private Sub FixResult(ByRef Result As String, ByVal Temp3 As String, ByVal Разделитель As String) If Temp3 <> "" Then Result = IIf(Result = "", "", Result + Разделитель) + Temp3 'Пропускаем пустые значения End Sub
[/vba]
Лет несколько назад возникла необходимость сцепить в одну строку значения, получаемые в результате работы формулы массива. Естественно, функция "СЦЕПИТЬ" в таких условиях работать отказалась пришлось сделать свою, что и хочу представить. [vba]
Код
Function СУММСТРОК(Разделитель As String, ParamArray ДИАПАЗОН()) As String 'Суммирует (сцепляет) строковые значения, заданные в виде ячеек, диапазонов ячеек, строковых и числовых констант, 'разделяя их Разделитель'ем 'Предназначена для вызова из листа 'Может работать в формулах массива. Не работает сос ссылками типа Лист2:Лист3!B1 'Используется рекурсия Dim x As Variant 'Переменная цикла для перебора элементов ДИАПАЗОН'а Dim Y As Variant 'Переменная цикла для перебора элементов "х" Dim Result As String 'Результирующая строка Result = "" For Each x In ДИАПАЗОН 'ДИАПАЗОН может содержать: текст, число, диапазон, массив диапазонов, массив значений If IsObject(x) Then If TypeName(x) = "Range" Then 'Обработка диапазона If x.Count > 1 Then 'Если больше одной ячейки в диапазоне For Each Y In x 'Перебираем все ячейки диапазона FixResult Result, СУММСТРОК(Разделитель, Y), Разделитель Next Y Else FixResult Result, CStr(x.Value), Разделитель 'Всего одна ячейка End If End If ElseIf IsArray(x) Then 'Обработка массивов For Each Y In x 'Перебираем все элементы массива FixResult Result, СУММСТРОК(Разделитель, Y), Разделитель Next Y Else 'Обработка простых типов FixResult Result, CStr(x), Разделитель End If Next x СУММСТРОК = Result End Function Private Sub FixResult(ByRef Result As String, ByVal Temp3 As String, ByVal Разделитель As String) If Temp3 <> "" Then Result = IIf(Result = "", "", Result + Разделитель) + Temp3 'Пропускаем пустые значения End Sub