Dépassement de capacité

Fermé
Mathilde - 3 sept. 2015 à 15:39
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 - 8 sept. 2015 à 14:18
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!
A voir également:

5 réponses

f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
3 sept. 2015 à 15:50
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
3 sept. 2015 à 15:54
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
3 sept. 2015 à 15:58
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701 > michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023
3 sept. 2015 à 16:02
Bonjour,

C'est un passe-temps comme un autre
0
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
3 sept. 2015 à 16:45
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
Modifié par f894009 le 4/09/2015 à 11:16
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
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701 > Mathilde
4 sept. 2015 à 14:49
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
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701 > Mathilde
Modifié par f894009 le 8/09/2015 à 14:06
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
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