Erreur d'éxecution '6' - Dépassement de capacité - VB/VBA/VBS - Programmation
Marsh Posté le 15-04-2011 à 22:43:15
Salut,à vue de nez, sans aller plus loin pour le moment
|
sinon change le type de tes variables Integer en Long
puis Do Until .... Loop en
|
et balise ton code stp ( sélectionner le code puis cliquer sur icône Fixe )
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.
Marsh Posté le 15-04-2011 à 22:50:52
kiki29 a écrit : Salut,à vue de nez, sans aller plus loin pour le moment
|
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 !
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
Marsh Posté le 15-04-2011 à 22:56:39
FrenchGirl 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.
Marsh Posté le 15-04-2011 à 23:02:24
Harkonnen a écrit : |
Je confirme... Ca fait deux ans qu'il essaie de m'enseigner VBA, sans grand succès, voir aucun
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 ?
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!
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