Monsieur Excel
Pour tout savoir faire sur Excel !

16 février 2011

Des conseils parfois améliorables…

Je suis parfois surpris, en consultant les réponses données sur des sites d’assistance pour Excel, de voir quelles sont les réponses proposées aux lecteurs…

Dans l’exemple ci-dessous, vous avez dans le bloc B2:G8 des « 1 » qui apparaissent à divers endroits. L’objectif est de retrouver dans le bloc J2:L6 les numéros d’identification correspondant aux colonnes dans lesquelles on trouver le premier « 1 », puis le second, et enfin le troisième.

La solution proposée consiste à créer une colonne intermédiaire (la colonne I) dans laquelle on regroupe les identifiants de toutes les colonnes contenant un « 1 », grâce à la formule suivante, entrée en I2 et reproduite vers le bas :

=si(B2=1;B$1;"")&si(C2=1;C$1;"")&si(D2=1;D$1;"")&si(E2=1;E$1;"")&si(F2=1;F$1;"")&si(G2=1;G$1;"")

Les formules des cellules des colonnes J à L sont reproduites dans la copie d’écran ci-dessus.

Tout cela me semble hélas bien compliqué…

Je peux vous proposer de détruire la colonne I ci-dessus et d’entrer dans la nouvelle cellule I2, en la recopiant ensuite en I2:K6, la formule :

=si(nb($B2:$G2)>colonne()-9;H2+equiv(1;decaler($A2;0;H2+1):$G2;0);"")

Remarque 1 – Plus besoin d’une colonne intermédiaire comme la colonne I de la première solution ! En outre, avantage non négligeable, il y a la même formule dans tout le bloc I2:K6 !

Remarque 2 – Notez l'utilisation de la fonction decaler() pour déplacer le point de départ du vecteur de recherche : vous avez là une fonctionnalité vraiment très puissante !

4 Commentaire(s):

  • Il existait autrefois (!) un langage nommé APL qui disposait du très pratique opérateur "compression", représenté par un slash (/) :
    1 0 0 1/1 2 3 4 donnait le résultat 1 4. C'est exactement notre problème ici.
    Si ça peut intéresser certains de vos lecteurs voici la Function VBA correspondante :
    Function compression(compresseur As Range, compressé As Range)
    Dim intI As Integer
    Dim intS As Integer
    Dim Z()
    Application.Volatile
    ReDim Z(Selection.Cells.Count)
    If LBound(Z) = 0 Then ReDim Z(UBound(Z) - 1)
    intS = LBound(Z) - 1
    For intI = 1 To compresseur.Cells.Count
    If compresseur.Cells(intI).Value = 1 Then
    intS = intS + 1
    Z(intS) = compressé.Cells(intI).Value
    End If
    Next intI
    compression = Z
    End Function


    Dans l'exercice, en I2:K2, on peut écrire la formule matricielle :
    {=compression(B2:G2;$B$1:$G$1)} recopiable telle quelle sur les autres lignes.

    By Anonymous cduigou, sur 2:08 PM  

  • APL est en effet le langage le plus compact que j'aie jamais vu. Il permettait de faire un grand nombre de choses avec peu d'instructions.

    L'inconvénient c'est que, plus un langage informatique est "compact" et donc rapide pour écrire un programme, plus il est difficile à lire. Un programmeur APL, relisant son code quelques mois plus, pouvait ne plus comprendre ce qu'il faisait.

    A l'autre extrême, un langage comme Ada était très pénible pour l'écriture de programme, mais en revanche la lecture en était d'autant plus facile.

    Autant que je le sache, on n'a jamais réussi à résoudre ce dilemme : plus un langage est rapide dans l'écriture, plus il est difficile à lire, et par conséquent plus la maintenance des programmes est difficile...

    By Blogger Hervé Thiriez, sur 7:28 PM  

  • Ce commentaire a été supprimé par l'auteur.

    By Blogger Stefyu Thechosenone, sur 2:47 AM  

  • Ce commentaire a été supprimé par l'auteur.

    By Blogger Stefyu Thechosenone, sur 2:51 AM  

Enregistrer un commentaire

<< Accueil