web-dev-qa-db-fra.com

Fonction é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 merveilleusement mauvais ASCII. J'ai donc besoin de la colonne D (x) pour effectuer une vérification par rapport aux cellules adjacentes, puis pour convertir les valeurs si nécessaire. Voici les critères:

Si la colonne B est supérieure à 0, tout fonctionne bien et je peux prendre un café. S'il ne répond pas à cette exigence, je dois convertir A1 en fonction d'un tableau - par exemple, 32 = 1420 et le placer dans D. Malheureusement, il n'y a pas de relation entre A et ce à quoi il faut convertir, il est donc hors de question de créer un calcul.

Une instruction case ou switch serait parfaite dans ce scénario, mais je ne pense pas qu'il s'agisse d'une fonction native d'Excel. Je pense aussi que ce serait un peu fou de enchaîner plusieurs déclarations =IF(), ce que j'ai fait environ quatre fois avant de décider que c'était une mauvaise idée (histoire de ma vie).

48
Nic

Cela ressemble à un travail pour VLOOKUP !

Vous pouvez placer vos correspondances de type 32 -> 1420 dans quelques colonnes, puis utiliser la fonction VLOOKUP pour effectuer la recherche.

55
Blorgbeard

Sans faire référence au problème initial (que je soupçonne être résolu depuis longtemps), j'ai récemment découvert une astuce qui permet à la fonction Choose de fonctionner exactement comme une instruction select case sans qu'il soit nécessaire de modifier les données. Il n’ya qu’une attrape: une seule de vos conditions peut être remplie à la fois.

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 correspondra au résultat approprié.

Si vous n'êtes pas certain à 100% que toutes les conditions sont mutuellement exclusives, vous préférerez peut-être 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 impose une limite maximale au nombre d'arguments qu'une fonction peut prendre, vous l'aurez très rapidement.

Honnêtement, je ne peux pas croire qu'il m'a fallu des années pour régler le problème, mais je ne l'avais jamais vu auparavant. J'ai donc pensé le laisser ici pour aider les autres.

EDIT: Selon le commentaire ci-dessous de @aTrusty: Les nombres stupides de virgules peuvent être supprimés (et, par conséquent, l'instruction de choix fonctionnerait dans 254 cas au maximum) 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 place en base 2 et fait en sorte que tout fonctionne.

Edit: Per La réponse de David , il existe maintenant une déclaration de changement de commutateur si vous avez la chance de travailler sur office 2016. Outre les difficultés de lecture, cela signifie également que vous obtenez l'efficacité de changement, pas seulement le comportement!

21
tobriand

Essaye ça; 

=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 recherchée
Z = 0 si correspondance exacte (si vous voulez gérer les erreurs)

8
BKimmel

J'ai utilisé cette solution pour convertir les codes de couleur à une lettre en leurs descriptions:

=CHOOSE(FIND(H5,"GYR"),"Good","OK","Bad")

En gros, 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().

2
Robert

Je sais qu'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, je vais donc le laisser au lieu de taper 20 pages.

Une autre vidéo explique comment utiliser la validation des données pour créer un menu déroulant que vous pouvez sélectionner dans une plage limitée.

http://www.xlninja.com/2012/08/13/Excel-data-validation-using-dependent-lists/

Vous pouvez combiner les deux et utiliser la valeur du menu déroulant comme index pour la fonction de sélection. Bien qu'il n'ait pas montré comment les combiner, je suis sûr que vous pourriez le comprendre car ses vidéos sont excellentes. Si vous avez des problèmes, faites le moi savoir et je mettrai à jour ma réponse pour vous montrer.

1
Francis Rodgers

Je comprends qu’il s’agit d’une réponse à un ancien 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’informations) identifié par la fonction Index () et sélectionné par Match () pour renvoyer la valeur a correspond à.

Le tableau Index a l'emplacement absolu défini $H$2:$I$9 (les signes dollar), de sorte que l'emplacement vers lequel il pointe ne changera pas lors de la copie de la formule. 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 parcourir ce que Vlookup () requiert. Match () peut trouver la valeur avec une valeur: 1 inférieure à, 0 exacte, -1 supérieure à. Je mets un zéro après le tableau absolu Match () $H$2:$H$9 pour trouver la correspondance exacte. Pour la colonne, on entre la valeur du tableau Index () que l'on voudrait renvoyer. J'ai entré un 2 parce que dans mon tableau, la valeur de retour était 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 de votre colonne 'a' à rechercher dans la liste se trouve dans la première colonne de mon exemple et la valeur à renvoyer correspondante est à droite. La table de recherche/référence peut figurer dans n’importe quel onglet du classeur - ou même dans un autre fichier. -Book2 est le nom du fichier et Sheet2 est le nom de l'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 à zéro, supprimez le x pour obtenir un équivalent 'vide'/null ou mettez un 0 - ne savez pas exactement ce que vous voulez là.

Ci-dessous, le début de la fonction avec le x supprimé.

=IF(B2>0,"",INDEX...
1
Dan

Microsoft remplace SWITCH, IFS et IFVALUES par la fonction CHOISIR uniquement. 

=CHOOSE($L$1,"index_1","Index_2","Index_3")
0
Pit J

Même si vieux, cela semble être une question populaire, je vais donc poster une autre solution, qui, à mon avis, est très élégante:

http://fiveminutelessons.com/learn-Microsoft-Excel/using-multiple-if-statements-Excel

C'est élégant parce qu'il utilise seulement la fonction SI. En gros, cela se résume à ceci:

if (condition, choisir/utiliser une valeur de la table, si (condition, choisir/utiliser une autre valeur de la table ...

Etc

Fonctionne à merveille, même mieux que HLOOKUP ou VLOOOKUP

mais ... Soyez averti - il y a une limite au nombre de déclarations imbriquées si Excel peut gérer.

0
Chiwda

Si vous n'avez pas d'instruction SWITCH dans votre version Excel (antérieure à 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

Il fonctionne exactement comme prévu, un remplacement immédiat par exemple pour la fonction SWITCH de Google Spreadsheet.

Syntaxe:

=SWITCH(selector; [keyN; valueN;] ...  defaultvalue)

  • le sélecteur est une expression comparée aux touches.
  • key1, key2, ... sont des expressions comparées au sélecteur
  • valeur1, valeur2, ... sont des valeurs qui sont sélectionnées si le sélecteur est égal à la clé correspondante (uniquement)
  • 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, puis copiez le code dans l'éditeur. Vous devez enregistrer sous forme de classeur Excel prenant en charge les macros (xlsm).

0
gaborsch

Si vous utilisez Office 2019 ou Office 365, il existe une nouvelle fonction qui agit de manière similaire à une fonction CASE appeléeIFS. Voici la description de la fonction de la documentation de Microsoft:

La fonction IFS vérifie si une ou plusieurs conditions sont remplies et renvoie une valeur qui correspond à la première condition TRUE. IFS peut remplacer plusieurs instructions IF imbriquées et est beaucoup plus facile à lire avec plusieurs conditions.

Un exemple d'utilisation suit:

=IFS(A2>89,"A",A2>79,"B",A2>69,"C",A2>59,"D",TRUE,"F")

Vous pouvez même spécifier un résultat par défaut:

Pour spécifier un résultat par défaut, entrez TRUE pour votre argument final logical_test. Si aucune des autres conditions n'est remplie, la valeur correspondante sera renvoyée.

La fonctionnalité de résultat par défaut est incluse dans l'exemple ci-dessus.

Vous pouvez en savoir plus à ce sujet sur Documentation de support de Microsoft

0
David Silverthorn