Allègement du code pour accélération macro

Marral

XLDnaute Nouveau
Bonjour le forum,

Je débute dans VBA (2 mois d'utilisation). J'ai pas mal bouquiné et passé du temps sur les forums pour bien comprendre le fonctionnement de VBA.

J'ai créé une macro dont le code est ci-dessous. Cependant, l'utilisation de la macro est particulièrement long. Je souhaiterais savoir s'il est possible de l'alléger ou de l'écrire différemment pour accélérer les calculs (Temps d'exécution moyen: 2min). Voici la macro:

Code:
Sub PU_Code()

' *** Définition des données
    Dim Mafeuille As Worksheet, FeuilleAnalyse As Worksheet
    Dim CelluleDepart As Range, CelluleFin As Range, DetectionCode As Range, DetectionNombrePU As Range
    Dim LigneFin As Long, Annee As Long
    Dim Compteur As Integer
    Dim ValeurProduit(400) As Variant, Valeur(10) As Variant, PUMoyen As Variant
    Dim NomFournisseur As String

    Application.ScreenUpdating = False

' *** Récupération du nom du fournisseur à traiter
    Set Mafeuille = ThisWorkbook.Worksheets("Specific Analysis")
    Set FeuilleAnalyse = ThisWorkbook.Worksheets("DATABASE")

' *** Récupération du nom des produits avant recherche données dans Feuille d'Analyse
    With Mafeuille
        For Annee = 4 To 10 Step 2
            Valeur(Annee) = .Cells(5, Annee)
        Next Annee
        NomFournisseur = .Cells(3, 3)
        Set CelluleDepart = .Cells(7, 3)
        Set CelluleFin = .Cells(.Rows.Count, 3)
        If IsEmpty(CelluleFin.Value) Then
            Set CelluleFin = CelluleFin.End(xlUp)
        End If
        LigneFin = CelluleFin.Row
        For Compteur = 7 To LigneFin
            ValeurProduit(Compteur) = .Cells(Compteur, 3)
        Next Compteur
    End With
    
' *** Récupération des Codes produit
    FeuilleAnalyse.Activate
    Selection.AutoFilter field:=5
    Selection.AutoFilter field:=14
    Selection.AutoFilter field:=24
    Selection.AutoFilter field:=5, Criteria1:=NomFournisseur
    With FeuilleAnalyse
        For Compteur = 7 To LigneFin
            Set DetectionCode = .Cells.Find(ValeurProduit(Compteur))
            Mafeuille.Cells(Compteur, 2).Value = DetectionCode.Offset(, -16).Value
        Next Compteur
    End With
    Mafeuille.Activate

' *** Récupération des Prix Unitaires moyens par Année
    FeuilleAnalyse.Activate
    With FeuilleAnalyse
        Selection.AutoFilter field:=14
        Selection.AutoFilter field:=24
        For Annee = 4 To 10 Step 2
            For Compteur = 7 To LigneFin
                If Mafeuille.Cells(Compteur, Annee) <> "" Then
                    Selection.AutoFilter field:=14, Criteria1:=Valeur(Annee)
                    Selection.AutoFilter field:=24, Criteria1:=ValeurProduit(Compteur)
                    Set DetectionNombrePU = .Cells(.Rows.Count, 18)
                    If IsEmpty(DetectionNombrePU.Value) Then
                        Set DetectionNombrePU = DetectionNombrePU.End(xlUp)
                    End If
                    PUMoyen = Application.Subtotal(1, [R2:R4000])
                    Mafeuille.Cells(Compteur, Annee + 1).Value = PUMoyen
                Else
                End If
            Next Compteur
        Next Annee
    End With
    Application.ScreenUpdating = True
End Sub

Je vous explique comment elle fonctionne:
En cellule C3, il y a une liste déroulante avec le nom des fournisseurs dont les produits sont à étudier. Lorsque je change de nom, la macro démarre grâce à :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

 If Target.Address(0, 0) = "C3" Then
    Call Recuperation_80
    Call PU_Code
 End If
 
End Sub

Le reste est détaillé au fur et à mesure du code.

Honnêtement, je ne vois pas comment simplifier tout ca. Un coup de main est bienvenue. Malheureusement, je ne peux pas poster de fichier pour vous montrer car les données sont confidentielles.

Merci pour votre aide,

Marral

EDIT: Je précise que la macro Recuperation_80 s'exécute parfaitement et le traitement est rapide.
 

pierrejean

XLDnaute Barbatruc
Re : Allègement du code pour accélération macro

bonjour Marral

et bienvenue sur XLD

Un fichier exemple ne comportant que quelques données rendues anonymes serait bien utile puisqu'a 1ere vue il est question de repenser le code pour acceleration
 

Marral

XLDnaute Nouveau
Re : Allègement du code pour accélération macro

Bonjour pierrejean,

J'ai pu rendre un peu plus anonyme les données de mon fichier. Seul reste le nom des produits mais comùe ce sont des produits courants, peu importe. J'ai laissé la Database d'origine car le problème je pense vient de sa taille.



Merci pour le coup de main.
 
Dernière édition:

Statistiques des forums

Discussions
312 164
Messages
2 085 864
Membres
103 007
dernier inscrit
salma_hayek