Dépassement de capacité
Bonjour à toutes et à tous,
Je rencontre un problème avec une macro que je ne saurai régler seul...
Lorsque je lance la macro, il m'informe: "Dépassement de capacité". La macro fonctionne si je retire des lignes de la base de données "BD_Débarras". Est-ce possible de contourner cela en améliorant la macro?
Sub Transfert_données_sauv()
Dim i As Integer, k As Integer, DerLig As Integer
Dim tablo1, tablo2(), tablo3()
Application.ScreenUpdating = False
With Sheets("BD_Débarras")
tablo1 = .Range("A2:N" & .Range("A" & Rows.Count).End(xlUp).Row)
k = 0
For i = 1 To UBound(tablo1, 1)
If tablo1(i, 13) = "oui" Then
ReDim Preserve tablo2(2, k + 1)
ReDim Preserve tablo3(4, k + 1)
tablo2(0, k) = tablo1(i, 1)
tablo2(1, k) = tablo1(i, 2)
tablo3(0, k) = tablo1(i, 3)
tablo3(1, k) = tablo1(i, 11)
tablo3(2, k) = tablo1(i, 12)
tablo3(3, k) = tablo1(i, 14)
k = k + 1
End If
Next i
lgn = Range("A" & Rows.Count).End(xlUp)(2).Row
Range("A" & lgn).Resize(UBound(tablo2, 2), 2) = Application.Transpose(tablo2)
Range("E" & lgn).Resize(UBound(tablo3, 2), 4) = Application.Transpose(tablo3)
End With
MsgBox "MàJ terminée", vbExclamation
End Sub
Je vous remercie d'avance pour votre aide
Fabrice
Bonjour,
Je suppose que ta variable derlig et i devraient être déclarées en Long (et k ?) si tu as plus de 32767 lignes...
Cordialement.
Bonjour MFerrand, je te remercie pour ta réponse. N'étant pas un crack en macro (vraiment pas) cela se traduirait comment?
Comme cela?
Sub Transfert_données_sauvage()
Dim i As Long, k As Long, DerLig As Long
Dim tablo1, tablo2(), tablo3()
Application.ScreenUpdating = False
With Sheets("BD_Débarras")
tablo1 = .Range("A2:N" & .Range("A" & Rows.Count).End(xlUp).Row)
k = 0
For i = 1 To UBound(tablo1, 1)
If tablo1(i, 13) = "Oui" Then
ReDim Preserve tablo2(3, k + 1)
tablo2(6, k) = tablo1(i, 1)
tablo2(7, k) = tablo1(i, 2)
tablo2(13, k) = tablo1(i, 2)
tablo3(0, k) = tablo1(i, 3)
tablo3(1, k) = tablo1(i, 11)
tablo3(2, k) = tablo1(i, 12)
tablo3(3, k) = tablo1(i, 14)
k = k + 1
End If
Next i
lgn = Range("A" & Rows.Count).End(xlUp)(2).Row
Range("A" & lgn).Resize(UBound(tablo2, 2), 2) = Application.Transpose(tablo2)
Range("E" & lgn).Resize(UBound(tablo3, 2), 4) = Application.Transpose(tablo3)
End With
MsgBox "MàJ terminée", vbExclamation
End Sub
Merci pour ton aide et excellente journée.
Une variable Integer peut accueillir des valeurs numériques entières de -32768 à +32767.
Si tu risques d'être au-delà de ces limites, il faut donc les déclarer Long. Pour le nombre de lignes tu devrais savoir àquel niveau tu es et si cela peut être la cause de l'erreur 6 générée par ce type d'inadéquation.
Au vu seulement du code c'est ce qui pouvait être probable, ce qui ne veut pas dire que c'est ça, tant qu'on n'a pas trouvé...
L'erreur 9 n'a pas de lien avec la précédente, il faut voir sur quelle ligne elle se produit, et vérifier du côté des noms de feuilles et des indices de tableaux (ça produit la même erreur).
Sans voir le fichier, je ne peux guère en dire plus, on ne peut évoquer que des hypothèses plausibles...
Cordialement
Bonjour,
Merci pour ta réponse. Effectivement, mon fichier dépasse les 32767 ligne.
Cordiales salutations
Fabrice
PS: Si je modifie comme cela: Dim i As Long, k As Long, DerLig As Long il me donne: "l'indice n'appartient pas à la sélection"
Bonjour à toutes et à tous,
Je suis toujours embourbé dans mon problème de macro...
Je ne sais pas si quelqu'un arriverait à me résoudre ce problème? Je suis prêt à offrir un peu de chocolat Suisse
Bonne journée et au plaisir de vous lire.
Fabrice
Bonsoir,
L'erreur 6 est expliquée, et tu as la solution.
Le reste il faudrait que tu précises après avoir rectifié le premier.
NB- J'avais essayé de charger ton fichier au début, malgré mon aversion naturelle pour Dropbox, mais avec l'évaluation du temps de chargement qui ne cessait de croître, lorsqu'il a dépassé 3 minutes restantes, j'ai interrompu (mon expérience étant que ça n'annonce rien de bon pour la suite, alors j'évite quand je peux...
Cordialement.
- Messages
- 1'123
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
Bonjour FBF, Mferrand
A première vue, et quelques test en mode F8 cette modification permet de faire fonctionner ton code...
Dim i As Long
Dim k As Long
Dim DerLig As Long
Dim tablo1, tablo2(), tablo3()
Bonsoir,
Andrea73 (salut !) m'a fait penser à rejeter un oeil sur ton code cité...
Si tablo2 est bien redimensionné, je ne vois aucun dimensionnement de tablo3... A vérifier.
Bonjour
Bonjour, Andréa73 quand je modifie, il m'indique que l’indice n'appartient pas à la sélection :j'avoue que je suis perdu car je ne suis pas très doué en macro. Cette macro provient du web et je l'ai adaptée à mes besoins...
Bonjour, MFerrand, s'agissant du dimensionnement de tablo3 je ne sais pas trop comment faire...
Je n'arrive pas à joindre une version light (pour MFerrand) du document. cela ne passe pas en termes de volume (33508 lignes).
Bonne journée à vous deux et merci pour votre aide.
Fabrice
ReDim Preserve tablo2(3, k + 1)
ça, ça ne va pas non plus !
Tu dimensionnes à 3, et tu affectes les indices 6, 7, et 13 ! Et lors de l'affectation du tablo, tu dimensionnes 2 colonnes !!!
Pour la 2e dimension il faudrait dimensionner à k (et non k+1)
Il faut éclaircir Tablo2...
Pour Tablo3, le dimensionnement à :
ReDim Preserve tablo3(3, k)
devrait coller avec les affectations.
Pour le redimensionnement des plages, les indices partant de 0, c'est UBound... +1 qu'il faut pour ajuster, mais comme k a été incrémenté en fin de boucle et a donc une valeur supérieure de 1 au dernier indice pris par les tableaux, tu remplaces les UBound... par k pour dimensionner les lignes.
Reste à éclaircir la taille en colonnes de Tablo2 (et de la plage sur laquelle il sera affecté.
- Messages
- 1'123
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
Bonjour FBF, MFerrand
à MFerrand
oui, oui tu as tout à fait raisonMFerrand a écrit :Andrea73 (salut !) m'a fait penser à rejeter un oeil sur ton code cité...Si tablo2 est bien redimensionné, je ne vois aucun dimensionnement de tablo3... A vérifier.
Comme je disais
et il est vrai que je ne suis pas allé au bout du bout du code...andrea73 a écrit :A première vue, et quelques test en mode F8 cette modification permet de faire fonctionner ton code...
à FBF
Comme cité plus haut je ne suis pas allé au bout du test en mode debug (touche [F8]), cependant si tu ne sais pas
moi non plus, étant donné que je ne comprends pas bien le but de ton code ! je vais essayer de regarder ta PJ en version "plus"...FBF a écrit :s'agissant du dimensionnement de tablo3 je ne sais pas trop comment faire...
Bonjour à vous deux (MFerrand et Andrea73 )
Voilà...
Sub Transfert_données_sauvages()
Dim i As Long
Dim k As Long
Dim DerLig As Long
Dim tablo1, tablo2(), tablo3()
Application.ScreenUpdating = False
With Sheets("BD_Débarras")
tablo1 = .Range("A2:N" & .Range("A" & Rows.Count).End(xlUp).Row)
k = 0
For i = 1 To UBound(tablo1, 1)
If tablo1(i, 13) = "Oui" Then
ReDim Preserve tablo2(2, k + 1)
ReDim Preserve tablo3(4, k + 1)
tablo2(0, k) = tablo1(i, 1)
tablo2(1, k) = tablo1(i, 2)
tablo3(0, k) = tablo1(i, 3)
tablo3(1, k) = tablo1(i, 11)
tablo3(2, k) = tablo1(i, 12)
tablo3(3, k) = tablo1(i, 14)
k = k + 1
End If
Next i
lgn = Range("A" & Rows.Count).End(xlUp)(2).Row
Range("A" & lgn).Resize(UBound(tablo2, 2), 2) = Application.Transpose(tablo2)
Range("E" & lgn).Resize(UBound(tablo3, 2), 4) = Application.Transpose(tablo3)
End With
MsgBox "MàJ terminée", vbExclamation
End Sub
Et tout fonctionne...
Vraiment... merci merci et merci à vous deux.
Pas encore appris à utiliser les balises Codes ?
Tes indices me paraissent encore plutôt bizarres... mébon ! Tu vas bien voir !