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

22recherche.xlsx (11.67 Ko)

Bonjour,

Une proposition à étudier.

Cdlt.

16darjelling-v1.xlsm (25.11 Ko)
capture

Bonjour et bienvenue sur le forum

Bonjour Jean Eric

Un essai qui répond strictement à la demande.

Bye !

30recherche-v1.xlsm (19.83 Ko)

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

Rechercher des sujets similaires à "afficher donnees plage colonne doublons"