Fonction Case équivalente dans Excel
J'ai un défi intéressant - je dois vérifier les données suivantes dans Excel:
| A - B - C - D |
|------|------|------|------|
| 36 | 0 | 0 | x |
| 0 | 600 | 700 | x |
|___________________________|
Vous devrez excuser mon art ASCII merveilleusement mauvais. J'ai donc besoin de la colonne D (x) pour effectuer une vérification par rapport aux cellules adjacentes, puis convertir les valeurs si nécessaire. Voici les critères:
Si la colonne B est supérieure à 0, Tout fonctionne très bien et je peux obtenir du café. Si cela ne répond pas à cette exigence, alors j'ai besoin de convertir A1 selon une table-par exemple, 32 = 1420
et place dans D
. Malheureusement, il n'y a pas de relation entre A et ce qu'il doit convertir, donc créer un calcul est hors de question.
Une instruction case ou switch serait parfaite dans ce scénario, mais je ne pense pas que ce soit une fonction native dans Excel. Je pense aussi que ce serait un peu fou d'enchaîner un tas de =IF()
déclarations ensemble, ce que j'ai fait environ quatre fois avant de décider que c'était une mauvaise idée (histoire de ma vie).
9 réponses
Sonne comme un travail pour RECHERCHEV!
Vous pouvez placer vos mappages de type 32 -> 1420 dans quelques colonnes quelque part, puis utiliser la fonction VLOOKUP pour effectuer la recherche.
Sans référence au problème original (que je soupçonne être résolu depuis longtemps), j'ai très récemment découvert une astuce qui fait que la fonction Choose fonctionne exactement comme une instruction select case
sans avoir besoin de modifier les données. Il n'y a qu'un seul hic: une seule de vos conditions choose peut être vraie à un moment donné.
La syntaxe est la suivante:
CHOOSE(
(1 * (CONDITION_1)) + (2 * (CONDITION_2)) + ... + (N * (CONDITION_N)),
RESULT_1, RESULT_2, ... , RESULT_N
)
En supposant qu'une seule des conditions 1 À N sera vraie, tout le reste est 0, ce qui signifie que la valeur numérique sera correspondent au résultat approprié.
Si vous n'êtes pas sûr à 100% que toutes les conditions sont mutuellement exclusives, vous pouvez préférer quelque chose comme:
CHOOSE(
(1 * TEST1) + (2 * TEST2) + (4 * TEST3) + (8 * TEST4) ... (2^N * TESTN)
OUT1, OUT2, , OUT3, , , , OUT4 , , <LOTS OF COMMAS> , OUT5
)
Cela dit, si Excel a une limite supérieure sur le nombre d'arguments qu'une fonction peut prendre, vous le frapperiez assez rapidement.
Honnêtement, je ne peux pas croire qu'il m'a fallu des années pour le résoudre, mais je ne l'ai pas vu auparavant, alors j'ai pensé que je le laisserais ici pour aider les autres.
EDIT: par commentaire ci-dessous de @aTrusty: Idiot numéros des virgules peuvent être éliminées (et par conséquent, l'instruction choose fonctionnerait jusqu'à 254 cas) en utilisant une formule de la forme suivante:
CHOOSE(
1 + LOG(1 + (2*TEST1) + (4*TEST2) + (8*TEST3) + (16*TEST4),2),
OTHERWISE, RESULT1, RESULT2, RESULT3, RESULT4
)
Notez le deuxième argument de la clause LOG
, qui le met en base 2 et fait fonctionner le tout.
Edit: par la réponse de David , Il y a maintenant une instruction switch réelle si vous avez la chance de travailler sur office 2016. Mis à part la difficulté à lire, cela signifie également que vous obtenez l'efficacité du commutateur, pas seulement le comportement!
La fonction de commutation est maintenant disponible, dans Excel 2016 / Office 365
SWITCH(expression, valeur1, result1, [par défaut ou valeur2, result2],...[par défaut ou valeur3, result3])
example:
=SWITCH(A1,0,"FALSE",-1,"TRUE","Maybe")
Essayez ceci;
=IF(B1>=0, B1, OFFSET($X$1, MATCH(B1, $X:$X, Z) - 1, Y)
Où
X = les colonnes dans lesquelles vous indexez
Y = le nombre de colonnes à gauche (-Y) ou à droite (Y) de la colonne indexée pour obtenir la valeur que vous recherchez
Z = 0 si exact-match (si vous voulez gérer les erreurs)
Je sais il est un peu tard pour répondre, mais je pense que cette courte vidéo vous aidera beaucoup.
Http://www.xlninja.com/2012/07/25/excel-choose-function-explained/
Essentiellement, il utilise la fonction choose. Il l'explique très bien dans la vidéo donc je vais laisser faire au lieu de taper 20 pages.
Une autre vidéo de son explique comment utiliser la validation des données pour remplir une liste déroulante que vous pouvez sélectionner parmi un nombre limité gamme.
Http://www.xlninja.com/2012/08/13/excel-data-validation-using-dependent-lists/
Vous pouvez combiner les deux et utiliser la valeur dans la liste déroulante, comme votre indice de la fonction choose. Bien qu'il n'a pas montré comment les combiner, je suis sûr que vous pourriez comprendre que ses vidéos sont bonnes. Si vous avez des problèmes, faites-le moi savoir et je mettrai à jour ma réponse pour vous montrer.
Je comprends que c'est une réponse à un vieux post-
J'aime la fonction If () combinée avec Index () / Match ():
=IF(B2>0,"x",INDEX($H$2:$I$9,MATCH(A2,$H$2:$H$9,0),2))
La fonction if compare ce qui est dans la colonne b et si elle est supérieure à 0, elle renvoie x, sinon elle utilise le tableau (table d'information) identifié par la fonction Index () et sélectionné par Match () pour renvoyer la valeur à laquelle correspond a.
Le tableau D'Index a l'emplacement absolu défini $H$2:$I$9
(les signes du dollar) de sorte que l'endroit vers lequel il pointe ne changera pas lorsque la formule est copiée. La ligne avec la valeur que vous souhaitez renvoyer est identifiée par la fonction Match (). Match () a la valeur ajoutée de ne pas avoir besoin d'une liste triée pour regarder à travers ce Vlookup() nécessite. Match () peut trouver la valeur avec une valeur: 1 inférieur à, 0 exact, -1 supérieur à. Je mets un zéro après le tableau absolute Match () $H$2:$H$9
pour trouver la correspondance exacte. Pour la colonne, cette valeur du tableau Index() que l'on voudrait renvoyer est entrée. Je suis entré dans un 2 parce que dans mon tableau la valeur de retour est dans la deuxième colonne. Ci-dessous mon tableau d'index ressemblait à ceci:
32 1420
36 1650
40 1790
44 1860
55 2010
La valeur dans une colonne à rechercher dans la liste est dans la première colonne dans mon exemple et la valeur correspondante est de retour, à droite. La table de recherche/référence peut être sur n'importe quel onglet du livre de travail - ou même dans un autre fichier. - Book2 est le nom du fichier, et Sheet2 est le nom "autre onglet".
=IF(B2>0,"x",INDEX([Book2]Sheet2!$A$1:$B$8,MATCH(A2,[Book2]Sheet2!$A$1:$A$8,0),2))
Si vous ne voulez pas que x retourne lorsque la valeur de b est supérieure que zéro supprimer le x pour un équivalent 'vide' / null ou peut-être mettre un 0-pas sûr de ce que vous voulez là.
Ci-dessous est le début de la fonction avec le x supprimé.
=IF(B2>0,"",INDEX...
J'ai utilisé cette solution pour convertir les codes de couleur à une seule lettre dans leurs descriptions:
=CHOOSE(FIND(H5,"GYR"),"Good","OK","Bad")
Fondamentalement, Vous recherchez l'élément que vous essayez de décoder dans le tableau, puis utilisez CHOOSE()
pour choisir l'élément associé. C'est un peu plus compact que de construire une table pour VLOOKUP()
.
Même si vieux, cela semble être une question populaire, donc je vais poster une autre solution, qui je pense est très élégante:
Http://fiveminutelessons.com/learn-microsoft-excel/using-multiple-if-statements-excel
C'est élégant car il utilise uniquement la fonction IF. Fondamentalement, cela se résume à ceci:
If(condition, choisissez/utiliser une valeur de la table, si(condition, choisissez/utiliser une autre valeur de la tableau...
Et ainsi de suite
Fonctionne à merveille, encore mieux que HLOOKUP ou VLOOOKUP
Mais... Soyez averti-il y a une limite au nombre d'instructions imbriquées si excel peut gérer.
Si vous n'avez pas D'instruction SWITCH dans votre version Excel (pré-Excel-2016), Voici une implémentation VBA pour cela:
Public Function SWITCH(ParamArray args() As Variant) As Variant
Dim i As Integer
Dim val As Variant
Dim tmp As Variant
If ((UBound(args) - LBound(args)) = 0) Or (((UBound(args) - LBound(args)) Mod 2 = 0)) Then
Error 450 'Invalid arguments
Else
val = args(LBound(args))
i = LBound(args) + 1
tmp = args(UBound(args))
While (i < UBound(args))
If val = args(i) Then
tmp = args(i + 1)
End If
i = i + 2
Wend
End If
SWITCH = tmp
End Function
Cela fonctionne exactement comme prévu, un remplacement par exemple pour la fonction SWITCH
de Google Spreadsheet.
Syntaxe:
=SWITCH(selector; [keyN; valueN;] ... defaultvalue)
Où
- sélecteur est toute expression qui est comparée aux clés
- key1, key2,... sont des expressions qui sont comparées au sélecteur
- valeur1, valeur2, ... sont des valeurs sélectionnées si le sélecteur est égal à la clé correspondante (seulement)
- defaultvalue est utilisé si aucune clé ne correspond au sélecteur
Exemples:
=SWITCH("a";"?") returns "?"
=SWITCH("a";"a";"1";"?") returns "1"
=SWITCH("x";"a";"1";"?") returns "?"
=SWITCH("b";"a";"1";"b";TRUE;"?") returns TRUE
=SWITCH(7;7;1;7;2;0) returns 2
=SWITCH("a";"a";"1") returns #VALUE!
Pour l'utiliser, Ouvrez votre Excel, allez dans L'onglet Outils de développement, cliquez sur Visual Basic, cliquez avec le bouton droit sur ThisWorkbook, choisissez Insérer, puis Module, enfin Copiez le code dans l'éditeur. Vous devez enregistrer comme un classeur Excel Macro-friendly (xlsm).