Dépassement de capacité
Mathilde
-
f894009 Messages postés 17417 Date d'inscription Statut Membre Dernière intervention -
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!
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
-
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 -
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 ... -
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..... -
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 -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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-
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 -
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
-
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 -
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 -
-