2
votes

Concaténation conditionnelle dans Excel

Comme vous pouvez le voir sur l'image, il y a quelques 1 et 0 réorganisés en 3 lignes et un alphabet anglais pour chaque colonne. Ce que je dois faire est de concaténer les alphabets anglais pour chaque ligne lorsque la valeur de colonne respective est 0. Comment puis-je le faire?

 lien image


1 commentaires

Quelle version d'Excel? Si vous êtes à jour, vous pouvez utiliser TEXTJOIN () sfmagazine.com/post-entry/...


6 Réponses :


0
votes

Vous pouvez tout faire en une seule formule si vous le souhaitez:

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

Ou placez les chaînes intermédiaires sur une ligne séparée, puis concaténez-les (pour éviter l'usure de vos doigts).


0 commentaires

0
votes

Allez-vous à ceci dans beaucoup plus de colonnes, ou juste celles que vous avez mentionnées? Tant que le nombre de colonnes est relativement petit, comme dans votre image, vous pouvez concaténer des fonctions IF pour obtenir votre résultat.

Voici ce que j'ai fait:

 entrez la description de l'image ici

L'utilisation de cette formule vous donnera un résultat comme celui que vous avez:

 entrez la description de l'image ici

En supposant également que vous ayez les valeurs dans une feuille de calcul comme la mienne, collez simplement la formule = 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) dans B7, puis faites glisser vers B8 et B9 pour obtenir le reste des résultats.

Bien sûr, si vous comptez faire cela pour beaucoup plus de colonnes, il est peut-être préférable d'utiliser VBA.


0 commentaires

1
votes

Voici une solution VBA qui peut gérer n'importe quel nombre de colonnes (en supposant que la lettre associée à chaque colonne est l'étiquette de colonne standard):

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

Le code ne doit pas être trop dur pour ajuster si l'hypothèse énoncée ne tient pas.


0 commentaires

0
votes

Ici, ajoutez cette fonction à un module. Vous pouvez ensuite l'appeler directement via Excel. Bien joué.

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 commentaires

0
votes

Arguments de concaténation conditionnelle de ligne (UDF)

  • SourceRowRange : la plage contenant les valeurs qui seront écrit dans CCROW par ex. A, B, C ... Obligatoire.
  • CriteriaRowRange : la plage qui sera vérifiée CriteriaValue . Obligatoire.
  • CriteriaValue : la valeur que les cellules de CriteriaRowRange être vérifié. La valeur par défaut est 0 . Facultatif.
  • JoinString : la valeur qui sera placée entre les valeurs qui être écrit dans CCROW . La valeur par défaut est "" . Facultatif.

'Copiez le code suivant dans un module standard ie dans VBE allez dans Insert>Module.

Le Code h2>
=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

Utilisation dans Excel

=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

Si vous ajoutez JoinString:

=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

SI vous modifiez CriteriaValue:

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

Remarques Verrouillez ( $ ) la ligne de SourceRowRange pour qu'elle reste la même lorsque la formule est copiée.


0 commentaires

0
votes

La formule matricielle suivante fera l'affaire (entrez-la avec Ctrl + Maj + Entrée):

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

Pour les anciennes versions d'Excel, utilisez les fonctions héritées CONCATENATE () code> et CHAR () à la place de ces fonctions.


1 commentaires

N.B. Le CONCAT fonction , comme la Fonction TEXTJOIN mentionnée dans les commentaires , n'est disponible qu'à partir d'Office 365