Extraction sous condition ?

ff145bv

XLDnaute Junior
Bonjour,

Dans le tableau joint, certaines "classes" ont des lignes cochées. Une classe est en fait toujours formée de 3 colonnes. Quand je parle de ligne pour une classe, je parle donc de 3 cellules contiguës (par exemple les cellules A2, B2 et C2 représentent un seul et même élément de la classe A).

Les lignes sont donc par exemple les lignes 2 et 21 de la classe A, 20 et 31 de la classe B, etc.

J'aimerais (mais je ne parviens pas) à n'extraire de ce tableau que les éléments cochés en les ordonnant dans le sens croissant.

Pour que cette explication soit claire, j'ai fait "à la main" (puisque donc je n'y parviens pas à l'aide de formules ou de macros) le tableau tel que j'aimerais obtenir automatiquement après extraction. Ce tableau est en Feuil2 du document joint.

Comme vous pouvez le voir, certaines classes ont volontairement été omises.

Pourriez-vous m'aider à réaliser ce tableau car je suis complètement dépassé par mon propre problème :eek: ?

Merci d'avance pour vos idées et votre aide.
 

Pièces jointes

  • Classes.xls
    39.5 KB · Affichages: 62
  • Classes.xls
    39.5 KB · Affichages: 66
  • Classes.xls
    39.5 KB · Affichages: 63

bqtr

XLDnaute Accro
Re : Extraction sous condition ?

Bonjour,

Tu peux expliquer comment tu fais ton extraction ?

Le 1er nombre de la classe va toujours sur la linge 1 de la feuille 2, le deuxième sur la ligne correspondant à sa classe.

L'extraction doit se faire quand, La feuille 2 doit-elle être effacée avant chaque extraction.

A te lire.

A+
 

ff145bv

XLDnaute Junior
Re : Extraction sous condition ?

Bonjour bqtr,

Mon extraction idéale correspond tout à fait à ta description.

L'idée est que je rentre moi même les intitulés des lignes (c'est à dire les classes) et que la machine remplit automatiquement le reste.

Pour aller plus loin, je sais d'ores et déjà compléter chaque case du tableau si j'ai les entêtes des lignes (renseignées par moi comme expliqué ci-dessus) et les entêtes des colonnes (c'est LE problème) à l'aide de la fonction RECHERCHEV.

Mon problème, c'est donc de récupérer des entêtes de colonnes dans l'ordre croissant et sans doublons en les extrayant de l'ensemble du tableau de la Feuil1.

Ainsi, par exemple, je ne sais pas gérer le fait que 1711 ou 5648 apparaissent dans plusieurs classes.

A plus tard... et merci pour l'aide que tu pourras m'apporter ! :)
 

bqtr

XLDnaute Accro
Re : Extraction sous condition ?

Re,

Par formule je sais pas, mais pour les entêtes de colonne voici une macro à mettre dans un module de code standard.

Code:
Sub Extraction()

Dim k As Byte, m As Long, Col As Object, Tablo, y As Byte, t As Byte, Temp

Set Col = CreateObject("Scripting.Dictionary")

For k = 1 To Range("IV1").End(xlToLeft).Column Step 3
  For m = 2 To Cells(65536, k).End(xlUp).Row
    If Cells(m, k) = "x" Then
      If Not Col.Exists(Cells(m, k + 1).Value) Then Col.Add Cells(m, k + 1).Value, Cells(m, k + 1).Value
    End If
  Next
Next

Tablo = Col.items

For y = LBound(Tablo) To UBound(Tablo)
  For t = LBound(Tablo) To UBound(Tablo)
      If Tablo(y) < Tablo(t) Then
         Temp = Tablo(y)
         Tablo(y) = Tablo(t)
        Tablo(t) = Temp
      End If
  Next t
Next y

Sheets("Feuil2").Range("B1").Resize(, Col.Count) = Tablo

End Sub

La macro établi une liste des nombres sans doublon puis la met dans un tableau. Ce tableau est trié par ordre croissant et enfin les éléments sont placés sur la feuille 2 ligne 1.

A+
 

abcd

XLDnaute Barbatruc
Re : Extraction sous condition ?

Bonsoir,

Une proposition en pièce jointe pour récupérer par formule (et colonne supplémentaire) les valeurs des en-têtes des colonnes.

abcd
 

Pièces jointes

  • En tetes colonnes.zip
    12.5 KB · Affichages: 29

ff145bv

XLDnaute Junior
Re : Extraction sous condition ?

Re,

Là ça fait tout :D les entêtes et les lignes.

A+

C'est vraiment impressionnant !

En toute sincérité, je suis bluffé par l'efficacité et la propreté de ton codage (et en toute humilité car je n'en comprends pas la moitié).

Puis-je être un tout petit peu casse-pieds encore en précisant que, dans mon tableau originel les infos sont dans une feuille nommée Feuil6 (Brut) tandis que le tableau se trouve dans une feuille nommée Feuil3 (LISTE). Ce tableau bilan occupe les cellules de AK2 à AX14.

J'ai bien copié ton code et inséré un bouton dans ma "Feuil6 (Brut)" après avoir changé la dernière partie de la façon suivante (sans rien toucher au reste de ton codage) :

Sheets("LISTE").Range("AL2").Resize(, Col.Count) = Tablo

l = 2
For k = 1 To Range("IV1").End(xlToLeft).Column Step 3
For m = 2 To Cells(65536, k).End(xlUp).Row
If Cells(m, k) = "x" Then
For j = 2 To Sheets("LISTE").Range("IV1").End(xlToLeft).Column
If Sheets("LISTE").Cells(1, j) = Cells(m, k + 1) Then Sheets("LISTE").Cells(l, j) = Cells(m, k + 2)
Next
End If
Next
l = l + 1
Next

Problème : les entêtes de colonnes apparaissent parfaitement... mais pas l'intérieur des cases.

J'ai donc dû faire une bêtise mais, comme je l'ai dit, je ne comprends pas suffisamment toutes les subtilités de ta programmation pour comprendre où.

Les informations ci-dessus te permettraient-elles de me donner un dernier éclairage ?

Toujours est-il que je te remercie vraiment très sincèrement pour l'aide que tu m'as déjà apportée. :D

A bientôt...
 

ff145bv

XLDnaute Junior
Re : Extraction sous condition ?

Bonsoir,

Une proposition en pièce jointe pour récupérer par formule (et colonne supplémentaire) les valeurs des en-têtes des colonnes.

abcd

Bonsoir abcd,

A son tour, ta réponse est vraiment très intéressante car elle est très complémentaire de celle de bqtr.

Elle fait le travail sans macro mais avec des formules que je ne connaissais pas encore.

Merci beaucoup donc à toi aussi pour cette aide très efficace. ;)
 

bqtr

XLDnaute Accro
Re : Extraction sous condition ?

Re, bonsoir abcd

La fin de la macro modifiée:

Code:
Next y

Sheets("LISTE").Range("AL2:AX14").ClearContents
Sheets("LISTE").Range("AL2").Resize(, Col.Count) = Tablo

l = 3
For k = 1 To Range("IV1").End(xlToLeft).Column Step 3
  For m = 2 To Cells(65536, k).End(xlUp).Row
     If Cells(m, k) = "x" Then
       For j = 38 To Sheets("LISTE").Range("IV2").End(xlToLeft).Column
         If Sheets("LISTE").Cells(2, j) = Cells(m, k + 1) Then Sheets("LISTE").Cells(l, j) = Cells(m, k + 2)
       Next
     End If
  Next
  l = l + 1
Next

End Sub
L'instruction : Range("IV1").End(xlToLeft).Column te donne le n° de la dernière colonne de la ligne qui est utilisé. ( ici la ligne 1)

La variable j correspond au n° de la colonne, comme tu commences à remplir à partir de la colonne AL2 c'est la colonne 38.

For k = 1 To Range("IV1").End(xlToLeft).Column Step 3 permet de boucler sur les colonnes de la feuille Brut (feuille active) de la 1 à la dernière non vide de la ligne 1 par pas de 3 (colonne 1,4,7,10........34). Petite particularité, tu as fusionné les cellules de la ligne 1 sur la feuille Brut, donc excel considére que la dernière colonne non vide est la 34 et non la 36.

La variable L correspond au n° de la ligne de la feuille LISTE, elle s'incrémente à chaque boucle k. Elle prend comme valeur au début : 3 (ligne qui correspond à la Classe A).

J'ai ajouté l'effacement du tableau : Sheets("LISTE").Range("AL2:AX14").ClearContents
avant chaque nouveau transfert.


A+
 

Discussions similaires

Statistiques des forums

Discussions
312 685
Messages
2 090 931
Membres
104 703
dernier inscrit
romla937