[Résolu] Comparer deux colonnes - difficulté d'exécution

Discussions à propos du tableur Calc.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

Règles du forum
Cette section est uniquement dédiée au tableur Calc. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
martinterrier
Membre OOrganisé
Membre OOrganisé
Messages : 97
Inscription : 21 avr. 2021 19:28

[Résolu] Comparer deux colonnes - difficulté d'exécution

Message par martinterrier »

Bonjour à tous,

J'ai tenté de reproduire la solution proposée dans : https://forum.openoffice.org/fr/forum/v ... hp?t=17697

mais je ne parviens pas à en comprendre le fonctionnement, qui doit pourtant être simple.

Je cherche à savoir si l'un des numéros de la liste B se trouve dans la liste A. Pourtant, ma cellule D2 renvoie "FAUX" (que je comprends comme "contenu de B2 non trouvé sur la plage A2-A6550) alors que la cellule A550 contient bien le même nombre que la cellule B2 et devrait donc renvoyer "VRAI".

Il doit s'agir de quelque chose d'évident, mais je ne parviens pas à comprendre cette erreur. Cela a peut être à voir avec le passage en "formule matricielle", que je ne comprends pas.

Je vous remercie pour votre aide - fichier en pj.

Bon après-midi!
Pièces jointes
comparaison.ods
(38.71 Kio) Téléchargé 49 fois
Dernière modification par martinterrier le 31 août 2021 17:48, modifié 1 fois.
Obligation de version :
Libre Office 7.1.8.1 (x64) sous Windows 10
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 5733
Inscription : 03 janv. 2009 00:56

Re: Comparer deux colonnes - difficulté d'exécution

Message par Jean-Louis Cadeillan »

Bonjour,
Que peux-tu attendre d'une fonction OU() avec un seul argument ?
Quelques solutions possibles :

Code : Tout sélectionner

=SOMME($B2=$A$2:$A$550)>0
formule matricielle

Code : Tout sélectionner

=NB.SI($A$2:$A$550;$B2)>0
formule non matricielle

Code : Tout sélectionner

=MAX(B2=$A$2:$A$550)
formule matricielle

Code : Tout sélectionner

=SOMMEPROD(B2=$A$2:$A$550)
formule matricielle, mais à valider simplement par Entrée.
Voir ci-joint.
Cordialement,
Jean-Louis
Pièces jointes
martinterrier_20210831_JLC01.ods
(41.38 Kio) Téléchargé 47 fois
LibO 7.6.5.2 (x64 avec Java 1.8.0_401) et AOO 4.1.15 (avec Java x32 1.8.0_381), Windows 7 Édition Intégrale 64 SP1
martinterrier
Membre OOrganisé
Membre OOrganisé
Messages : 97
Inscription : 21 avr. 2021 19:28

Re: Comparer deux colonnes - difficulté d'exécution

Message par martinterrier »

Bonjour Jean-Louis,

Cela fonctionne bien, merci. J'ai repris la fonction OU() du sujet que je cite dans mon premier message, je n'avais pas conscience de l'absence d'argument dans la formule!

Par ailleurs, je n'arrive pas à comprendre la différence entre formule matricielle et non matricielle : qu'est-ce que cela veut dire et quelles sont les conséquences pratiques de l'usage de l'une ou de l'autre de ces sortes de formules?

Merci!
Bonne fin de journée!
Obligation de version :
Libre Office 7.1.8.1 (x64) sous Windows 10
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 5733
Inscription : 03 janv. 2009 00:56

Re: Comparer deux colonnes - difficulté d'exécution

Message par Jean-Louis Cadeillan »

Voir ce tuto qui détaille SOMMEPROD() mais aussi l'usage des fonctions matricielles.
Une formule matricielle va pouvoir traiter des plages de cellules en entrée (pour chacun des arguments le nécessitant) et éventuellement donner des plages de cellules en sortie. Le fait de valider par Ctrl+Maj+Entrée va forcer les arguments qui ne sont pas nativement matriciels à travailler comme tel.

Formule 1 :

Code : Tout sélectionner

=SOMME($B2=$A$2:$A$550)>0
L'opérateur égal fonctionne nativement sur deux valeurs, pas des plages de cellules. Si je saisis dans une cellule

Code : Tout sélectionner

=$B2=$A$2:$A$550
puis Entrée, le résultat sera FAUX, car B2<>A2, l'opérateur n'aura traité que la première valeur de la plage $A$2:$A$550.
Par contre si je valide la même formule par Ctrl+Maj+Entrée, la formule en sortie me fournit une plage de 549 valeurs de FAUX ou de VRAI, selon l'égalité ou non de B2 avec A2:A550. C'est cette plage de sortie que SOMME() va traiter. Comme 0 correspond à FAUX et toute autre valeur positive à VRAI, si ma somme est supérieure à 0, alors il y a au moins une égalité entre B2 et les 549 cellules de la plage A2:A550.

Formule 2 :

Code : Tout sélectionner

=NB.SI($A$2:$A$550;$B2)>0
La fonction NB.SI(), nativement, a besoin d'une plage de valeurs comme premier argument, inutile de valider par Ctrl+Maj+Entrée, une validation par Entrée suffit. Cette syntaxe ne force aucun argument à travailler d'une manière autre que native.

Formule 3 :

Code : Tout sélectionner

=MAX(B2=$A$2:$A$550)
La fonction MAX() travaille sur des plages de cellules… mais l'opérateur =, lui ne le fait pas nativement, donc voir l'explication de la Formule 1.

Formule 4 :

Code : Tout sélectionner

=SOMMEPROD(B2=$A$2:$A$550)
SOMMEPROD() est une fonction matricielle, car elle force tous les arguments à travailler en matriciel, même s'ils ne le font pas nativement ; c'est le cas ici de l'opérateur = qui se contenterait de faire la comparaison B2/A2 si SOMMEPROD ne le forçait pas à faire la comparaison multiple B2/A2:A550. Ici, SOMMEPROD() avec un seul argument fonctionne comme SOMME(), mais cette fonction a la particularité de ne pas nécessiter la validation par Ctrl+Maj+Entrée. La formule est même simplifiée par rapport à la formule 1, puisqu'on ne fait même pas la comparaison > 0 (qui n'était d'ailleurs pas nécessaire dans cette formule 1, juste une question de lisibilité). En effet, toute somme > 0 est traitée comme VRAI par l'interpréteur Calc… donc inutile de faire le test > 0 !
 Ajout : Erratum : ce n'était > 1 mais bien > 0 qu'il fallait écrire (corrigé ci-dessus) 
Pour conclure, une fonction (à part SOMMEPROD) ou une formule matricielle se valide pas Ctrl+Maj+Entrée et oblige les parties de la formule, les arguments, à fonctionner en matriciel, même s'ils ne le font pas nativement.
Pour recopier une formule matricielle vers le bas (ou vers la droite) :
  • il suffit de positionner la souris dans le coin inférieur droit de la cellule : le curseur se transforme en croix (+), puis, il faut cliquer/glisser vers le bas (ou vers la droite) tout en appuyant simultanément sur la touche Ctrl ;
  • une autre manière de faire est de copier la cellule initiale (Ctrl+C), puis de sélectionner la plage des cellules qui doivent contenir la même formule, puis de coller (Ctrl+V) ;
  • ces deux manières fonctionnent aussi dans le cas où la formule matricielle initiale occupe une plage de cellules et non une seule cellule : dans ce cas, bien sûr, il faut sélectionner toute cette plage au départ.
Cordialement,
Jean-Louis
Dernière modification par Jean-Louis Cadeillan le 31 août 2021 17:56, modifié 1 fois.
LibO 7.6.5.2 (x64 avec Java 1.8.0_401) et AOO 4.1.15 (avec Java x32 1.8.0_381), Windows 7 Édition Intégrale 64 SP1
martinterrier
Membre OOrganisé
Membre OOrganisé
Messages : 97
Inscription : 21 avr. 2021 19:28

Re: Comparer deux colonnes - difficulté d'exécution

Message par martinterrier »

Eh bien merci beaucoup pour ces explications fouillées qui m'éclairent tout à fait à la fois sur mon problème ponctuel et sur les fonctions matricielles.

Bonne soirée à toi et à une prochaine!
Obligation de version :
Libre Office 7.1.8.1 (x64) sous Windows 10
Verrouillé