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.

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é.

Bonjour FBF, MFerrand

à MFerrand

MFerrand 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.

oui, oui tu as tout à fait raison

Comme je disais

andrea73 a écrit :

A première vue, et quelques test en mode F8 cette modification permet de faire fonctionner ton code...

et il est vrai que je ne suis pas allé au bout du bout du 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

FBF a écrit :

s'agissant du dimensionnement de tablo3 je ne sais pas trop comment faire...

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"...

Bonjour à vous deux (MFerrand et Andrea73 )

Voilà... j'ai modifié ma macro ainsi:

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... Mille merci!!! à vous deux. Apparemment en vue des informations elle comporte encore des incohérences, je vais encore étudier tout cela et reste à dispo pour vos commentaires

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 !

Rechercher des sujets similaires à "depassement capacite"