Dépassement de capacité

Mathilde -  
f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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
    0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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 ...
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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!
      0
      1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Bonjour,

        C'est un passe-temps comme un autre
        0
  3. Mathilde
     
    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.....
    0
  4. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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
    0
    1. Mathilde
       
      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
      0
    2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > Mathilde
       
      Re,

      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
      0
    3. Mathilde
       
      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
      0
    4. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > Mathilde
       
      Bonjour,

      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
      0
    5. Mathilde
       
      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?
      0