Условная конкатенация в Excel - PullRequest
0 голосов
/ 27 февраля 2019

Как вы можете видеть на картинке, в каждом ряду есть 1 и 0, переставленные в 3 строки и один английский алфавит.Что мне нужно сделать, это объединить английские алфавиты для каждой строки, когда значение соответствующего столбца равно 0. Как я могу это сделать?

image link

Ответы [ 6 ]

0 голосов
/ 27 февраля 2019

Следующая формула массива сделает работу (введите ее с помощью Ctrl + Shift + Enter):

=CONCAT(IF($A1:$I1=0,UNICHAR(64+COLUMN($A1:$I1)),""))

Для более старых версий Excel используйте устаревшие функции CONCATENATE() и CHAR() вместоэти функции.

0 голосов
/ 27 февраля 2019

Условно-сцепленная строка (UDF)

Аргументы

  • SourceRowRange: диапазон, содержащий значения, которые будут записаны в CCROW например, A, B, C ... Обязательно.
  • CriteriaRowRange: диапазон, который будет проверяться для CriteriaValue.Обязательно.
  • CriteriaValue: значение, по которому будут проверяться ячейки в CriteriaRowRange.По умолчанию 0.Необязательно.
  • JoinString: значение, которое будет помещено между значениями, которые будут записаны в CCROW.По умолчанию "".Необязательно.

'Скопируйте следующий код в стандартный модуль, например, в VBE перейдите на Insert>Module.

Код

Function CCROW(ByVal SourceRowRange As Range, ByVal CriteriaRowRange As Range, _
        Optional ByVal CriteriaValue As Variant = 0, _
        Optional ByVal JoinString As String) As String

    Dim vntS As Variant   ' Source Array
    Dim vntC As Variant   ' Criteria Array
    Dim NoC As Long       ' Number of Columns
    Dim j As Long         ' Arrays Column Counter
    Dim strB As String    ' String Builder
    Dim strC As String    ' Criteria String

    ' Calculate number of columns of the narrower Range.
    NoC = WorksheetFunction.Min(SourceRowRange.Columns.count, _
            CriteriaRowRange.Columns.count)

    ' Copy resized (adjust them to same size) Ranges to Arrays.
    vntS = SourceRowRange.Resize(1, NoC)
    vntC = CriteriaRowRange.Resize(1, NoC)

    ' Loop through columns of either Array.
    For j = 1 To NoC
        ' Write current value of Criteria Array to Criteria String.
        strC = vntC(1, j)
        ' Check if Criteria String is NOT empty.
        If strC <> "" Then
            ' Check if Criteria String is equal to Criteria Value.
            If strC = CriteriaValue Then
                ' Check if String Builder is NOT empty.
                If strB <> "" Then  ' NOT empty.
                    strB = strB & JoinString & vntS(1, j)
                  Else              ' IS empty (only once).
                    strB = vntS(1, j)
                End If
            End If
        End If
    Next

    ' Write String Builder to Conditionally Concatenate Row.
    CCROW = strB

End Function

Использование в Excel

=CCROW(A$1:I$1,A3:I3) ' Result: ADG
=CCROW(A$1:I$1,A4:I4) ' Result: CFI
=CCROW(A$1:I$1,A5:I5) ' Result: DG

Если вы добавите JoinString:

=CCROW(A$1:I$1,A3:I3,,",")   ' Result: A,D,G
=CCROW(A$1:I$1,A3:I3,0,",")  ' Result: A,D,G
=CCROW(A$1:I$1,A3:I3,0,", ") ' Result: A, D, G

ЕСЛИ вы измените CriteriaValue:

=CCROW(A$1:I$1,A3:I3,1) ' Result: BCEFHI
=CCROW(A$1:I$1,A4:I4,1) ' Result: ABDEGH
=CCROW(A$1:I$1,A5:I5,1) ' Result: ABCEFHI

Замечания Заблокируйте ($) строку SourceRowRange, чтобы сохранить ее неизменной при копировании формулы.

0 голосов
/ 27 февраля 2019

Здесь добавьте эту функцию в модуль.Вы можете позвонить прямо через Excel.Хороший.

Function conc(ref As Range, Optional Separator As String) As String
Dim Cell As Range
Dim Result As String

For Each Cell In ref
    If Cell.Value = 0 Then
    Result = Result & chr(64 + Cell.Column) & Separator
    End If
Next Cell
If Separator <> "" Then conc = Left(Result, Len(Result) - 1) Else: conc = Result
End Function
0 голосов
/ 27 февраля 2019

Вот решение VBA, которое может обрабатывать любое количество столбцов (при условии, что буква, связанная с каждым столбцом, является стандартной меткой столбца):

Function ZeroColumns(R As Range) As String
    Dim n As Long
    Dim count As Long
    Dim cols As Variant
    Dim cell As Range

    n = R.Cells.count
    ReDim cols(1 To n)
    For Each cell In R.Cells
        If cell.Value = 0 Then
            count = count + 1
            cols(count) = Split(cell.Address, "$")(1)
        End If
    Next cell
    ReDim Preserve cols(1 To count)
    ZeroColumns = Join(cols, "")
End Function

Код не должен быть слишком сложным для настройкиесли указанное предположение не выполняется.

0 голосов
/ 27 февраля 2019

Собираетесь ли вы к этому во многих других колонках или только в тех, которые вы упомянули?Пока количество столбцов относительно невелико, как на картинке, вы можете объединить функции IF для достижения вашего результата.

Вот что я сделал:

enter image description here

Используя эту формулу, вы получите такой же результат, как у вас:

enter image description here

Предполагая также, что у вас есть значенияна листе, подобном моему, просто вставьте формулу =IF(B3=1,"",B$1)&IF(C3=1,"",C$1)&IF(D3=1,"",D$1)&IF(E3=1,"",E$1)&IF(F3=1,"",F$1)&IF(G3=1,"",G$1)&IF(H3=1,"",H$1)&IF(I3=1,"",I$1)&IF(J3=1,"",J$1) в B7, а затем перетащите в B8 и B9, чтобы получить остальные результаты.

Конечно, если вы собираетесь сделать это для еще многих столбцов, может быть, лучше использовать VBA.

0 голосов
/ 27 февраля 2019

Вы можете сделать все это в одной формуле, если хотите:

=CONCATENATE(IF($A1=0,'A',''),IF($B1=0,'B',''), ...)

Или поместить промежуточные строки в отдельный ряд, а затем объединить их (чтобы избежать износа пальцев).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...