Extraction de données

Bonjour chers tous et toutes.
Dans le fichier joint, j'ai deux plages de cellules qui portent des chiffres: une plage grise et une jaune. Dans la colonne J, j'ai déterminé le nombre de chiffres de la plage grise qui ne sont pas en jaune. Si ne nombre est inférieur à 3, je veux positionner automatiquement les chiffres correspondant dans les colonnes K, L, M, N. Exemple en K5 et L5. Merci pour votre aide.
salutations cordiales.
26classeurkl.xlsx (10.27 Ko)

Bonjour,

Sauf erreur de ma part, voici une solution dont le code selon moi est un peu lourd

17classeurkl.xlsm (21.96 Ko)
Bonjour Jacky. Merci pour votre réponse. Je n'ai pas remarqué la lourdeur du code, mais ce code ne semble pas fonctionner. Il a même changé le contenu initial du classeur. Merci pour la disponibilité.
cordialement !

En effet je me suis rendu compte d'une grosse erreur de ma part
Je corrigerai cela dans le courant d l'après midi
Par contre je dois analyser 7 valeur de ton tableau et les inscrire dans le deuxième tableau qui ne peut en contenir que 5 ? Est ce logique ?
A+

J'ai modifié plus vite que je le pensais
Est ce que cette fois ci ça fonctionne

11classeurkl.xlsm (21.70 Ko)

J'ai oublié de supprimer la ligne "MsgBox valeur"

bonjour

au plus simple

cordialement

17lamech.xlsx (12.15 Ko)

bonjour Lamech79, salut Jacky

@Jacky, un défi ..., vous le comprenez ?

19classeurkl.xlsm (27.03 Ko)

EDIT : bonjour tulipe-4

Je viens de voir les formules matricielles de Tulipe_4. Ça fonctionne parfaitement.
Maintenant, il va falloir que je prenne du bon miel pour que mon petit cerveau puisse pénétrer ces formules matricielles d'un niveau avancé. Merci à mon cher fanatique. Que Dieu bénisse encore un peu plus ton cerveau.
cordialement !

Bonjour Bart,

Oui je comprends et même plus je capitule devant cette "oeuvre"
Je ne me sens pas encore capable d'en faire autant, bravo
Bon week-end Bart et à Bientôt

une autre formule, plus lisible ?

=

=SI(OU($J4>3;K$2>$J4);"";
INDEX(4:4;
AGREGAT(15;6;
COLONNE($B$3:$H$3)/
(($B4:$H4<>"")*(NB.SI($Q$2:$W$2;$B4:$H4)=0));
K$2)))
10lamech.xlsx (12.41 Ko)
Merci Bart/ BsAlv. Je ne sais pas si c'est le même pseudo. Le post est de BsAlv. La nouvelle formule marche aussi très bien.
je vais prendre le temps de disséquer ces deux formules et retenir le plus digeste. Merci à vous deux Bart et Tulipe. Merci à Excel-pratique.
A bientôt.

=SI(OU($J4>3;K$2>$J4);""; = on a +3 chiffres non-conformes ou on a déjà traité toutes les chiffres non-conformes

INDEX(4:4;' = on prend dans la ligne 4

AGREGAT(15;6; '= la Petite.valeur "x" sans erreurs

COLONNE($B$3:$H$3)/ = les colonnes B à H

(($B4:$H4<>"")*(NB.SI($Q$2:$W$2;$B4:$H4)=0)); = auront un 1 (donc causent pas une erreur, les valeurs non-vides qui sont non-conformes, les autres sont 0, donc divisé par 0 = erreur = sont ignorés

K$2))) = ici le "x" de la petite.valeur

=SI(OU($J4>3;K$2>$J4);""; = on a +3 chiffres non-conformes ou on a déjà traité toutes les chiffres non-conformes

INDEX(4:4;' = on prend dans la ligne 4

AGREGAT(15;6; '= la Petite.valeur "x" sans erreurs

COLONNE($B$3:$H$3)/ = les colonnes B à H

(($B4:$H4<>"")*(NB.SI($Q$2:$W$2;$B4:$H4)=0)); = auront un 1 (donc causent pas une erreur, les valeurs non-vides qui sont non-conformes, les autres sont 0, donc divisé par 0 = erreur = sont ignorés

K$2))) = ici le "x" de la petite.valeur

bonsoir

tout tourne autour de çà

NB.SI($Q$2:$W$2;$B4:$H4) qui renvoie des 1 et des 0

cordialement

Merci, à vous deux pour les explications détaillées.
je me donne à moi même l'exercice dans l'autre sens avec les mêmes données. Je vous reviens bientôt.
Bonjour Tulipe. Une dernière question.
Pourquoi la fonction Grande.valeur ? Pourquoi colonne(A:A) comme indice ? Merci.
Cordialement.

bonjour

GRANDE.VALEUR c'est pour les extraire /trier /classer 1par 1 en decroissant , ce qui permet de faciliter la fonction en reléguant les 0 vraiment en dernier

la partie Colonne(A:A) indique un n° d'ordre de grande.valeur , ainsi en tirant vers la droite , colonne A:A devient colonne B:B soit 1,2,3............

COLONNE () comme LIGNE() sans S , malgré les apparences trompeuses ne concernent en rien la colonne ou ligne traitée ,,, c' est tout simplement un outil pour éditer un nombre (1;2;3;...................)

cordialement

Bonjour à tous !

Pour le fun, une approche Power Query :

image

EDIT : Version optimisée !

Merci Tulipe.
bon week-end !

Salut Lamech,
Salut les as,

et pour le fun, surtout un premier "exercice" DICO pour moi, une solution VBA.

image

Un double-clic sur une cellule de l'en-tête en orange démarre la macro pour un affichage correspondant au chiffre sélectionné.

    For x = 1 To UBound(tTab, 1)
        Dic.RemoveAll
        For y = 1 To 2
            For Z = 1 To 7
                If y = 1 Then _
                    Dic(tData(1, Z)) = Dic(tData(1, Z)) + 1: _
                    If IsNumeric(tTab(x, Z)) Then Dic(tTab(x, Z)) = Dic(tTab(x, Z)) + 1
                If y = 2 Then _
                    If Dic(tTab(x, Z)) = 1 And Range("J" & 2 + x).Value <= iIdx Then _
                        Cells(2 + x, Cells(2 + x, Columns.Count).End(xlToLeft).Column + 1) = tTab(x, Z)
            Next
        Next
    Next

A+

9lamesh.xlsm (20.50 Ko)

re,

@Curulis57 et en essayant d'utiliser la même méthode, une variante

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
     '
     Dim Dic, tTab, tData, iIdx%
     '
     Cancel = True
     Set Dic = CreateObject("scripting.dictionary")
     Dic.comparemode = vbTextCompare
     tData = [REF].Cells.Value
     tTab = Range("B3:H11").Value
     '
     If Not Intersect(Target, Range("K2:O2")) Is Nothing Then
          iIdx = Target
          Range("K3:O11").ClearContents
          Range("K3:O11").Interior.ColorIndex = xlColorIndexNone
          Range("K3").Resize(9, iIdx).Interior.Color = RGB(50, 200, 50)
          For x = 1 To UBound(tTab, 1)
               Dic.RemoveAll
               For i = 1 To UBound(tData, 2): Dic(tData(1, i)) = vbEmpty: Next     'ajouter les tDatas
               N = Dic.Count                 'nombre de ces tDatas uniques

               For i = 1 To UBound(tTab, 2)
                    If tTab(x, i) <> "" Then Dic(tTab(x, i)) = vbEmpty
               Next                          'ajouter les dTabs

               For i = N To 1 Step -1: Dic.Remove Dic.keys()(i - 1): Next     'supprimer les (premiers) tDatas (séquence reverse !)

               If Dic.Count <= iIdx Then
                    For i = 1 To Dic.Count
                         Cells(2 + x, 10 + i) = Dic.keys()(i - 1)
                    Next
                    'Cells(2 + x, 11).Resize(, Dic.Count) = Dic.keys     'sinon, en 1 fois
               End If
          Next
     End If                                  '
End Sub
Rechercher des sujets similaires à "extraction donnees"