Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 Identifier les personnes qui ont fait les opérations dans une commande

lestoiles1

XLDnaute Occasionnel
Bonjour j'ai besoin d'identifier les personnes (OPERATEURS) qui ont fait les opération dans une commande .
N.B: la commande est identifié par sa code commande .

Merci déjà pour votre aide

Lestoiles1
 

Pièces jointes

  • Book1.xlsx
    45.5 KB · Affichages: 12
Solution
Bonjour le forum,

Dans ce fichier (2) les matricules en doublon sont supprimés avec le Dictionary :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim commande, tablo, d As Object, i&, resu(), source, lig&, s, ub%, a(), j%
commande = [C4]
'---liste sans doublon---
tablo = [A25].CurrentRegion.Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For i = 3 To UBound(tablo) - 1
    d(tablo(i, 1)) = i - 2 'mémorise la ligne
Next i
'---tableau des résultats---
ReDim resu(1 To UBound(tablo) - 3)
source = Sheets("Details").UsedRange.Resize(, 8) 'matrice, plus rapide
For i = 2 To UBound(source)
    If d.exists(source(i, 6)) Then
        If...

tbft

XLDnaute Accro
=PETITE.VALEUR(SI((H3:H390=768)*(F3:F390="MCL");B3:B390);LIGNE(S27:S39)-LIGNE(S$26))
mais j'ai encore les doublons...

Issue d'un ancien poste

encore merci à @JHA pour son aide à l'époque.
Je me demande si il ne pourrait pas intervenir....
 

job75

XLDnaute Barbatruc
Bonjour lestoiles1, tbft,

Formule matricielle en M27 :
Code:
=SIERREUR(PETITE.VALEUR(SI((Details!$F$3:$F$1000=$A27)*(Details!$H$3:$H$1000=$C$4)*NON(NB.SI($L27:L27;Details!$B$3:$B$1000));Details!$B$3:$B$1000);1);"")
A valider par Ctrl+Maj+Entrée et tirer à droite et vers le bas.

Adapter la limite $1000 au tableau source.

A+
 

Pièces jointes

  • Book(1).xlsx
    48.1 KB · Affichages: 8

fanch55

XLDnaute Barbatruc
Bonjour à tous,
Sinon par macro à mettre dans un module :
Mais la formule de @job75 est efficace et appropriée même s'il faut une colonne tampon de plus ( ne pas oublier de ne pas détruire ...) , de plus c'est instantané ...
VB:
Sub Test()
Application.ScreenUpdating = False
  
    Dim Source_Folder 'As ADODB.Connection
    Dim Source_Filtre 'As ADODB.Recordset
    Sql_Driver = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
                    "DBQ=" & ThisWorkbook.FullName & ";READONLY=FALSE"
  
    Worksheets("768").Activate
    Set Source_Folder = CreateObject("ADODB.Connection")
        Source_Folder.Open Sql_Driver
        Set Source_Filtre = CreateObject("ADODB.Recordset")
            Source_Filtre.ActiveConnection = Source_Folder
            For R = 27 To 38
                Columns("L:R").Rows(R).ClearContents
                Source_Filtre.Open _
                    "Select distinct Matricule from [Details$B1:P390] " & _
                    " where Commande=" & [C4] & " and Operation = '" & Cells(R, 1) & "'"
                If Err = 0 Then
                    If Not Source_Filtre.EOF Then
                        Tb = Source_Filtre.GetRows
                        Cells(R, "L").Resize(, UBound(Tb, 2) + 1) = Tb
                    End If
                End If
                Source_Filtre.Close
            Next
        Set Source_Filtre = Nothing
        Source_Folder.Close
    Set Source_Folder = Nothing
      
End Sub
Nota: développement rapide, code à optimiser ...
 

job75

XLDnaute Barbatruc
Bonjour fanch55, le fil,

Je n'aurais pas pensé à utiliser la méthode ADO puisqu'on reste sur le même fichier.

Et en effet le code est court, seul inconvénient l'exécution prend plus de temps.

En tout cas par rapport à cette solution plus classique :
VB:
Private Sub Worksheet_Activate()
Worksheet_Change ActiveCell 'lance la macro
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim commande, tablo, d As Object, i&, resu(), source, lig&, matricule, s, ub%, a(), j%
commande = [C4]
'---liste sans doublon---
tablo = [A25].CurrentRegion.Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For i = 3 To UBound(tablo) - 1
    d(tablo(i, 1)) = i - 2 'mémorise la ligne
Next i
'---tableau des résultats---
ReDim resu(1 To UBound(tablo) - 3)
source = Sheets("Details").UsedRange.Resize(, 8) 'matrice, plus rapide
For i = 2 To UBound(source)
    If d.exists(source(i, 6)) Then
        If source(i, 8) = commande Then
            lig = d(source(i, 6))
            matricule = source(i, 2)
            If InStr(resu(lig) & Chr(1), Chr(1) & matricule & Chr(1)) = 0 Then _
                resu(lig) = resu(lig) & Chr(1) & matricule
        End If
    End If
Next i
'---restitution---
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
With [L27].Resize(UBound(resu))
    .Resize(, Columns.Count - .Column + 1).ClearContents 'RAZ
    For i = 1 To UBound(resu)
        s = Split(Mid(resu(i), 2), Chr(1))
        ub = UBound(s)
        If ub > -1 Then
            ReDim a(ub)
            For j = 0 To ub
                If IsNumeric(s(j)) Then a(j) = CDbl(s(j)) Else a(j) = s(j)
            Next j
            tri a, 0, ub
            .Cells(i).Resize(, ub + 1) = a
        End If
    Next i
End With
Application.EnableEvents = True 'réactive les évènements
End Sub

Sub tri(a, gauc, droi) ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub
A+
 

Pièces jointes

  • Book VBA(1).xlsm
    59.5 KB · Affichages: 7

job75

XLDnaute Barbatruc
Bonjour le forum,

Dans ce fichier (2) les matricules en doublon sont supprimés avec le Dictionary :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim commande, tablo, d As Object, i&, resu(), source, lig&, s, ub%, a(), j%
commande = [C4]
'---liste sans doublon---
tablo = [A25].CurrentRegion.Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For i = 3 To UBound(tablo) - 1
    d(tablo(i, 1)) = i - 2 'mémorise la ligne
Next i
'---tableau des résultats---
ReDim resu(1 To UBound(tablo) - 3)
source = Sheets("Details").UsedRange.Resize(, 8) 'matrice, plus rapide
For i = 2 To UBound(source)
    If d.exists(source(i, 6)) Then
        If source(i, 8) = commande Then
            lig = d(source(i, 6))
            resu(lig) = resu(lig) & Chr(1) & source(i, 2)
        End If
    End If
Next i
'---restitution---
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
With [L27].Resize(UBound(resu))
    .Resize(, Columns.Count - .Column + 1).ClearContents 'RAZ
    For i = 1 To UBound(resu)
        s = Split(Mid(resu(i), 2), Chr(1))
        ub = UBound(s)
        If ub > -1 Then
            ReDim a(ub)
            d.RemoveAll 'RAZ
            For j = 0 To ub
                If d.exists(s(j)) Then s(j) = "" Else d(s(j)) = "" 'supprime les doublons
                If IsNumeric(s(j)) Then a(j) = CDbl(s(j)) Else a(j) = s(j)
            Next j
            tri a, 0, ub
            .Cells(i).Resize(, ub + 1) = a
        End If
    Next i
End With
Application.EnableEvents = True 'réactive les évènements
End Sub
C'est peut-être un peu plus rapide mais ce n'est pas sûr.

Edit : testé ce fichier (2) => 6,4 millisecondes, fichier (1) post #13 => 4,8 millisecondes.

A+
 

Pièces jointes

  • Book VBA(2).xlsm
    59.6 KB · Affichages: 6
Dernière édition:

lestoiles1

XLDnaute Occasionnel
Merci beaucoup pour ton aide, est-ce qu'on peut mettre les quantités à cotés car j'ai inséré une colonne de quantité , ça ne marche pas. je connais la formule mais ton vba ne me permet pas d'inserer une colonne "quantité".
 

Pièces jointes

  • Book VBA(1).xlsm
    57 KB · Affichages: 1

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…