re,
c'est ce qu'il se passe, supprimez le contenu de la plage B3:Q5 de récapitulatif, puis changez de feuille et puis revenez sur cette feuille et vous verrez que toutes les cellules sont de nouveau rempli et celles de la colonne P viennent de la feuille "BDC"
Sub Alerte2Recap()
Dim Dict, aA, i, j, t, sh, arr, Reference_PN, it, N
t = Timer
Application.ScreenUpdating = False
Set Dict = CreateObject("scripting.dictionary") 'utliser un dictionaire
Dict.comparemode = vbTextCompare
'****************** PARTIE "FeuilX" *********************************************
For j = 2 To 6
On Error Resume Next
Set sh = Nothing
Set sh = Sheets("Feuil" & j)
On Error GoTo 0
If sh Is Nothing Then
MsgBox "la feuille " & Chr(34) & "feuil" & i & Chr(34) & " n'existe pas !!!", vbCritical
Else
With sh
For i = 3 To .Range("B" & Rows.Count).End(xlUp).Row
If .Range("B" & i) <> "" Then
Reference_PN = .Range("B" & i)
If Not Dict.exists(Reference_PN) Then
ReDim arr(15)
arr(0) = Reference_PN 'reference
arr(1) = .Range("C" & i) 'description
arr(2) = .Range("D" & i) 'quantité
arr(14) = 0 'pour "BDC", RAZ
Dict(Reference_PN) = arr 'écrire vers dictionaire
End If
it = Dict(Reference_PN) 'données de ce reference dans le dictionaire
it(15) = it(15) + .Range("Q" & i) 'cumum des commandes
it(4 + j) = "X"
Dict(Reference_PN) = it 'écraser ses données dans le dictionaire
End If
Next i
'MsgBox i & " " & j
End With
End If
Next
'****************** PARTIE "BDC" *********************************************
With Sheets("BDC")
aA = .Range("G3:G" & .Range("G" & Rows.Count).End(xlUp).Row).Resize(, 2).Value 'contenu des colonnes G:H de "BDC"
End With
For i = 1 To UBound(aA)
If Len(aA(i, 1)) > 0 Then
If Dict.exists(aA(i, 1)) Then
it = Dict(aA(i, 1))
it(14) = it(14) + aA(i, 2) 'cumuler les quantitiés dans le dictionaire
Dict(aA(i, 1)) = it 'écraser ses données dans le dictionaire
End If
End If
Next
'****************** COLLER DANS "RECAPITULATIF" **************************************
With Sheets("récapitulatif").Range("B3")
.Resize(200, 14).ClearContents
.Resize(200, 1).NumberFormat = "@"
N = Dict.Count
If N = 1 Then Dict.Add [Rnd], Dict.items()(0)
If Dict.Count > 0 Then
.Resize(N, UBound(arr) + 1).Value = Application.Index(Dict.items, 0, 0)
End If
End With
'MsgBox Timer - t
End Sub