TEXTJOIN для xl2010 / xl2013 с критериями

У меня есть 2 листа. Первый рабочий лист имеет около 100 строк, но нас интересует только столбец Y. Ячейки в столбце Y содержат смесь пустых ячеек («»), текста и чисел, а также ячеек, в которых отображается # N / A. Аналогично картинке, но с большим набором данных.

Столбец L

На втором листе есть ячейка, в которой я хотел бы захватить ячейки с «текстами и числами» и отобразить каждую запись в отдельной строке в той же ячейке (например, если бы было 12 из 100 ячеек с «текстами» и числа ', то я хотел бы отобразить эту информацию в определенной ячейке на втором листе. Примерно так:

введите описание изображения здесь

Я пробовал что-то подобное, но, похоже, захватывает только 1-ю строку текста (например, строку заголовка):

=IFERROR(INDEX('1Comms'!Y:Y,MATCH(TRUE,'1Comms'!Y:Y<>"",0)),"")

Есть ли способ также пропустить титул?

Что я делаю не так и есть ли способ сделать это?


person K.Honda    schedule 06.06.2018    source источник
comment
Какая у вас версия xl? Доступна ли более новая функция textjoin.   -  person    schedule 06.06.2018
comment
@Jeeped У меня отличился 2013 год ... Как вы думаете, это возможно? Мне сказали, что это довольно сложно и что легче писать в ячейках по одному?   -  person K.Honda    schedule 06.06.2018
comment
UDF упрощает задачу, формула для проверки 100 строк нереалистична и слишком сложна. textjoin упрощает эту задачу.   -  person    schedule 06.06.2018
comment
@Jeeped у вас есть пример, который я могу применить к моему вопросу? Было бы очень полезно. Спасибо   -  person K.Honda    schedule 06.06.2018
comment
На самом деле, я играл с TEXTJOINIFS, в который я мог бы легко добавить игнорировать ошибки. Я посмотрю.   -  person    schedule 06.06.2018
comment
@Jeeped, это здорово! Большое спасибо   -  person K.Honda    schedule 06.06.2018


Ответы (1)


Эта определяемая пользователем функция TextJoinIfs (также известная как UDF) предоставляет базовую TEXTJOIN для версий Excel 2003–2013, а также расширенная функциональность для всех версий за счет добавления дополнительного контроля ошибок, уникальности, сортировки и множества условий для простых критериев.

Этот код UDF TextJoinIfs принадлежит листу кода общедоступного модуля; например Книга1 - Модуль1 (код).

Option Explicit

Public Function TextJoinIfs(delim As String, iOptions As Long, iIgnoreHeaderRows As Long, _
                            rng As Range, ParamArray pairs()) As Variant
    'TEXTJOINIFS - Basic TEXTJOIN functionality for XL2003-XL2013 versions
    '              Expanded TEXTJOINIFS functionality for all versions
    ' =TextJoinIfs(<delimiter>, <options>, <header_rows>, <string_range>, [criteria_range1, criteria1], [criteria_range2, criteria2], …)
    '        OPTIONS
    '     +2 Include blanks
    '     +4 Include worksheet errrors
    '     +8 Unique list
    '     +16 Sort ascending (cannot be used with 17)
    '     +17 Sort descending (cannot be used with 16)

    If Not CBool(UBound(pairs) Mod 2) Then
        TextJoinIfs = CVErr(xlErrValue)
        Exit Function
    End If

    Dim i As Long, j As Long, a As Long, arr As Variant
    Dim bIncludeBlanks As Boolean, bIncludeErrors As Boolean, bUniqueList As Boolean
    Dim bSorted As Boolean, bDescending As Boolean

    bIncludeBlanks = CBool(2 And iOptions)
    bIncludeErrors = CBool(4 And iOptions)
    bUniqueList = CBool(8 And iOptions)
    bSorted = CBool(16 And iOptions)
    bDescending = CBool(1 And iOptions)

    Set rng = Intersect(rng, rng.Parent.UsedRange.Offset(iIgnoreHeaderRows - rng.Parent.UsedRange.Rows(1).Row + 1, 0))

    With rng
        ReDim arr(.Cells.Count)
        If Not IsMissing(pairs) Then
            For i = LBound(pairs) To UBound(pairs) Step 2
                Set pairs(i) = pairs(i).Resize(rng.Rows.Count, rng.Columns.Count).Offset(iIgnoreHeaderRows, 0)
            Next i
        End If

        For j = 1 To .Cells.Count
            If CBool(Len(.Cells(j).Text)) Or bIncludeBlanks Then
                If Not IsError(.Cells(j)) Or bIncludeErrors Then
                    If IsError(Application.Match(.Cells(j).Text, arr, 0)) Or Not bUniqueList Then
                        If IsMissing(pairs) Then
                            arr(a) = .Cells(j).Text
                            a = a + 1
                        Else
                            For i = LBound(pairs) To UBound(pairs) Step 2
                                If Not CBool(Application.CountIfs(pairs(i).Cells(j), pairs(i + 1))) Then Exit For
                            Next i
                            If i > UBound(pairs) Then
                                arr(a) = .Cells(j).Text
                                a = a + 1
                            End If
                        End If
                    End If
                End If
            End If
        Next j
    End With

    ReDim Preserve arr(a - 1)

    If bSorted Then
        Dim tmp As String
        For i = LBound(arr) To UBound(arr) - 1
            For j = i + 1 To UBound(arr)
                If CBool(LCase(CStr(arr(i))) < LCase(CStr(arr(j))) And bDescending) Xor _
                   CBool(LCase(CStr(arr(i))) > LCase(CStr(arr(j))) And Not bDescending) Then
                    tmp = arr(j): arr(j) = arr(i): arr(i) = tmp
                End If
            Next j
        Next i
    End If

    TextJoinIfs = Join(arr, delim)
End Function

Синтаксис:

=TextJoinIfs(<delimiter>, <options>, <header_rows>, <string_range>, [criteria_range1, criteria1], [criteria_range2, criteria2], …)

Документация

введите описание изображения здесь

Пример 1

Простая операция TextJoin, отбрасывающая пробелы и ошибки, сохраняя только уникальные строки. Объединены с разделителем перевода строки (vbLF), но игнорируют первые две строки заголовка и отсортированы по возрастанию.

=textjoinifs(CHAR(10), 24, 2, A:A)

введите описание изображения здесь

Пример 2

Расширенная операция TextJoinIfs, отбрасывающая пробелы и ошибки, сохраняя только уникальные строки. Объединяется с разделителем точка с запятой / пробел. Один набор условий диапазона и критериев.

=textjoinifs("; ", 8, 0, B:B, A:A, A2)

введите описание изображения здесь

Пример 3

Расширенная операция TextJoinIfs, отбрасывающая пробелы и ошибки. Объединяется с разделителем запятая / пробел. Несколько пар условий с использованием математических сравнений.

=textjoinifs(", ", 0, 0, B:B, A:A, ">="&D2, A:A, "<="&E2)

введите описание изображения здесь


Большое спасибо Lorem Ipsum Generator за образец содержания строки.

person Community    schedule 06.06.2018
comment
Вы великолепный товарищ! - person K.Honda; 07.06.2018
comment
есть ли способ сделать так, чтобы результаты отображались в алфавитном порядке? - person K.Honda; 07.06.2018
comment
Да, это работает с листами. Я также добавил сортировку и возможность пропускать строки заголовков. - person ; 07.06.2018
comment
@Jeeped Это такой отличный ответ - не могли бы вы обновить словоблудие, чтобы отразить Excel 2016 (при условии, что он все еще работает в 2016 году, что, я думаю, так и есть)? - person dwirony; 29.08.2018
comment
@dwirony - Непонятно, что должно повлечь за собой «отразить Excel 2016». Замечу, что он добавляет «расширенную функциональность для всех версий». - person ; 29.08.2018