Vous pouvez convertir un "ensemble de règles" en toutes les combinaisons possibles des attributs (IsCool, IsNerdy, HasChild, etc.) en traitant "Ignorer" comme 0 (zéro) ou 1 (unité). Ainsi, la première règle du jeu de règles questions serait remplacée par deux règles.
IsCool ¦ IsNerdy ¦ HasChild¦ Group 1 ¦ 1 ¦ 0 ¦ A 1 ¦ 1 ¦ 1 ¦ A
Bien qu'il existe seulement 8 possibilités dans les trois attributs, cette approche peut conduire à plus de 8 règles. Par exemple, dans le jeu de règles de la question, une personne avec le n-uplet de données (IsCool, IsNerdy, HasChild) donné par (1,1,1) correspondrait au groupe A et au groupe B lorsque les "ignorés" dans le rulset sont étendus de cette façon. Pour éliminer l'ambiguïté que cela provoque, il est également nécessaire d'appliquer les priorités: la correspondance au groupe A a une priorité plus élevée que celle de B, de sorte que la table de recherche inclut (1,1,1, A) en tant que ligne mais exclut (1 , 1,1, B). Avec une plus grande ensemble de règles impliquant plus d'attributs, la tâche de construire la table VLOOKUP
requise à partir de la table des règles ne sera pas sans problèmes, en particulier si une approche non manuelle est souhaitée et Excel seulement doit être utilisé plutôt Excel en conjonction avec VBA.
approche alternative n'impliquant pas VBA qui traite l'ensemble de règles comme les données sont les suivantes.
Formaliser les notations introduites ci-dessus, une règle concernant les attributs de n peut être exprimé comme
(r[1],r[2],...,r[n],G)
où r[i] (i=1,...,n)
peut prendre des valeurs de 0
, 1
ou "ignore"
et G
représente le groupe (l'un des A, B, C ou D dans l'exemple de la question).
Une instance de données peut de même être représentée comme
(d[1],d[2],...,d[n])
où d[i] (i=1,...,n)
prend des valeurs de 0
ou 1
(mais pas "ignore"
)
La règle est adaptée si
r[i] = "ignore" OR "d[i] = r[i]" for each i from 1 to n
Il est un moyen assez évident de mettre en œuvre dans Excel comme
=AND(OR(r[1]="ignore",d[1]=r[1]),OR(r[2]="ignore",d[2]=r[2]),...,OR(r[n]="ignore",d[n]=r[n]))
où, bien sûr, les références de cellules pertinentes sont utilisées à la place des d[i]
et r[i]
ci-dessus et des espaces réservés indiqués le nombre approprié de OR
« s sont imbriquées à l'intérieur de la AND
pour remplacer le raccourci ...
.
La pseudo-formule ci-dessus a une valeur de TRUE
ou FALSE
, la première indiquant que l'instance de données correspond à la règle et la dernière ne l'est pas. Cependant, ce n'est pas la fin de l'histoire car les règles doivent toujours être appliquées dans l'ordre de priorité.
Ainsi, l'extension de la notation plus, on suppose que les règles sont classées par ordre de priorité (règle 1 a une priorité supérieure à la règle 2, qui a une priorité supérieure à la règle 3, etc.)
Si la cellule C [ k] contient le résultat de l'application de la règle de la k-ième à une instance de données à modifier ensuite le pseudo-formule ci-dessus de telle sorte que C [k] a maintenant la formule
=IF(OR(C[1],...,C[k-1]),FALSE,AND(...))
veille à ce que la règle de la kème ne peut correspondre que si aucune règle antérieure (et donc de priorité plus élevée) n'a été trouvée. (Ici la troisième partie du IF
est la formule AND
précédemment notée.)
La capture d'écran ci-dessous montre l'approche en action pour l'exemple de la question.
Les cellules en bleu sont des formules. Ceux pour les valeurs TRUE/FALSE dans la seconde table implémentent la pseudo-formule discutée ci-dessus. Par exemple, la cellule F13
montre le résultat d'application de la règle 1 à l'instance de données (0,0,0) et a la formule
=AND(OR($C$5="Ignore",$C$5=$C13),OR($D$5="Ignore",$D$5=$D13),OR($E$5="Ignore",$E$5=$E13))
NB suivante: pas intégré doit être enroulé autour de cette formule parce qu'il n'y a La formule pour la cellule I13
montre le résultat de l'application de la règle 4 à la même instance de données et doit prendre en compte les priorités plus élevées accordées aux règles 1, 2 et 3. La formule de la cellule dans cette cellule est
=IF(OR($F13:H13),FALSE,AND(OR($C$8="Ignore",$C$8=$C13),OR($D$8="Ignore",$D$8=$D13),OR($E$8="Ignore",$E$8=$E13)))
Les formules dans les cellules G13
et H13
sont similaires à celles de I13
(à gauche en tant qu'exercice).
Par conception, il peut y avoir au plus une valeur TRUE dans chaque ligne et, si l'ensemble de règles est sain, il devrait y avoir exactement une telle valeur. Les formules dans la dernière colonne de la deuxième table font cette hypothèse au sujet du jeu de règles et choisissent simplement la valeur pertinente de la dernière colonne de la première table correspondant à n'importe quelle règle qui montre TRUE.
La formule dans la cellule J13
est
=INDEX(F$5:F$8,SUMPRODUCT(1*(F13:I13),F$12:I$12))
Les formules dans la gamme F13:J13
ont été simplement recopié les lignes de la table aux cellules F14:J20
ouah! laissez-moi essayer cela et comprendre en détail ... – oal100
Je suppose qu'il n'est pas possible d'arriver à la priorisation sans FI imbriqués. Mais après y avoir réfléchi, c'est une solution vraiment élégante. – oal100