Как ввести условный список заголовков в ячейке, отсортированной по значениям ячейки в том же столбце заголовка? - PullRequest
1 голос
/ 16 мая 2019

В MS Excel я пытаюсь предоставить список заголовков в одной ячейке, основываясь на том, имеет ли заголовок значение (больше 0).Я надеюсь также отсортировать список в этой ячейке по величине в первую очередь.Как я могу это сделать?

Я совсем не изучал Visual Basic, и действительно пытался использовать только некоторые операторы if.У меня есть очень большой стол для сортировки, и я не хочу делать это вручную.

Что я пытаюсь получить:

         ---------  Header1   Header2   Header3   List
                    Apple     Orange    Pear  

Row 1 -     Ryan    0         0         0         --
Row 2 -     Cindy   0         5         7         Pears, Oranges
Row 3 -     Tom                                   N/A
Row 4 -     Jess    3         6         2         Oranges, Apples, Pears

Спасибо!

Ответы [ 3 ]

0 голосов
/ 16 мая 2019

Если у вас Office 365 Excel, вы бы использовали эту формулу массива:

=IFERROR(TEXTJOIN(",",TRUE,INDEX($B$1:$D$1,N(IF({1},MATCH(AGGREGATE(14,7,$B3:$D3/($B3:$D3>0),ROW($XFD$1:INDEX($XFD:$XFD,COUNTIF($B3:$D3,">0")))),$B3:$D3,0))))),IF(COUNT(B3:D3)>1,"---","N/A"))

Будучи формулой массива, необходимо подтвердить ее с помощью Ctrl-Shift-Enter вместо Enter при выходе из режима редактирования.

Он строит массив заголовков по порядку и возвращает его в функцию TEXTJOIN. Одно замечание: если в значениях есть связь, он возвращает одинаковый заголовок для обоих. Например, 6,6,6 вернет Apple,Apple,Apple.

enter image description here


Если у вас нет Office 365 Excel, поместите этот код в модуль, прикрепленный к рабочему листу, и используйте формулу, как указано выше:

Function TEXTJOIN(delim As String, skipblank As Boolean, arr)
    Dim d As Long
    Dim c As Long
    Dim arr2()
    Dim t As Long, y As Long
    t = -1
    y = -1
    If TypeName(arr) = "Range" Then
        arr2 = arr.Value
    Else
        arr2 = arr
    End If
    On Error Resume Next
    t = UBound(arr2, 2)
    y = UBound(arr2, 1)
    On Error GoTo 0

    If t >= 0 And y >= 0 Then
        For c = LBound(arr2, 1) To UBound(arr2, 1)
            For d = LBound(arr2, 1) To UBound(arr2, 2)
                If arr2(c, d) <> "" Or Not skipblank Then
                    TEXTJOIN = TEXTJOIN & arr2(c, d) & delim
                End If
            Next d
        Next c
    Else
        For c = LBound(arr2) To UBound(arr2)
            If arr2(c) <> "" Or Not skipblank Then
                TEXTJOIN = TEXTJOIN & arr2(c) & delim
            End If
        Next c
    End If
    TEXTJOIN = Left(TEXTJOIN, Len(TEXTJOIN) - Len(delim))
End Function

Это также может быть сделано путем создания укуса одно слово за раз:

=MID(IF(B3>0,","&$B$1,"")&IF(C3>0,","&$C$1,"")&IF(D3>0,","&$D$1,""),2,999)

Но это становится действительно неуправляемым, если есть много столбцов:

enter image description here

0 голосов
/ 16 мая 2019

Вы можете сделать это со старыми версиями Excel, но формула немного усложняется, чтобы показать правильные запятые в нужном месте. Я разделил на две формулы, чтобы было понятнее:

enter image description here

Первая формула - найти и записать заголовки (расположены в столбце E):

 =+IF(COUNTIF(B6:D6,">"&0)>0,CONCATENATE(IF(B6>0,B$4&",",""),IF(C6>0,C$4&",",""),IF(D6>0,D$4,"")),"")

Второй способ заключается в очистке запятых и предоставлении окончательного результата (находится в столбце F):

=+IF(RIGHT(E6,1)=",",LEFT(E6,LEN(E6)-1),E6)

Вы можете объединить оба в одно, но тогда трудно уточнить, что делает формула:

=+IF(RIGHT(IF(COUNTIF(B6:D6,">"&0)>0,CONCATENATE(IF(B6>0,B$4&",",""),IF(C6>0,C$4&",",""),IF(D6>0,D$4,"")),""),1)=",",LEFT(IF(COUNTIF(B6:D6,">"&0)>0,CONCATENATE(IF(B6>0,B$4&",",""),IF(C6>0,C$4&",",""),IF(D6>0,D$4,"")),""),LEN(IF(COUNTIF(B6:D6,">"&0)>0,CONCATENATE(IF(B6>0,B$4&",",""),IF(C6>0,C$4&",",""),IF(D6>0,D$4,"")),""))-1),IF(COUNTIF(B6:D6,">"&0)>0,CONCATENATE(IF(B6>0,B$4&",",""),IF(C6>0,C$4&",",""),IF(D6>0,D$4,"")),""))
0 голосов
/ 16 мая 2019

добро пожаловать в переполнение стека!

Попробуйте проверить TEXTJOIN , чтобы объединить ячейки в список. Также проверьте эту ссылку на условно объединяя диапазон для хорошего примера реализации. Удачи!

...