Re : VBA ou autres formules ! Calcul moyenne en fonction de, tant que
Bonjour VDAVID,
Tu as l’air de maitriser le vba et je voulais savoir si tu voyais des améliorations à effectuer afin que mon fichier soit plus rapide. 
Mon objectif est de calculer le cout destination/produit en tonne/euros. 
A partir d’une extraction SAP, je mets donc en place mon fichier. Je récupère et tri les données, puis je dois répartir les livraisons en fonction des transporteurs.
1er problème : J’avais fait des filtres élaborés en vba mais le code n’est pas stable et j’ai eu beaucoup d’erreur. J’ai donc du appliquer un filtrage simple avec des copier-collers, plus lent…
Puis, je dois calculer le prix de chaque livraison en fonction des grilles tarifaires. 
2eme problème : Je lui demande un copier-coller des datas car je ne sais pas coder en vba. La macro me renvois souvent des erreurs car les formats ne sont pas les bons, c’est long mais je ne vois pas d’autres solutions.
Si tu as le temps de m’aider, ça serait vraiment gentil ! 
Ci-dessous ma macro :
Sub Macro()
Workbooks.Open Filename:="P:\Projet\PROJET CALCULS\export.MHTML"
Windows("export.MHTML").Activate
'Recherche et suppression du mot "Emballage Cable"
Dim i As Integer
  For i = [A65000].End(xlUp).Row To 1 Step -1
  If Not Cells(i, 42).Find(What:="PAL") Is Nothing Or _
     Not Cells(i, 42).Find(What:="tou") Is Nothing Or _
     Not Cells(i, 42).Find(What:="SACH") Is Nothing Or _
     Not Cells(i, 1).Find(800) Is Nothing Or _
     Not Cells(i, 42).Find(What:="Emballage Câble") Is Nothing Then Rows(i).Delete
  Next i
'Tri des données par BL
 ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A2:A4511" _
        ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range("A1:CD4511")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
'Copie des données SAP "export" dans fichier "Projet" - A Mettre dans le même dossier
 Range("A:A, E:E, Q:Q, AP:AP, AU:AU, AW:AW, BM:BM, BJ:BJ, BP:BP, CD:CD").Select
    Selection.Copy
Windows("Copie de PROJET1.xlsm").Activate
    Columns("A:J").Select
    ActiveSheet.Paste
      
Windows("export.MHTML").Activate
    ActiveWindow.Close
       
'Filtre Kuehne Nagel
        
 'Columns("J:J").Select
    'Selection.AutoFilter
    'ActiveSheet.Range("$J$1:$J$2069").AutoFilter Field:=1, Criteria1:= _
        "KUEHNE + NAGEL ROAD"
   ' Range("A:L").Select
    'Selection.Copy
    'Sheets("Kuehne Nagel").Select
   ' Range("A3").Select
    'ActiveSheet.Paste
'Filtre Schenker
Sheets("Données").Select
 Columns("J:J").Select
    Selection.AutoFilter
    ActiveSheet.Range("$J$1:$J$2069").AutoFilter Field:=1, Criteria1:= _
        "DB SCHENKER"
    Range("A:L").Select
    Selection.Copy
    Sheets("Schenker").Select
    Range("A3").Select
    ActiveSheet.Paste
        
'Filtre Ziegler
Sheets("Données").Select
 Columns("J:J").Select
    Selection.AutoFilter
    ActiveSheet.Range("$J$1:$J$2069").AutoFilter Field:=1, Criteria1:= _
        "TRANSPORTS ZIEGLER"
    Range("A:L").Select
    Selection.Copy
    Sheets("Ziegler").Select
    Range("A3").Select
    ActiveSheet.Paste
    
' Filtre Droin
    'Sheets("Données").Select
 'Columns("J:J").Select
    'Selection.AutoFilter
    'ActiveSheet.Range("$J$1:$J$2069").AutoFilter Field:=1, Criteria1:= _
        "DROIN"
   'Range("A:L").Select
    'Selection.Copy
    'Sheets("Droin").Select
    'Range("A3").Select
    'ActiveSheet.Paste
                  
' Filtre LFB
Sheets("Données").Select
 Columns("J:J").Select
    Selection.AutoFilter
    ActiveSheet.Range("$J$1:$J$2069").AutoFilter Field:=1, Criteria1:= _
        "LA FLECHE BRESSANE"
    Range("A:L").Select
    Selection.Copy
    Sheets("LFB").Select
    Range("A3").Select
    ActiveSheet.Paste
    
'Calculs du cout BL/destination pour LFB
'Ouvrir grille tarifaire LFB - Copier Projet --> grille tarifaire
Sheets("LFB").Select
Range("L:L,H:H").Select
Selection.Copy
Workbooks.Open Filename:="P:\Projet\PROJET CALCULS\Grille tarifaire LFB1.XLS"
Sheets("Poids calcul").Select
Range("A:A").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
'Copier/ coller VALEUR grille tarifaire LFB --> Projet
Sheets("Poids Calcul").Select
Columns("D😀").Select
Selection.Copy
Windows("Copie de Copie de PROJET1.xlsm").Activate
Sheets("LFB").Select
Columns("M:M").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Windows("Grille tarifaire LFB1.XLS").Activate
    ActiveWindow.Close
'Calculs du cout BL/destination pour Schenker
Sheets("Schenker").Select
Range("L:L,H:H").Select
Selection.Copy
Workbooks.Open Filename:="P:\Projet\PROJET CALCULS\Grille tarifaire Schenker.xlsx"
Sheets("Poids calcul").Select
Range("A:A").Select
ActiveSheet.Paste
'Copier/ coller VALEUR grille tarifaire Schenker --> Projet
Sheets("Poids Calcul").Select
Columns("E:E").Select
Selection.Copy
Windows("Copie de PROJET1.xlsm").Activate
Sheets("Schenker").Select
Columns("M:M").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Windows("Grille tarifaire Schenker.XLSX").Activate
    ActiveWindow.Close
    
'Calculs du cout BL/destination pour Ziegler
Sheets("Ziegler").Select
Range("H:H,L:L").Select
Selection.Copy
Workbooks.Open Filename:="P:\Projet\PROJET CALCULS\Grille tarifaire ZIEGLER.xlsx"
Sheets("Poids calcul").Select
Range("A:A").Select
ActiveSheet.Paste
'Copier/ coller VALEUR grille tarifaire Ziegler --> Projet
Sheets("Poids Calcul").Select
Columns("E:E").Select
Selection.Copy
Windows("Copie de PROJET1.xlsm").Activate
Sheets("Ziegler").Select
Columns("M:M").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Windows("Grille tarifaire ZIEGLER.XLSX").Activate
    ActiveWindow.Close
'Effacement des données dans la feuille données
Windows("Copie de PROJET1.xlsm").Activate
Sheets("Données").Select
[A:J].ClearContent
'Moyenne du poids de chaque câble par BL
Set Ws = Sheets("Schenker")
     
    'Colonne où se trouve les livraisons
    ColL = "A"
    
    'Colonne où se trouve les poids totals par BL
    ColM = "M"
    
    'Ligne de départ du tableau
    LStart = 4
    
    NbMoy = 0
    
    '4 est la ligne de départ du tableau
    
    With Ws
    
        LFin = .Range(ColL & 65536).End(xlUp).Row
    
        tabl = .Range(ColL & LStart & ":" & ColM & LFin).Value
        ReDim Preserve tabl(UBound(tabl()), UBound(tabl(), 2) + 1)
        
        For i = LBound(tabl()) To UBound(tabl())
            
            For h = LBound(tabl()) To UBound(tabl())
            
                If tabl(h, LBound(tabl(), 2)) = tabl(i, LBound(tabl(), 2)) Then
                    
                    tabl(i, UBound(tabl(), 2)) = tabl(i, UBound(tabl(), 2)) + tabl(h, UBound(tabl(), 2) - 1)
                    NbMoy = NbMoy + 1
                
                End If
            
            Next h
            If NbMoy > 0 Then tabl(i, UBound(tabl(), 2)) = tabl(i, UBound(tabl(), 2)) / NbMoy
            NbMoy = 0
        
        Next i
        .Range(Cells(LStart, .Range(ColL & 1).Column), .Cells(LFin, Range(ColM & 1).Column + 1)).Value = tabl
    
    End With
End Sub