Bonjour le fofo,
Je suis en train de faire une petite appli Excel qui consiste à importer des données de plusieurs autres feuilles excel, provenant d'une extraction d'un ERP. Les informations sont compilées sur deux feuilles de ~70 000lignes
Dans un second temps, je traite ces données via une boucle qui traite chaque ligne:
- Calculs entre les lignes (IF Cells)
- Recherche dans d'autres Feuilles (VLookup)
- Qui comprend une autre petite boucle "a" à l'intérieur de la boucle principal (i)
C'est pour cette seconde partie que j'ai besoin de votre expertise. En effet, le code que j'ai réalisé fonctionne..mais il est lent environ 40s de traitement avec une machine de compétition...
Je débute le VBA, je bouffe du tuto mais j'ai pas encore les bonnes pratiques...
Merci d'avance si vous pouvez jeter un coup d'oeil, et me conseiller pour améliorer la qualité de mon code.
a+
Je suis en train de faire une petite appli Excel qui consiste à importer des données de plusieurs autres feuilles excel, provenant d'une extraction d'un ERP. Les informations sont compilées sur deux feuilles de ~70 000lignes
Dans un second temps, je traite ces données via une boucle qui traite chaque ligne:
- Calculs entre les lignes (IF Cells)
- Recherche dans d'autres Feuilles (VLookup)
- Qui comprend une autre petite boucle "a" à l'intérieur de la boucle principal (i)
C'est pour cette seconde partie que j'ai besoin de votre expertise. En effet, le code que j'ai réalisé fonctionne..mais il est lent environ 40s de traitement avec une machine de compétition...
Je débute le VBA, je bouffe du tuto mais j'ai pas encore les bonnes pratiques...
Merci d'avance si vous pouvez jeter un coup d'oeil, et me conseiller pour améliorer la qualité de mon code.
a+
Code:
Sub Traitement_Imp_Ventes()
Dim derli As String, nbvent As String
Dim R As Variant, S As Variant
nbvent = Sheets("Références").Range("L1").End(xlDown).Row
derli = Sheets("Ventes").Range("K1").End(xlDown).Row
For i = 2 To derli
'Remplacer les vides par dates par ligne
If Cells(i, 2) = "" And Cells(i, 10) <> "" Then
Cells(i, 2) = Cells(i - 1, 2)
End If
'Remplacer les vides par N°commande par ligne
If Cells(i, 3) = "" And Cells(i, 10) <> "" Then
Cells(i, 3) = Cells(i - 1, 3)
End If
'Remplacer les Vides par zéro Prix Achats
If IsEmpty(Cells(i, 4)) Then
Cells(i, 4).Value = 0
End If
'Remplacer les Vides par zéro Prix Public
If IsEmpty(Cells(i, 5)) Then
Cells(i, 5).Value = 0
End If
'Remplacer les Vides par zéro Prix Vente
If IsEmpty(Cells(i, 6)) Then
Cells(i, 6).Value = 0
End If
'Remplacer les vides par Clients par ligne
If Cells(i, 8) = "" And Cells(i, 10) <> "" Then
Cells(i, 8) = Cells(i - 1, 8)
End If
'Remplacer les vides par Statut par ligne
If Cells(i, 9) = "" And Cells(i, 10) <> "" Then
Cells(i, 9) = Cells(i - 1, 9)
End If
'Calcul Total vendu
Cells(i, 12) = Cells(i, 7) * Cells(i, 6)
'Ref Interne démentellée
Cells(i, 13).Value = Replace(Replace(Left(Cells(i, 10), InStr(Cells(i, 10), "]")), "[", ""), "]", "")
'N°semaine
Cells(i, 14) = NoSemaineISO(Cells(i, 2))
'Déterminer les type de vente à classer comme Interne
For a = 2 To nbvent
If Sheets("Ventes").Cells(i, 8) = Sheets("Références").Cells(a, 12) Then
Sheets("Ventes").Cells(i, 15) = "Interne"
End If
Next a
'Détermine les types de ventes à classer en externe
If IsEmpty(Cells(i, 15)) Then
Cells(i, 15) = "Externe"
End If
'Calcul Taux Réduction
If Cells(i, 6) > 0 And Cells(i, 5) Then
Cells(i, 16) = 1 - (Cells(i, 6) / Cells(i, 5))
'Calcul Réduction
Cells(i, 17) = (Cells(i, 5) - Cells(i, 6)) * Cells(i, 7)
Else
Cells(i, 16) = 0
Cells(i, 17) = 0
End If
'Calcul Marge
Cells(i, 18) = Cells(i, 12) - (Cells(i, 4) * Cells(i, 7))
'Calcul Taux MArge
If Cells(i, 18) > 0 Then
Cells(i, 19) = Cells(i, 18) / Cells(i, 12)
End If
'Recherche dans une autre feuille les Marques
R = Application.VLookup(Cells(i, 13), Sheets("Article Table").Range("D:E"), 2, False)
If IsError(R) Then
Cells(i, 20) = ""
Else
Cells(i, 20) = R
End If
'Recherche dans une autre feuille les groupes ref
S = Application.VLookup(Cells(i, 13), Sheets("Article Table").Range("D:AN"), 36, False)
If IsError(S) Then
Cells(i, 21) = ""
Else
Cells(i, 21) = S
End If
'Détermine Type de vente
If Left(Cells(i, 13), 2) = "PS" Then
Cells(i, 22) = "Main d'oeuvre"
ElseIf Cells(i, 13) = "AVPURA" Then
Cells(i, 22) = "Taxe"
Else
Cells(i, 22) = "Pièce"
End If
Next i
'Renommer entêtes
Cells(1, 2) = "Date"
Cells(1, 3) = "N°Commande"
Cells(1, 4) = "PU Achat"
Cells(1, 5) = "PU Public"
Cells(1, 6) = "PU Vente"
Cells(1, 7) = "Qtité"
Cells(1, 8) = "Client"
Cells(1, 9) = "Etat"
Cells(1, 10) = "Designation"
Cells(1, 12) = "Total vendu"
Cells(1, 13) = "Ref interne"
Cells(1, 14) = "Semaine"
Cells(1, 15) = "Vente"
Cells(1, 16) = "Taux Réduction"
Cells(1, 17) = "Réduction"
Cells(1, 18) = "Marge"
Cells(1, 19) = "Taux Marge"
Cells(1, 20) = "Marque"
Cells(1, 21) = "Ref Groupe"
Cells(1, 22) = "Type de vente"
Cells(1, 23) = "Catégorie"
End Sub
Dernière édition: