Dépassement de capacité

Bonjour,

alors voilà, je suis en stage et je dois faire un reporting financier. Pour celà, j'ai fait un gros fichier avec que des macros. Dans ces macro on retrouve différentes choses comme créations de tableaux, graphiques,...
Dans une des macros, je vais récupérer des données dans des fichiers. Jusque là ça marché sauf que la j'ai fait sur des fichiers qui font plus de 49000 lignes....
J'ai une erreur de dépassement de capacité.
A coté de ces 49000 lignes, je veux créer une colonne qui fait un calcul. Pour cela j'ai un compteur qui va me compter combien j'ai de lignes (dans cet exemple j'en ai à peu prés 49000). Ensuite, je récupère ce nombre afin que sur la colonne d'après et sur les 49000 lignes, il me fasse un calcul. Voici le code

' Récupérer la taille du tableau final après extraction
c = 0
While Range("A1").Offset(c, 0) <> ""
c = c + 1
Wend
Ce bout de code est dans une autre fonction. Et ensuite j'ai :
For b = 2 To c + 1
If Cells(b, 8).Value = 0 Then
Cells(b, 14).Value = Cells(b, 7).Value
Else: Cells(b, 14).Value = Cells(b, 9).Value
End If
Next b
Où je récupère donc le c pour effectuer mes calculs. et c'est ma ligne "For b = 2 To c + 1" qui beug..... Quelqu'un peut-il m'aider je sais vraiment pas comment régler ce problème. J'avais quasiment fini mon travail et la bim 'erreur de dépassement de capacité'.
Merci d'avance!

5 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour,

    1/ pour avoir la derniere cellule non vide d'une colonne, sans boucle infernale:

    c= Range("A" & Rows.Count).End(xlUp).Row


    2/ Et ensuite j'ai : comment passez vous la variable c d'une procedure a l'autre et vous l'avez declare de quel type
    1. Contributeur
      Bonjour
      comme on ne connait pas la déclaration de tes variables b et c...
      et comment implémente tu "c "
      car tu dis
      Ce bout de code est dans une autre ...
      1. Contributeur
        salut F89,

        de toutes façons en traitant de cellules en cellules sur 49000 lignes, tu as largement le temps de faire une pétanque!
    2. Sub extraction()
      ' Récupérer la taille du tableau final après extraction
      c = 0
      While Range("A1").Offset(c, 0) <> ""
      c = c + 1
      Wend

      ' Appel des fonctions
      Call ColonneCmdReel(c)
      Call Date(c)

      End Sub
      ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
      Sub ColonneCmdReel(c)

      Set wb = ActiveWorkbook
      ExtractDir = ActiveWorkbook.Path & "\YMMRPT011\"
      Dim NomOngletInputs As String
      NomOngletInputs = "Inputs011"

      wb.Activate
      wb.Worksheets(NomOngletInputs).Activate

      ' Opération sur colonne cmdé réel
      For b = 2 To c + 1
      If Cells(b, 8).Value = 0 Then
      Cells(b, 14).Value = Cells(b, 7).Value
      Else: Cells(b, 14).Value = Cells(b, 9).Value
      End If
      Next b

      End Sub
      '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
      Je sais pas si cela suffit.
      J'ai essayé cette méthode :

      For Each cel In Range(Range("A2"), Range("A65000").End(xlUp))
      If cel.Offset(0, 7).Value = 0 Then
      cel.Offset(0, 13).Value = cel.Offset(0, 6).Value
      Else: cel.Offset(0, 13).Value = cel.Offset(0, 8).Value
      End If
      Next cel

      Ca marche pour cette fonction mais par exemple pour une autre fonction j'avais ça :
      Sub Date(c)
      For b = 2 To c + 1
      Cells(b, 15).Value = Format(Cells(b, 12).Value, "yyyy")
      Next b
      End Sub
      '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
      J'ai remplacé par :
      For Each cel In Range(Range("A2"), Range("A65000").End(xlUp))
      cel.Offset(0, 14).Value = Format(cel.Offset(0, 11).Value, "yyyy")
      Next cel
      Ca ne me met pas le bon format que je souhaite.....
      1. Re,

        essayez ceci:

        Sub extraction()
            Dim NomOngletInputs As String, plage As Range, cel As Range, b As Long
        
            Application.ScreenUpdating = False
            Set wb = ActiveWorkbook
            ExtractDir = ActiveWorkbook.Path & "\YMMRPT011\"
            NomOngletInputs = "Inputs011"
        
            wb.Activate
            wb.Worksheets(NomOngletInputs).Activate
        
            ' Opération sur colonne cmdé réel
            Set plage = Range(Range("A2"), Range("A65000").End(xlUp))
            For Each cel In plage
                If cel.Offset(0, 7).Value = 0 Then
                    cel.Offset(0, 13).Value = cel.Offset(0, 6).Value
                Else
                    cel.Offset(0, 13).Value = cel.Offset(0, 8).Value
                End If
                'format date annee
                b = cel.Row
                Cells(b, 15).Value = Format(Cells(b, 12).Value, "yyyy")
            Next cel
            Application.ScreenUpdating = True
        End Sub
        1. Bonjour,

          un peu plus rapide (65000 ligne en 0.9 s au lieu de 4s)

          Option Base 1
          
          Sub extraction()
              Dim NomOngletInputs As String, plageA As Range, cel As Range, b As Long
              Dim Tcol13, Tcol15, c
          
          
              temps = Timer
          
              Application.ScreenUpdating = False
              Set wb = ActiveWorkbook
              ExtractDir = ActiveWorkbook.Path & "\YMMRPT011\"
              NomOngletInputs = "Inputs011"
          
              wb.Activate
              wb.Worksheets(NomOngletInputs).Activate
              ' Opération sur colonne cmdé réel
              derlig = Range("A65536").End(xlUp).Row
              'redefini les tableaux fonction fin cellule non vide
              ReDim Tcol13(derlig - 1), Tcol15(derlig - 1)
              'mise en memoire colonne A
              Set plageA = Range("A2:A" & derlig)
              'boucle colonne A pour mise en tableaux des valeurs
              For Each cel In plageA
                  b = cel.Row: c = b - 1
                  If cel.Offset(0, 7).Value = 0 Then
                      Tcol13(c) = cel.Offset(0, 6).Value
                  Else
                      Tcol13(c) = cel.Offset(0, 8).Value
                  End If
                  Tcol15(c) = Year(Cells(b, 12))
              Next cel
              'restitution des valeurs
              With wb.Worksheets(NomOngletInputs)
                  .Range("N2:N" & derlig) = Application.Transpose(Tcol13)
                  .Range("O2:O" & derlig) = Application.Transpose(Tcol15)
              End With
              Application.ScreenUpdating = True
              
              MsgBox "temps: " & Timer - temps
          End Sub
          1. Bonjour,
            Merci beaucou pour toutes ces réponses. Et pour la rapidité à laquelle vous m'avez répondu! Ca va beaucoup m'aider parce que mon Reporting doit faire énormement de calculs sur toutes ses lignes. Et quand je mets ma macro en route elle mets 30 min à tout faire et pourtant j'ai vraiment optimiser toutes mes macros et fais en sorte que ça aille le plus vite possible. Mais le fichier est très lourd et très conséquent en terme de calculs et de mise en place de tableaux et graphiques (pour cet exemple j'ai environs 40 graphiques et 80 tableaux qui se font automatiquement). Je vais tester votre macro.
            Encore merci pour votre aide!
            Bonne journée
          2. @MathildeRe,

            il aurait fallu preciser des le debut votre contexte (calculs, graphes)

            pour optimiser au max, ajoutez ces lignes au bon endroit pour le depart et evidement a la fin pour terminer en remettant les chose a l'initial

            'début du programme
            'augmente la vitesse de calcul
            Application.DisplayAlerts = False
            Application.EnableEvents = False
            Application.ScreenUpdating = False
            Application.Calculation = xlManual
            
            'a la fin du programme
            'redonne la main au calcul automatique d'excel
            Application.DisplayAlerts = True
            Application.EnableEvents = True
            Application.ScreenUpdating = True
            Application.Calculation = xlAutomatic
          3. Bonjou,

            Merci beaucoup our toutes ces informations.

            Oui j'utilise déjà ceci pour améliorer un max les calculs. ça fonctionne déjà mieux avec ce que vous m'avez déjà donné.
            J'ai une question: je sais que j'utilise : Set plage = Range(Range("A2"), Range("A65000").End(xlUp)). Pour l'instant, le plus gros fichier que j'ai eu est 49 000. Néanmoins, on vient de m'informer qu'il était possible que je rencontre des fichiers de plus de 100 000 lignes. Comment je dois procéder si je tombe sur un fichier dépassant les 65 000 lignes?

            Cordialement
          4. @MathildeBonjour,

            en restant sur de l'excel:

            Reponse facile, changez d'excel en passant a 2007 et plus
            Reponse un peu moins facile, recuperer les fichiers en les decoupant par tranches de 65000 lignes sur x onglets, ceci pouvant remettre en cause votre importation de fichiers et compliquer la lisibilite des resultats
          5. Je suis actuellement sur Excel 2007.
            Il n'est pas possible pour moi de découper les fichiers. SInon je devrais tout refaire et comme vous dites ça peut compliquer les résultats...
            Mias je garde Range("A65000") ou je dois changer pour que ça aille plus loin?