re,
comme le nombre de lignes est indéfini (centaines, milliers,..) un autre méthode. La mise en page du TCD, vous pouvez le modifier ... .
Si vous aviez Excel 365, ce serait encore plus facile avec ces nouveaux formules.
Sub Nouveaux_Mouvements()
Dim i, j, ptr, aA, aOut
With Sheets("Base de données principale")
aA = .Range("A1").CurrentRegion.Value2
ReDim aOut(1 To UBound(aA) * 2, 1 To 5)
For i = 2 To UBound(aA)
Select Case aA(i, 1)
Case "Transfert", "Entrée", "Sortie"
ptr = ptr + 1
aOut(ptr, 1) = aA(i, 1) 'type
aOut(ptr, 2) = CDbl(aA(i, 2)) 'date
aOut(ptr, 3) = CStr(aA(i, 3)) 'référence
aOut(ptr, 4) = IIf(aA(i, 1) = "Entrée", 1, -1) * Abs(aA(i, 4)) 'valeur positif de quantité pour Entrée, négatif pour les 2 autres
aOut(ptr, 5) = aA(i, 5) 'emplacement "initial"
If aA(i, 1) = "Transfert" Then 'renversement "transfert"
ptr = ptr + 1
aOut(ptr, 1) = aA(i, 1) 'type
aOut(ptr, 2) = CDbl(aA(i, 2)) 'date
aOut(ptr, 3) = CStr(aA(i, 3)) 'référence
aOut(ptr, 4) = Abs(aA(i, 4)) 'valeur positif !!!
aOut(ptr, 5) = aA(i, 6) 'emplacement "destination"
End If
Case Else
MsgBox "problème"
End Select
Next
With Range("TBL_Mouvements").ListObject
If .ListRows.Count Then .DataBodyRange.Delete
If ptr > 0 Then .ListRows.Add.Range.Resize(ptr, UBound(aOut, 2)).Value = aOut
End With
.PivotTables("TCD_Stock").RefreshTable
End With
End Sub