Recomposer un tableau selon critère
Bonjour à tous,
Je viens vous voir aujourd'hui avec un tableau capricieux.
Je dispose d'un tableau propre (capricieux).
Mais j'ai un soucis... c'est que ce tableau tel qu'il a était conçu, représente 2 dimensions qui se chevauchent, super pratique pour faire des tris.
Pour expliquer :
L'unité du tableau, c'est le document, à absolument conserver. Il est exprimé en ligne, en bleue claire.
Ce sont les champs en police rouge qui concernent le document et qui sont absolument à conserver.
La dimension chevauchante, ce sont les individus présents dans le document. Ils sont étiquetés par une clé de filtre "Oui (je garde)", "Non (je dégage)", et ils ont des champs qui les concernant "noms 1 à 8".
Globalement, ce que je souhaiterais, c'est uniquement supprimer les individus dont le filtre est "Non"...
- Tout en conservant intacte ma ligne document et ses champs rouges,
- Tout en conservant les individus marqués "Oui" et leurs champs "noms 1 à 8",
- Tout en dégageant les individus marqués"Non" et leurs champs "noms 1 à 8",
- Gérer une exception lorsque l'individu "Non" se situe pile sur la ligne bleue, pour supprimer uniquement les champs de l'individu, et faire remonter en face du document les individus "Oui".
- Tout en gardant cette structure de "Pack-ligne", document par document.
- Tout en exécutant le programme sur 150 + documents.
Une image vaut mieux que mille mot, un superbe fichier en exemple.
J'exprime toute ma sollicitude à celui qui aurait une solution à me proposer.
Klin89, gmb, R@chid, pitié...
Alors j'ai fais mes devoirs, voici déjà les programmes que j'ai utilisé pour structurer le tableau pour l'analyse finale. Malheureusement j'ai produis mes analyses sur un tableau filtrer "oui" "non" ce qui a bien sur tout décallé... donc tout est faux.
NB : à mon avis faire le 1er travail (supprimer les individus "Non") n'est pas compliqué lorsqu'ils sont sous la ligne bleue, en revanche, c'est plus chiant quand ils sont pile dessus, car il faut faire remonter le tout...
Option Explicit
Sub inserer_une_ligne_chaque_fois__change_pack()
Dim i As Long
Application.ScreenUpdating = False
Application.Calculation = xlManual
With Worksheets("Feuil1") 'Nom de feuille à adapter
For i = .Range("A" & Rows.Count).End(xlUp).Row To 10 Step -1
If .Range("A" & i).Value <> "" Then
.Range("A" & i).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
End If
Next i
End With
Application.Calculation = xlAutomatic
End Sub
Option Explicit
Dim ln&, lgn&, derln&, derCol&, j&, k&, t&
Sub Recompresser_document_en_pack_sur_1_seule_ligne()
'lnD = 2
lgn = 2
derln = 1
derCol = Cells(1, 1).End(xlToRight).Column
Range(Cells(2, 10), Cells(Cells(Rows.Count, 10).End(xlUp)(2).Row, derCol + 9)).ClearContents 'préciser le # de la colonne de sortie du tableau, la différence entre le # de la dernière colonne et le numéro de la dernière colonne du 1er tableau
For j = 2 To derCol
If Cells(Rows.Count, j).End(xlUp).Row > derln Then
derln = Cells(Rows.Count, j).End(xlUp).Row
End If
Next j
For ln = 2 To derln
k = 0 ': t = 0
Range("J" & lgn) = Range("A" & ln + k) ' préciser la colonne de sortie du tableau, équivalent "lettre" du rang exprimé plus haut (J = 10)
Do While Range("A" & ln + 1 + k) = "" And ln + 1 + k <= derln + 1
For j = 2 To derCol
If Cells(ln + 1 + k, j) <> "" Then
Cells(lgn, j + 9) = Cells(lgn, j + 9) & Cells(ln + k, j) & ";" 'marquer ici le résultat de la différence vu plus haut
Else
Cells(lgn, j + 9) = Cells(lgn, j + 9) & Cells(ln + k, j) 'marquer ici le résultat de la différence vu plus haut
End If
Next j
't = t + 1
k = k + 1
Loop
ln = ln + k
lgn = lgn + 2
Next ln
End Sub
sub degager_tous_les_espaces_()
For Each cellule In ActiveSheet.UsedRange
cellule.Value = LTrim(cellule.Value)
Next
end sub
'' =SUPPRESPACE(A2)
Sub dedoublonnage_dans une cellule_,_()
Dim Dico, c As Range
Set Dico = CreateObject("Scripting.Dictionary")
On Error Resume Next
For Each c In Range("A1", Range("A65536").End(xlUp))
tablo = Split(c, ",")
For Each Item In tablo
Item = Application.Trim(Item)
Dico.Add Item, ""
Next Item
c = ""
For Each k In Dico.keys
c = c & ", " & k
Next
c = Left(Right(c, Len(c) - 2), Len(c) - 2)
For Each k In Dico.keys
Dico.Remove k
Next
Next c
End Sub
Sub decliner_noms_colonne()
Dim feuilleSource As Worksheet
Dim feuilleCible As Worksheet
Dim iSource, iCible, i As Integer
Dim currentA, currentB As String
Dim currentSplit() As String
Set feuilleSource = Worksheets(2) 'A modifier, la feuille contenant les données originales
Set feuilleCible = Worksheets(3) 'A modifier, la feuille où l'on veut le résultat
'Initialisation des compteurs de lignes
iSource = 1
iCible = 1
Do While feuilleSource.Cells(iSource, "A").Value <> "" 'Tant qu'il y a qq chose en colonne A
currentA = feuilleSource.Cells(iSource, "A").Value
currentB = feuilleSource.Cells(iSource, "B").Value
'On décompose la chaine par les virgules
currentSplit = Split(currentB, ",")
'Pour chaque élément, on l'écrit dans la feuille cible
For i = 0 To UBound(currentSplit)
feuilleCible.Cells(iCible, "A").Value = currentA
feuilleCible.Cells(iCible, "B").Value = LTrim(currentSplit(i)) 'En enlevant les espaces à gauche
iCible = iCible + 1
Next i
iSource = iSource + 1
Loop
End Sub
Sub dedoublonnage_noms()
Range("A1", "B5000").RemoveDuplicates Columns:=Array(1)
End Sub
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonsoir,
Si j'ai bien compris, on veut supprimer toutes les lignes à "Non", sauf les lignes de titre.
Ci-joint une proposition à tester.
On copie en bloc dans l'onglet "Arrivée"
Et on balaie de haut en bas.
Si ligne de titre, on continue à descendre
Sinon, on supprime la ligne s'il y a un non.
Cela me semble trop simple pour être le résultat souhaité
Bonne soirée
Bouben
Merci Bouben pour ta réponse.
NB : fichier joint pour + explications.
Tu as tout bon en effet, sauf dans le cas où le critère "non" est sur la ligne bleue.
En fait, le soucis de ce tableau c'est qu'il est hyper mal foutu et que je l'ai récupéré ainsi, de façon pas du tout ergonomique...
Je ne peux pas non plus le modifier car j'ai programmer tout son traitement sur des opérations ultérieures à partir de cette structure.
En fait il y a :
- une ligne relative au document (en bleue).
- une ligne relative à 1 individu dans le document (en vert).
C'est comme une équipe de foute quoi, la ligne bleue c'est l'équipe, le vert c'est l'équipe, joueur par joueur.
Y'a des champs d'informations sur l'équipe et des champs d'informations sur les joueurs.
Le soucis c'est que y'a un joueur, qui est à cheval sur la ligne équipe, à chaque fois.
Je souhaiterais dégager tous les joueurs marqués au filtre "non" (colonne A) et par la même leurs infos, tout en conservant tout le reste de la mise en forme, donc l'équipe et ses infos, et les joueurs marqués "oui" et leurs infos.
Ta solution marche bien pour cela, sauf si je rencontre un paquet où le joueur à dégager est sur la ligne "équipe".
Merci.
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonsoir,
Effectivement, c'est plus compliqué
Ci-joint une nouvelle version à tester.
Bonne soirée
Bouben
Ca marche super ton truc là...
Alors, juste un défaut :
- Il reste certains reliquats "Non", non supprimés, car certains ont tous les champs remplis et d'autres non.
Ton programme supprime super bien tous les "NON" lorsqu'ils ont tous leur champs rempli.
Il ne supprime pas ceux qui n'ont qu'un champ de rempli ou deux ou trois etc.
Est-ce-que tu peux faire en sorte que quelque soit le nombre et la position du champs rempli sur le joueur en "Non", toute sa ligne saute ?
Exemple dans le fichier joint.
Argh, le fichier
Ugh.
Après test,
Ta solution fonctionne parfaitement.
J'ai abandonné d'adapter ta macro à mon fichier, du coup j'ai plutôt apporter mes données dans ton fichier de macro, à la suite de mes exemples.
En supprimant des données volontairement pour déclencher l'erreur de champs "non remplis" comme je l'anticipais, ta macro exécute quand même très bien son objectif.
Jusque là je vois pas de mal fonctionnement. C'est en plus très bien de n'avoir distingué que "non" et le reste, car j'ai aussi des catégories autres que "oui", mais que je garde.
Je reviens si y'a un soucis, mais ca a l'air de très bien fonctionner.
Merci beaucoup.
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonjour,
Super ! Alors on reste là-dessus
Bonne journée
Bouben