Améliorer la rapidité d'une boucle sur 53 feuilles

zephir94

XLDnaute Impliqué
Bonjour à tous,

Je dois faire le total de 53 feuilles dans une 54 ème sur certaines colonnes.
J'ai donc écris ce code qui marche très bien mais qui reste lent :
VB:
Sub test()
Dim fg
Dim NN
Dim l
Dim P As Variant
Dim ll
Dim vv
vv = ""
Application.ScreenUpdating = False
NN = Sheets(1).Range("C65536").End(xlUp).Row 'recherche de la dernière ligne vide sur la feuille
For fg = 1 To 53 Step 1
With Sheets(fg)
  If fg = 1 Then ' Si on commence par la feuille 1 on vide la feuille Total
  ' à écrire
  Else
  End If
  For ij = 4 To NN Step 1 ' Boucle pour ce déplacer dans les lignes
If IsNumeric(Val(CStr(Sheets(fg).Range("C" & ij).Value))) = True _
And Sheets(fg).Range("C" & ij).Value <> "" Then
k = Sheets(fg).Range("C" & ij).Value
      For Each P In Array(6, 7, 9, 11, 13, 15, 16, 18, 20, 21, 22) ' Boucle pour ce déplacer dans les colonnes
      vv = Sheets(fg).Range("A" & ij).Offset(0, P).Value
      Sheets(54).Range("A" & ij).Offset(0, P).Value = Sheets(54).Range("A" & ij).Offset(0, P).Value + vv
      ko = Sheets(54).Range("A" & ij).Offset(0, P).Value
      vv = ""
      Next P
  Else ' si la valeur de la Cellule n'est pas une valeur numérique alors je ne fait rien
  End If
  Next ij ' je passe à la ligne suivante
End With ' je ferme mon avec la feuille encours
Next fg ' je passe à la feuille suivante
MsgBox " Fin de la boucle"
Application.ScreenUpdating = True
End Sub
Merci par avance pour vos pistes d'améliorations

Bien cordialement Scoubi
 

zephir94

XLDnaute Impliqué
Si car je vérifie si dans la colonne C il y a une valeur numérique !
Code:
If IsNumeric(Val(CStr(Sheets(fg).Range("C" & ij).Value))) = True _
And Sheets(fg).Range("C" & ij).Value <> "" Then
k = Sheets(fg).Range("C" & ij).Value

Si cette valeur numérique n'existe pas je passe à la ligne suivante donc du fait je ne copiais pas les autres feuilles !
 

thebenoit59

XLDnaute Accro
Pas fais attention à ça.
Il suffit juste d'ajouter 3 dans Colonne =

Même si nous pourrions boucler directement sur toutes les colonnes, ça n'augmenterait pas spécialement le temps.

Pour cela il faut remplacer la procédure Somme_Tableau par :

VB:
Sub Somme_Tableau(Tableau1(), Tableau2(), Niveau%)
Dim i&, j&
Dim Colonne()
    For i = LBound(Tableau1, 1) To UBound(Tableau1, 1)
        For j = LBound(Tableau1, 2) To UBound(Tableau1, 2)
            If Not IsNumeric(Tableau2(i, j)) And Niveau = 1 Then
                Tableau1(i, j) = Tableau2(i, j)
            ElseIf (Tableau2(i, j)) > 0 Then
                Tableau1(i, j) = Tableau1(i, j) + Tableau2(i, j)
            End If
        Next j, i
End Sub
 

chris

XLDnaute Barbatruc
Merci Chris,
Je viens de voir ton fichier et j'ai corrigé le mien où j'avais oublié de reproduire la colonne C ! voilà pourquoi je n'avais qu'une feuille de compté !

Peux tu m'en dire un peu plus sur :
Code:
=SOMME(Feuil1:Feuil53!F4)
je ne comprend pas F4 vue que cette formule est en G4 ?
Merci pour vos aides à tous
Je me suis basé sur ta macro qui écrit en G la somme des colonnes F (cela me paraissait curieux mais comme on a pas de visibilité sur le cas réel (Edit : l'offset devrait être P-1 dans ta macro)

Le test de la valeur numérique est inutile dans une fonction somme, que ce soit en formule ou VBA : tu pourrais donc simplifier le code si tu tiens à VBA.
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Salut à tous

Je l'ai fait ,je le poste
NB: résultat dans feuille T
Code:
Sub essai()
debut = Timer
Sheets("T").Cells.Clear
fin = Sheets("Feuil1").Range("C" & Rows.Count).End(xlUp).Row
ReDim tabres(1 To fin, 1 To 16)
For Each sh In Sheets
  tablo = sh.Range(Cells(4, 6).Address & ":" & Cells(fin, 22).Address)
  For n = LBound(tablo, 1) To UBound(tablo, 1)
     For m = LBound(tablo, 2) To UBound(tablo, 2)
        On Error Resume Next
             If tablo(n, m) <> "" And tablo(n, m) <> 0 Then tabres(n, m) = tabres(n, m) + Val(tablo(n, m))
        On Error GoTo 0
     Next
  Next
Next
Sheets("T").Cells(4, 6).Resize(UBound(tabres, 1), UBound(tabres, 2)) = tabres
MsgBox (Timer - debut)
End Sub
 

Pièces jointes

  • Classeur2 (1).xls
    1.2 MB · Affichages: 50

Discussions similaires

Réponses
11
Affichages
298
Réponses
2
Affichages
154

Statistiques des forums

Discussions
312 321
Messages
2 087 260
Membres
103 498
dernier inscrit
FAHDE