Accélérer une macro Somme

Bonsoir à tous,

J'ai réaliser une macro qui me sert à cumuler les valeurs de certaines cellules en fonction de 2 autres critères qui se trouvent sur la même ligne. Ce code fonctionne bien mais je le trouve long à s’exécuter il y a t-il une solution afin d'accélérer celui ci ?

Sub test()

Dim résultat As String
Dim i As Long
Derniereligne = Sheets("BDD").Range("A3").End(xlDown).Row
résultat = 0

With Sheets("BDD")
For i = 3 To Derniereligne

If Sheets("BDD").Range("A" & i) = Sheets("Feuil1").Range("D1") And Sheets("BDD").Range("W" & i) = Sheets("Feuil1").Range("A2") Then
résultat = résultat + Range("K" & i).Value

End If
Next i
Sheets("Feuil1").Range("D2") = résultat
End With

End Sub

Merci à vous

Bonjour Florian53

C'est quoi long ?

A titre d'infos j'avais tenté un jour de développer une procédure qui comptabilise le nombre de fois que la valeur cellule A1 apparait dans la base de données externe de mon voisin en fonction de l'âge du capitaine...

J'ai constaté rapidement qu'elle était beaucoup plus lente les jours de grands vents mais comme nous sommes dans une petite rue où le vent s'engouffre facilement et peut atteindre des vitesses assez importantes nous avons opté pour une solution beaucoup plus basique : il compte à la main, il m'appelle et j'écris le chiffre moi même en A1.

Certes j'ai choisi le chemin le plus facile mais la procédure n'est toujours pas écrite... Cependant je pense que dans ton cas, avec un petit fichier exemple nous pourrions peut-être t'écrire une procédure optimisée !

Non sans blague je pense que, déjà avec un tableau tu gagnerais beaucoup de temps... mais il faut voir... nous sommes comme ça, nous avons besoin de voir !

Bonsoir et merci de ta réponse:

J'ai mis "long" car actuellment je dispose de 240 000 lignes et sa va certainement augmenter avec le temps. Je mets en pièce jointe un fichier exemple

15classeur1.xlsm (15.58 Ko)

(re)

Je pense (si l'exemple est bien significatif) qu'une simple fonction suffit par exemple

=SOMME.SI.ENS(BDD!C11;BDD!C1;Feuil1!L1C4;BDD!C23;Feuil1!L2C1)

L'exemple est réduit à son minimum, au début j'ai réaliser une fonction sommeProd mais comme j'ai beaucoup de cas comme celui à traiter dans le classeur ainsi que des formules matricielles, le classeur devient long à utiliser c'est pour cela que je souhaite passer par VBA et non par formule.

(re)

Je pense que l'exemple est réduit au maximum...

La question est donc comment peut-on déterminer dans la fonction "à écrire" quel sont les deux critères ?

S'agit-il d'un tableau inversé colonne W (de BDD) en ligne avec colonne A (de BDD) en colonne comme pourrait suggérer l'exemple ? ou d'une autre structure... ?

Bonjour Florian53,

Je te retourne ton fichier Excel modifié ; Ctrl e => travail effectué

Tu peux faire Ctrl e depuis la feuille "BDD" ou depuis "Feuil1".

Cordialement

18classeur1.xlsm (15.35 Ko)

Merci sa fonctionne c'est toujours un long ( presque 1 minutes )mais c'est certainement normal car je travail sur 240 000 lignes.

Il n'y a aucun autre moyen d’accélérer le calcul comme quand je fais une fonction "SommeProd" qui elle prends 2 - 3 secondes ?

Peux tu expliquer ce que veux dire " Application.Calculation = -4135" ?

Encore merci à toi

Je suis bien content que ça fonctionne. effectivement, sur 240 000 lignes, ce n'est quand même pas instantané !

Application.Calculation = -4135 => mode de calcul d'Excel mis sur manuel.

Application.Calculation = -4105 => mode de calcul mis sur automatique.

Cependant, j'ai fait trop vite : comme le code VBA ne fait que lire les données des feuilles sans rien y changer (à part la cellule résultat

en fin de calcul), les 2 instructions ci-dessus sont inutiles ; Application.ScreenUpdating = False est lui aussi inutile => nouveau fichier

Excel qui a remplacé l'ancien (dans mon message précédent) ; le nouveau code VBA est donc celui-ci :

Option Explicit

Sub test()
  Dim Derniereligne As Long, résultat As Integer, i As Long
  With Worksheets("BDD")
    Derniereligne = .[A3].End(xlDown).Row
    For i = 3 To Derniereligne
      If .Range("A" & i) = [Feuil1!D1] And .Range("W" & i) = [Feuil1!A2] Then
        résultat = résultat + .Range("K" & i)
      End If
    Next i
    [Feuil1!D2] = résultat
  End With
End Sub

mais regarde-le juste pour info car NCC 1701 a utilisé une méthode beaucoup plus rapide que la mienne :

« Test avec plus de 315 000 lignes en 2 secondes ! » ; BRAVO NCC 1701 !

Cordialement

Bonjour (..)

Et cette version là, n'est-elle pas plus rapide ?

Sub SommeRapide()
Dim tabBDD()
Dim wsBDD As Object
Dim wsResult As Object

Dim som
Dim crit1, crit2
Dim cptBDD

    Set wsBDD = Worksheets("BDD")
    Set wsResult = Worksheets("Feuil1")

    som = 0
    With wsBDD
        tabBDD = Range(.Cells(3, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, 23))
    End With

    With wsResult
        crit1 = .Cells(2, 1)
        crit2 = .Cells(1, 4)

        For cptBDD = 1 To UBound(tabBDD, 1)
            If (tabBDD(cptBDD, 23) = crit1) And (tabBDD(cptBDD, 1) = crit2) Then
                som = som + tabBDD(cptBDD, 11)
            End If
        Next
        .Cells(2, 4) = som
    End With

    Set wsBDD = Nothing
    Set wsResult = Nothing

End Sub

Test avec plus de 315 000 lignes 2 secondes !

BRAVO NCC 1701 !

Ta méthode avec Tableau en mémoire est super efficace !!!

(re)

Merci à vous 2

Mais n'en faîtes pas trop !

Effectivement il n'y a rien de plus rapide que les tableaux en mémoire...

Rechercher des sujets similaires à "accelerer macro somme"