Optimiser code VBA

Bonjour le forum

Alors voilà, j'utilise la fonction CountIfS, j'ai fait des testes dans un petit fichier et tout fonctionne nickel, mais une fois dans mon classeur avec un GRAAAAAAND tableau mon code met énormément de temps avant d'arrivé au bout.

Mon code travaille directement sur les cellules, si je voulais gagner en rapidité ne serait-il pas judicieux d'abord travailler dans des tableaux "virtuels" puis de les transposer à l'endroit voulu ?

Bref, dans tous les cas j'ai besoins d'aide

Private Sub Indicateurs_Init()
Dim f1 As Worksheet
Dim f5 As Worksheet

Dim C As Integer 'Navigation sur les Colonnes
Dim L As Integer 'Navigation sur les Lignes

Set f1 = Feuil1
Set f4 = Feuil4

For L = 2 To 12
    For C = 5 To 16
            f4.Cells(L, C) = WorksheetFunction.CountIfs(f1.Columns(3), f4.Cells(L, 4), f1.Columns(2), ">=" & CDbl(f4.Cells(1, C)), f1.Columns(2), "<" & CDbl(f4.Cells(1, C + 1)))
            f4.Cells(L + 13, C) = WorksheetFunction.CountIfs(f1.Columns(3), f4.Cells(L, 4), f1.Columns(16), "Terminé", f1.Columns(2), ">=" & CDbl(f4.Cells(1, C)), f1.Columns(2), "<" & CDbl(f4.Cells(1, C + 1)))
    Next C
Next L
End Sub

Par avance, merci de l’intérêt porté au sujet

Bonjour,

On évite de travailler sur des colonnes complètes, tes fonctions seront plus rapides avec des plages finies (il faut donc au préalable déterminer la dernière ligne).

La désactivation momentanée du calcul automatique accélère souvent l’exécution, surtout sur des fichiers chargés en formules Excel :

'En début de macro :
Application.Calculation = xlCalculationManual
'...
'En fin de macro :
Application.Calculation = xlCalculationAutomatic

Bonjour,

une autre proposition

Sub aargh()
    Set f1 = Sheets("Feuil1")
    Set f4 = Sheets("Feuil4")
    dl = f1.Cells(Rows.Count, 3).End(xlUp).Row
    tablo = f1.Range("A1").Resize(dl, 16)
    For L = 2 To 12
        For C = 5 To 16
            cr1 = f4.Cells(L, 4)
            cr2 = f4.Cells(1, C)
            cr3 = f4.Cells(1, C + 1)
            ctr1 = 0
            ctr2 = 0
            For i = 1 To dl
                If tablo(i, 3) = cr1 Then
                    If tablo(i, 2) >= cr2 And tablo(i, 2) < cr3 Then
                        ctr1 = ctr1 + 1
                        If tablo(i, 16) = "Terminé" Then
                            ctr2 = ctr2 + 1
                        End If
                    End If
                End If
            Next i
            f4.Cells(L, C) = ctr1
            f4.Cells(L + 13, C) = ctr2
        Next C
    Next L
End Sub

C'est super, merci à vous deux pour vos messages très intéressant, dans les deux propositions faites c'est parfait ! Merci à vous deux pour l'efficacité et la rapidité !!

@h2so4 Je voudrais intégrer dans ton code une ligne permettant de générer les "entêtes" des colonnes, par là je parle des références exprimée par cr2 = f4.Cells(1, C)

Dans ces entêtes ce sont des dates, plus précisement, c'est le mois qui m’intéresse.

Donc comment mettre dans la premiere colonne "01/01/" & me.combobox1, dans la deuxième colonne "01/02/ & me.combobox1, etc. sur les 12 mois de l'année ?

exemple

bonjour,

essaie ceci

Sub entete()
    Set f4 = Sheets("Feuil4")
    For mois = 1 To 12
        f4.Cells(1, C + 4) = "01/" & mois & "/" & Me.combobox1
    Next i
End Sub

Merci du retour, c'est exactement ce que j'ai fait

Rechercher des sujets similaires à "optimiser code vba"