6 votes

Concaténation conditionnelle du contenu des cellules sur plusieurs lignes

J'ai une feuille de calcul avec des milliers de lignes qui contiennent un identifiant unique. A et 3 codes d'erreur différents M . Chaque identifiant individuel peut comporter 1, 2 ou 3 erreurs. Elles seront toujours dans le même ordre.

J'ai tapé à la main et en N quel est le résultat souhaité. J'ai écrit une formule comme celle-ci dans les colonnes O, P, Q avec le texte de l'erreur :

=IF(IFERROR(SEARCH("Brand is not valid", M42), "") <> "", "Brand", "")

J'ai essayé quelque chose comme cela dans R mais il ne fonctionne pas correctement pour des raisons évidentes. Existe-t-il un moyen de faire en sorte que R ressemble à N ?

=CONCATENATE(O42,"/", P42,"/",Q42)

S'il n'est pas possible d'utiliser une formule Excel, existe-t-il un moyen VBA ?

concat

3voto

FreeMan Points 308

Bon, il a fallu se creuser la tête, mais j'ai trouvé :

Colonnes O , P & Q comme vous l'avez fait, intitulé Brand , Product & OEM . Transformez l'ensemble en tableau avec Ctrl - T (non obligatoire, mais pratique, et ma rubrique R s'appuie sur elle, mais vous pouvez utiliser des références de colonnes si vous le souhaitez)

Colonne R :

=IF(LEN([Brand])>0,[Brand],IF(LEN([Product])>0,[Product],IF(LEN([OEM])>0,[OEM],"")))

Colonne S :

=IF(A2=A4,F2&"/"&F3&"/"&F4,IF(A2=A1,"",IF(A2=A3,F2&"/"&F3,F2)))

Malheureusement, il semble que la seule façon d'utiliser des références de tableau à une ligne différente soit d'utiliser Offset Pour simplifier les choses, je suis revenu aux références de cellules. Cela annule en quelque sorte le facteur cool/handy de transformer l'ensemble en tableau en premier lieu, mais peu importe...

Et... Voici une photo de ce à quoi il ressemble :

enter image description here

3voto

Scott Points 20468

Je commencerais par optimiser votre O , P y Q formules. Vous avez actuellement

=IF(IFERROR(SEARCH("Brand is not valid", M42), "") <> "", "Brand", "")

IFERROR est une fonction très utile pour afficher une version aseptisée. d'une valeur calculée qui pourrait être un code d'erreur ; Je l'utilise fréquemment et la recommande dans les réponses sur Super User. Comme vous le savez probablement,

  • IFERROR(_calculated_value_, _default_value_)

est l'abréviation de

  • IF(ISERROR(_calculated_value_), _default_value_, _calculated_value_)

Mais l'utilisation de IFERROR pour créer une version assainie d'une valeur puis tester cette valeur pour faire quelque chose de conditionnel est une façon inutilement maladroite d'utiliser la fonction IFERROR . La formule ci-dessus peut être simplifiée comme suit

=IF(ISERROR(SEARCH("Brand is not valid", M42)), "", "Brand")

Et, comme vous le savez certainement, SEARCH("Brand is not valid", M42) des tests pour vérifier si M42 contient Brand is not valid . Mais, tant que la colonne M ne peut contenir que vos trois chaînes d'erreur, ce qui peut être abrégé en

=IF(ISERROR(SEARCH("Brand", M42)), "", "Brand")

ou simplifié à

=IF(M42 = "Brand is not valid", "Brand", "")

OK, maintenant je vais faire le O , P y Q un peu plus compliquées :

  • O42 =IF($A42=$A41, O41, "") & IF(ISERROR(SEARCH("Brand", $M42)), "", "Brand")
  • P42 =IF($A42=$A41, P41, "") & IF(ISERROR(SEARCH("Product", $M42)), "", "Product")
  • Q42 =IF($A42=$A41, Q41, "") & IF(ISERROR(SEARCH("OEM", $M42)), "", "OEM")

La formule pour O42 dit,

S'il s'agit de la deuxième ou de la troisième ligne pour cet identifiant (colonne A ) regardez la cellule au-dessus de celle-ci (c'est-à-dire la colonne O pour la cellule précédente si nous avons déjà établi que cette chose a une marque invalide. En outre, regardez la colonne M pour cette ligne afin de voir si elle est Brand is not valid . Puis concaténer les résultats.

Étant donné qu'un identifiant unique ne sera jamais répertorié deux fois avec la même erreur (n'est-ce pas ?), ces deux sous-résultats ne seront jamais tous les deux non vides, il s'agit donc essentiellement d'un "OU" :

Afficher une valeur de Brand i OU l'une des lignes précédentes pour cet identifiant, contient l'erreur de marque non valide.

Cela a pour effet de faire glisser le O , P y Q valeurs jusqu'à la dernière ligne pour chaque ID :

Notez que les lignes 41, 44, 47 et 49 présentent chacune les formes abrégées de toutes les erreurs qui s'appliquent à leurs identifiants respectifs dans les colonnes O , P y Q .

J'ai défini la colonne R de la même manière que vous. Voir Générer une liste du contenu des cellules séparées par des virgules, à l'exclusion des blancs. pour connaître les techniques permettant d'éliminer les barres obliques indésirables.

Si la concaténation souhaitée n'existe que dans les lignes 41, 44, 47 et 49 est suffisant, vous avez terminé. Sinon, définissez N42 como

=IF($A22=$A23, N23, R22)

o

=IF($A22<>$A23, R22, N23)

Il s'agit presque exactement de la même astuce que celle que j'ai utilisée dans Colonnes O , P y Q , mais en allant dans la direction opposée :

S'il s'agit de la dernière ligne pour cet ID (c'est-à-dire s'il s'agit de la ligne 41, 44, 47 ou 49), utiliser la concaténation des valeurs de cette ligne (c'est-à-dire la collection complète des codes d'erreur pour cet ID). [ ] Sinon, regardez la cellule en dessous de celle-ci (c'est-à-dire la colonne N pour la ligne suivante), qui contiendra la bonne réponse.

En d'autres termes, les valeurs souhaitées remontent jusqu'à la première ligne de chaque identifiant.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X