Erreur d'éxecution '6' - Dépassement de capacité

Erreur d'éxecution '6' - Dépassement de capacité - VB/VBA/VBS - Programmation

Marsh Posté le 15-04-2011 à 22:25:14    

Bonsoir,  
 
J'ai lu un peu sur le forum les réponses revenants à ce sujet, mais problème, je ne trouve toujours pas la logique de la programmation  :??: .
Je vous explique alors mon problème, je dois rendre un projet utilisant VBA pour un mémoire d'économie, j'ai utilisé le même programme pour un autre pays (etats-unis) et tout fonctionne à la perfection. J'ai essayé de nouveau pour un autre pays mais là le programme bogue. De plus, l'erreur ne venait pas d'une autre variable. J'essaie d'augmenter la capacité de mon programme... Mais je n'y arrive toujours pas.  
 
Je vous laisse ici mon programme:
 

Sub ProcAnnéeTech()
Dim t As Integer
Dim prod As Integer
Dim prow as Integer
Dim i As integer
Dim j As integer
Dim n As Integeer
 
Dim wsACRSA As Worksheet
Dim année As String
Dim pays As String
 
pays = InputBox("Quel est le pays étudié?", "Choix du pays", "Portugal" )
Set wsACRSA = ThisWorkbook.Worksheets("Synthèse_année" )
prod = wsACRSA.Cells(Rows.Count, 1).End(xlUp).Row - 2
wsACRSA.Rows(prod + 3).Clear
wsACRSA.Cells(1, 2).Resize(Rows.Count, Columns.Count - 1).Clear
wsACRSA.Cells(1, 1).Value = "Tableau 2. " & pays & " : avantages comparatifs (1) selon l'intensité technologique"
 
n = InputBox("Quel est le nombre d'année?", "Nombre d'année", 5)
 
For i = 1 To n
année = InputBox("Quelle est l'année étudiée?", "Choix de l'année", "1969" )
wsACRSA.Cells(2, 1 + i).Value = année
 
t = 3
Do Until ThisWorkbook.Worksheets(pays).Cells(3, t).Value = année
t = t + 1
Loop
    For j = 1 To prod
    prow = 4
    Do Until ThisWorkbook.Worksheets(pays).Cells(prow, 4).Value = wsACRSA.Cells(2 + j, 1).Value
 [#ff3800]   prow = prow + 1[/#ff3800][i][b] => Raison du bogue[/b][/i]
    Loop
    wsACRSA.Cells(2 + j, 1 + i).Value = ThisWorkbook.Worksheets(pays).Cells(prow, t).Value
    Next j
Next i
 
With wsACRSA
.Cells(3, 2).Resize(prod, n).NumberFormat = "0.00"
.Cells(2, 2).Resize(prod + 1, n).HorizontalAlignment = xlCenter
.Rows("2:" & prod + 2).RowHeight = 18
.Cells(2 + prod + 1, 1).Value = "Note (1) mesurés par l'indicateur d'avantages comparatifs révélés symétriques de Balassa"
.Cells(2, 1).Resize(prod + 1, n + 1).Borders.LineStyle = xlContinuous
End With
 
End Sub


 
Je suis désolée de poster à nouveau un sujet sur ce thème, mais je n'y arrive vraiment pas toute seule.  
 
Bonne soirée à tous!


Message édité par FrenchGirl le 15-04-2011 à 23:05:22
Reply

Marsh Posté le 15-04-2011 à 22:25:14   

Reply

Marsh Posté le 15-04-2011 à 22:43:15    

Salut,à vue de nez, sans aller plus loin pour le moment


Dim n As Integeer ????


 
sinon change le type de tes variables Integer en Long
 
puis Do Until .... Loop en  


Do
.....
Loop Until ...


 
et balise ton code stp ( sélectionner le code puis cliquer sur icône Fixe )

Message cité 1 fois
Message édité par kiki29 le 15-04-2011 à 22:51:35
Reply

Marsh Posté le 15-04-2011 à 22:50:23    

Selon ce tableau : http://msdn.microsoft.com/en-us/li [...] S.90).aspx

 

Le type Integer a une taille de 16 bits signé, donc son éventail de valeurs possibles va de -32768 à +32767. Si tu as un dépassement de capacité à la ligne que tu as mentionnée, ça veut dire qu'à un moment donné, ta variable "prow" à force d'être incrémentée, dépasse sa capacité, et donc prend une valeur supérieur à 32767.

 

D'après la ligne au dessus de ta ligne en erreur, la condition de sortie de la boucle qui incrémente cette variable (la boucle Do Until...Loop) est que la cellule située à (prow, 4) de ta feuille "Pays" doit être égale à la cellule (2+j, 1) de ta feuille "Synthese_Annee".

 


Il est donc fort possible que cette condition ne soit jamais vraie, provoquant l'incrémentation infinie de ta variable prow, et donc un dépassement de sa capacité. A toi de vérifier tes 2 feuilles.

 

edit:
@kiki29 : changer le type en long ne fera que retarder le problème si la condition de sortie de la boucle Do Until...Loop n'est jamais respectée. Elle peut effectivement essayer de modifier le type de prow en Long. Si ça marche, alors ça veut dire que la condition est respectée au delà de la 32767eme ligne, sinon il faudra vérifier les sheets pour voir pourquoi la condition de sortie n'est jamais rencontrée.


Message édité par Harkonnen le 15-04-2011 à 22:57:06

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-04-2011 à 22:50:52    

kiki29 a écrit :

Salut,à vue de nez, sans aller plus loin pour le moment


Dim n As Integeer ????


 
sinon change le type de tes variables Integer en Long
 
puis Do Until .... Loop en  


Do
.....
Loop Until ...


 
et balise ton code stp


 
Parce que selon mon prof, as integer prend moins de mémoire... Donc je le suis plutôt, je ne savais même pas qu'on pouvait baliser un code !

Reply

Marsh Posté le 15-04-2011 à 22:55:45    

Re,regarde aussi la remarque d'Harkonnen
sinon oui cela prend moins de place mais en fait tu as interet à déclarer tes "Integer" en Long car sur les processeurs actuels cela est plus rapide


Message édité par kiki29 le 15-04-2011 à 22:56:14
Reply

Marsh Posté le 15-04-2011 à 22:56:39    

FrenchGirl a écrit :


 
Parce que selon mon prof, as integer prend moins de mémoire... Donc je le suis plutôt, je ne savais même pas qu'on pouvait baliser un code !


Ton prof est un idiot : on ne choisit pas le type des variables en fonction de la consommation mémoire, mais en fonction de la plage de valeurs qu'elles sont susceptibles de contenir.
Là en l'occurence, choisir Integer est inopportun, car une feuille Excel peut contenir jusqu'à 65535 lignes, soit bien au delà de la capacité d'un Integer. Et comme il n'existe pas d'Integer non signé en VBA, il faut passer direct à Long.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-04-2011 à 23:02:24    

Harkonnen a écrit :


Ton prof est un idiot : on ne choisit pas le type des variables en fonction de la consommation mémoire, mais en fonction de la plage de valeurs qu'elles sont susceptibles de contenir.
Là en l'occurence, choisir Integer est inopportun, car une feuille Excel peut contenir jusqu'à 65535 lignes, soit bien au delà de la capacité d'un Integer. Et comme il n'existe pas d'Integer non signé en VBA, il faut passer direct à Long.


 
Je confirme... Ca fait deux ans qu'il essaie de m'enseigner VBA, sans grand succès, voir aucun :/

Reply

Marsh Posté le 15-04-2011 à 23:04:07    

Sinon, comme je doute fort que tes feuilles Excel atteignent 32767 lignes, tu as vérifié pourquoi ta condition de sortie n'est jamais vraie ?

Message cité 1 fois
Message édité par Harkonnen le 15-04-2011 à 23:04:30

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-04-2011 à 23:08:05    

Harkonnen a écrit :

Sinon, comme je doute fort que tes feuilles Excel atteignent 32767 lignes, tu as vérifié pourquoi ta condition de sortie n'est jamais vraie ?


 
J'ai regardé oui, et il y a en théorie aucun problème mais je cherche une autre raison. Pour le coup non, vu que la feuille en question ne comporte que 9 colonnes et 32 lignes! Je vous tiens informer, si j'y arriver. En tout cas, merci énormément pour votre aide à vous et kiki!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed