Afficher données plage dans une colonne(sans doublons)
Bonjour.
Je suis actuellement en train de programmer un dossier assez lourd regroupant les salariés d'une entreprise qui travaillent sur
des chantiers.
Chaque chantier a un code analytique que l'on retrouve à la semaine par salarié qui y a travaillé.
Cela me donne une plage de 4 colonnes (4 semaines)sur 70-80 lignes de long (nombres de salariés)avec de nombreux doublons.
exemple imaginaire : le chantier "800" est présent semaine 5-6-7-8 pour 5 salariés différents.
j'aimerai faire une recherche sur cette plage de 4 colonnes sur 80 lignes des différents chiffres utilisés, et les afficher sans doublons dans une colonne a part.
Cela me donnerait d'un coup la totalité des chantiers(par leur numéro) en cours sur la période.
Ci-joint la base (simplifié pour confidentialité) de se que j'aimerai :
(ou en fichier joint)
j'ai testé des rechercheV INDEX avec equiv, mais je dois pour cela tenir une liste de la totalité des nomenclatures a part ce qui me rajoute des feuillets a un fichier en comportant déjà une dizaine.
Merci d'avance pour le temps que vous prendrez a lire ce long message voir a y répondre.
Je vous souhaite une bonne journée et rien que du bonheur
Un jeune excelien en herbe
Bonjour et bienvenue sur le forum
Bonjour Jean Eric
Un essai qui répond strictement à la demande.
Bye !
Bonjour à tous,
Ai-je bien compris la demande
Option Explicit
Sub Liste_Des_Occurences()
Dim a, e, x, n As Long
With Sheets("Feuil1").Range("b4").CurrentRegion
With .Offset(1, 1).Resize(.Rows.Count - 1, .Columns.Count - 1)
a = .Value
End With
With CreateObject("Scripting.Dictionary")
.CompareMode = 1
For Each e In a
If e <> "/" Then .Item(e) = Empty
Next
x = Application.Transpose(.keys)
n = .Count
End With
With .Offset(, .Columns.Count + 2).Resize(n, 1)
.CurrentRegion.ClearContents
.Value = x
End With
End With
End Sub
klin89
Merci tout d'abord pour les réponses qui ont été faites.
l'option de GMB marche effectivement parfaitement.
Bon le soucis c'est que je n'est aucune notion de VBA ni de macro, donc a moi les bouquins pour la suite^^.
a tout hasard, une option sans TCD (je dois garder le résultat dans des cases pour d'autres calculs) et sans programmation, juste avec une formule serait possible?
(je clôture demain le sujet si personne voit de solution juste par formule ^^)
MERCI !
Sub Chantiers()
Set dico = CreateObject("Scripting.Dictionary") (création d'un dictionnaire)
Set tablo = Range("C5:F" & Range("B" & Rows.Count).End(xlUp).Row) (crée la zone a rechercher)
Range("H4").CurrentRegion.Offset(1, 0).ClearContents (vide la zone sous chantier ? )
For Each c In tablo
If Not dico.exists(c.Value) Then
dico(c.Value) = "" (les trois lignes crée une "clé" pour chaque valeur si elle n'existe pas déjà ?)
End If
Next c
Range("H5").Resize(dico.Count) = Application.Transpose(dico.keys)
Range("H5:H" & Range("H" & Rows.Count).End(xlUp).Row).Sort key1:=Range("H5"), order1:=xlAscending, Header:=xlNo
End Sub
j'ai du mal avec la dernière partie, si quelqu'un pouvait me la détailler un peu =/(GMB par exemple ^-^
MERCI !
Darjelling a écrit :j'ai du mal avec la dernière partie, si quelqu'un pouvait me la détailler un peu
Range("H5").Resize(dico.Count) = Application.Transpose(dico.keys)
Le premier membre de l’égalité définit la zone où on va aller coller l’ensemble de la liste contenue dans dico : une plage dont la première cellule sera la cellule H5 et qui aura autant de lignes que dico a de clefs
Le deuxième membre permet de mettre la liste des clefs de dico dans cette zone.
Range("H5:H" & Range("H" & Rows.Count).End(xlUp).Row).Sort key1:=Range("H5"), order1:=xlAscending, Header:=xlNo
Cette instruction, facultative, permet de mettre dans l’ordre croissant les valeurs qu’on vient de coller.
OK ?
d'accord, c'était donc pour l'ordre des données, et pour
"Range("B" & Rows.Count).End(xlUp).Row)"
pourquoi range B ? c'est parce que c'est la colonne qui fait le "bord" du tableau ?
je clôture a ta réponse, encore un grand merci !!! (grâce a toi ma collègue comptable est super heureuse
Darjelling a écrit :"Range("B" & Rows.Count).End(xlUp).Row)" pourquoi range B ?
Cette instruction donne le numéro de la première ligne non vide que l'on trouve en partant du bas de la feuille (vraiment tout en bas)
en colonne B et en remontant, comme si on faisait un Ctrl + flèche vers le haut.
OK ?
Bye !
Merci =) sujet clos !
Re à tous,
Avec un dictionnaire, le même résultat que Jean-Eric
Pour le fun, on peut aussi décliner la structure des données sous différentes formes.
Option Explicit
Sub Nbre_salaries_par_Chantier()
Dim a, b(), i As Long, j As Long, n As Long
With Sheets("Feuil1").Range("b4").CurrentRegion
a = .Value
ReDim b(1 To .Cells.Count, 1 To UBound(a, 2))
End With
n = 1
For i = 2 To UBound(a, 2)
b(1, i) = a(1, i)
Next
b(n, 1) = "Code chantier"
With CreateObject("Scripting.Dictionary")
.CompareMode = 1
For i = 2 To UBound(a, 1)
For j = 2 To UBound(a, 2)
If a(i, j) <> "/" Then
If Not .exists(a(i, j)) Then
n = n + 1
.Item(a(i, j)) = n
b(n, 1) = a(i, j)
End If
b(.Item(a(i, j)), j) = b(.Item(a(i, j)), j) + 1
End If
Next
Next
End With
'Restitution et mise en forme
Application.ScreenUpdating = False
With Sheets("Feuil2")
.Cells.Clear
With .Range("a" & Rows.Count).End(xlUp)(1)
.Value = "Salariés par semaine sur chaque chantier"
.Font.Name = "calibri"
.Font.Size = 12
.VerticalAlignment = xlCenter
With .Offset(1).Resize(n, UBound(b, 2))
.Value = b
On Error Resume Next
.SpecialCells(4).Value = 0
On Error GoTo 0
.Font.Name = "calibri"
.Font.Size = 10
.VerticalAlignment = xlCenter
.BorderAround Weight:=xlThin
.Borders(xlInsideVertical).Weight = xlThin
With .Rows(1)
.Interior.ColorIndex = 44
.BorderAround Weight:=xlThin
End With
.Columns.AutoFit
End With
End With
.Activate
End With
Application.ScreenUpdating = True
End Sub
klin89