IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Erreur d'exécution 6 Dépassement de capacité [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre expérimenté Avatar de Vadorblanc
    Profil pro
    Inscrit en
    Février 2008
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 309
    Points : 1 482
    Points
    1 482
    Par défaut Erreur d'exécution 6 Dépassement de capacité
    Bonjour
    J'ai ce code qui fonctionne sur d'autres classeurs sans aucun problème, mais qui ne fonctionne pas sur ce classeur, j'ai passé 4 heures à tout essayer, mais rien n'y fait, j'ai toujours Erreur d'exécution 6 Dépassement de capacité...ce code fait suite à d'autres lignes de code par :
    Call Module2SupprimeMotAdroitePour1ColonneAvecBoucle

    Je procède ainsi: j'ai mon module principal qui Appelle par Call les modules au fur et à mesure de l'avancement de leurs bon fonctionnement, et là quand j'appel ce lui ci, j'ai ce beug dont je ne comprends pas...

    Je ne sais plus quoi faire...

    Ce code supprime le mot de droite d'une chaine.

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Module2SupprimeMotAdroitePour1ColonneAvecBoucle()
     
    Dim derlig As Integer, i As Integer
      derlig = Range("B:B").SpecialCells(xlCellTypeLastCell).Row
      For i = 1 To derlig
        Range("B" & i).Value = Mid(Trim(Range("B" & i).Value), 1, InStrRev(" " & Trim(Range("B" & i).Value), " ") - 1)
      Next
    End Sub

  2. #2
    Membre expérimenté Avatar de Vadorblanc
    Profil pro
    Inscrit en
    Février 2008
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 309
    Points : 1 482
    Points
    1 482
    Par défaut
    En fait, je viens de m'apercevoir que si j'enregistre mon fichier là ou le code s'arrête, la macro fonctionne en la relançant, je pense qu'il me faudrait un code qui me vide la mémoire de ma dernière copie car c'est celà qui empêche la macro de s'exécuter.
    J'ai essayer de mettre ces lignes avant le lancement du code, mais c'est pareil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ' désactiver le rafraîchissement de l'écran pour accélérer le traitement
        Application.ScreenUpdating = False
        ' désactiver les alertes pour empêcher l'affichage
        ' des messages du genre "Voulez-vous etc."
        Application.DisplayAlerts = False

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Dans ton code tu désignes une plage (Range), mais tu ne parles pas de la feuille.

    En effet, par défaut ton code va s'opérer sur la feuille active (car tu n'indiques pas la feuille), es-tu sûr que ce soit la bonne actuellement ?

    De plus tu as des variables de type Entier (Integer), soit une limite de 32000, es-tu sûr que ta dernière ligne n'est pas supérieure à 32000 ? Change le type en long de tes deux variables pour voir.

    Philippe

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Salut

    Je pense également que le problème résulte du typage de i en integer

    A ce propos (et par ailleurs) :
    es-tu bien conscient de ce que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    derlig = Range("B:B").SpecialCells(xlCellTypeLastCell).Row
    fait que derlig est la ligne de la dernière cellule remplie du usedrange et non celle de la dernière cellule remplie de la colonne B ?
    Est-ce bien ce que tu veux ?

  5. #5
    Membre expérimenté Avatar de Vadorblanc
    Profil pro
    Inscrit en
    Février 2008
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 309
    Points : 1 482
    Points
    1 482
    Par défaut
    Bonjour babaothe, philippe

    J'ai bien lu vos conseils, j'ai modifié le code au plus simple en nombre de ligne, j'ai nommé la feuille et ...ça bloque, je ne touche rien, j'enregistre le fichier tel quel, je lance la macro et ça fonctionne ... je n'y comprends plus rien , un vrai casse tête ...pourtant j'utilise cette macro sur d'autres fichiers sans problême ... je vais encore essayer de chercher dans la mise en forme de la chaine, pour voir si c'est le contenu qui me bloque, il faut que je trouve, sinon je vais devoir chercher une autre macro qui supprime le mot à droite d'une chaine.
    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Module2SupprimeMotAdroitePour1ColonneAvecBoucle()
     
    Sheets(2).Range("B2:B10").Select
     
    Dim derlig As Integer, i As Integer
      derlig = Range("B2:B10").SpecialCells(xlCellTypeLastCell).Row
      For i = 1 To derlig
        Range("B" & i).Value = Mid(Trim(Range("B" & i).Value), 1, InStrRev(" " & Trim(Range("B" & i).Value), " ") - 1)
      Next
    End Sub

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    re salut

    Ecoute et ne crie pas partout que je suis un violent (ce qui est loin d'être le cas) :

    1) et surtout : je n'aime pas un tel mécanisme car il est dangereux (tel qu'il est) puisque, lancé plusieurs fois, il aboutirait nécessairement, au bout d'un certain nombre de fois, à des cellules vides !!! (mais c'est encore autre chose et je te laisse avec la décision à prendre ou à ne pas prendre de ne traiter ainsi que si au moins deux mots !)
    2) en analysant ton code, que vois-je ? ===>> que tu veux supprimer le dernier mot de chaque cellule entre B2 et B10. Bien ! cela sous-entend donc que tu veux traiter ainsi les seules cellules qui ne comportent pas de résultats résultant de formules ou fonctions ('sinon : ce serait tourner en rond !)
    3) dans un tel cas et lourdeurs pour lourdeurs (je n'aime décidément pas normalement utiliser de tels mécanismes de gestion d'erreur, mais je le fais là; pour une fois, pour que tu puisses "suivre" un peu) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Module2SupprimeMotAdroitePour1ColonneAvecBoucle()
      Dim plage As Range
      On Error Resume Next
      Set plage = Sheets(2).Range("B2:B10").SpecialCells(xlCellTypeConstants)
      If Not Err Then
        For Each c In plage
          c.Value = Mid(Trim(c.Value), 1, InStrRev(" " & Trim(c.Value), " ") - 1)
        Next
      End If
    End Sub
    voilà (et je regrette cette vraie lourdeur, crois-moi)

    EDIT : et je regrette également que tu n'aies pas su lire ni Philippe JOCHMANS, ni moi-même.
    Nous te parlions tous deux du typage de i.
    J'ai personnellement appelé ton attention sur un fait complémentaire précis, qui est tel que ton derlig (tel que calculé) dépasse probablement, pour les raisons que je t'ai signalées, la limite d'un Integer !

    Lis et relis calmement....
    Viendra alors, cette étape passée, une solution sans gestion d'erreur et donc plus "orthodoxe".
    Bonne analyse et bonne étude.

    EDIT :
    Allez ... regarde mais tiens compte de tout ce que j'ai dit plus haut (il te faut l'assimiler) :
    Tu veux quoi ? traiter toutes tes cellules du range B2:B10, mais il ne faut surtout pas "tripoter" celles contenant une formule de calcul (me relire) Tu n'as nul besoin de définir la dernière ligne (forcément 10 !) puisque tu as déjà défini la plage de traitement (CQFD). Alors ? tout bête ===>>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Module2SupprimeMotAdroitePour1ColonneAvecBoucle()
        For Each c In Sheets(2).Range("B2:B10")
          If Not c.HasFormula Then
            c.Value = Mid(Trim(c.Value), 1, InStrRev(" " & Trim(c.Value), " ") - 1)
          End If
        Next
    End Sub
    (et sans préjudice de ce que je t'ai dit à propos de la catastrophe que génèrerait plusieurs lancement successifs, hein... et que l'on peut gérer facilement avec une condition complémentaire fort simple)

    EDIT : et si finalement la plage B2:B10 n'était qu'un exemple, mais que tu pourrais avoir à traiter une plage plus importante et donc ne pas traiter au delà de sa dernière ligne remplie, dis-le et on "reduira" alors comme il le faut.

  7. #7
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Il faut être prudent lorsqu'on utilise SpecialCells(xlCellTypeLastCell)
    Faites ce petit test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
    Range("B50000") = "toto"
    Columns("B").Delete
    MsgBox Range("B:B").SpecialCells(xlCellTypeLastCell).Row
    End Sub
    La dernière ligne sera la ligne 50000 alors que la colonne B a été supprimée et qu'elle est entièrement vide...!
    Pour être certain que SpecialCells(xlCellTypeLastCell) prend bien en compte la dernière cellule utilisée il faut au préalable enregistrer le fichier.

    Et pour rejoindre babaothe, un autre test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
    Range("A14") = "toto"
    Range("B5") = "toto"
    MsgBox Range("B:B").SpecialCells(xlCellTypeLastCell).Row
    End Sub
    cela donnera la ligne 14 et non la dernière ligne de la colonne B qui est la ligne 5

  8. #8
    Membre expérimenté Avatar de Vadorblanc
    Profil pro
    Inscrit en
    Février 2008
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 309
    Points : 1 482
    Points
    1 482
    Par défaut
    Babaothe
    Je viens de tester ton code (celui qui blesse le professeur) et c'est super, tout fonctionne à merveille...malgré un code qui ne te convient pas du tout mais qui me remplit de joie.
    Je sais que cette macro supprime le mot de droite autant de fois qu'elle est lancée, mais dans mon projet je ne la lance qu'une fois pour le résultat attendu, et malgré comme tu l'écrits "cas et lourdeurs pour lourdeurs " elle fonctionne admirablement bien sur plus de 3000 lignes sans aucune erreur, même quand je la teste plusieurs fois de suite, elle supprime progressivement le mot de droite de la chaine jusqu'à la disparition complète de la chaine avec des lignes dont les chaines sont différentes en nombre de mots...pour moi c'est une superbe macro fiable et sans problème...un petit bijou qui va me faciliter la vie.

    Un grand merci pour ta macro.
    Quand je vois toutes les explications que tu apportes, vraiment je me sens redevable tu peux pas savoir, j'essaie avec mes connaissances de te suivre, mais crois moi, ce n'est pas de la mauvaise volonté, mais je peine énormément...mais je sens que j'avance, je la grimpe cette montagne toujours un peu plus.
    Ta deuxième macro fonctionne aussi très bien, du coup je ne sais plus laquelle choisir...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Module2SupprimeMotAdroitePour1ColonneAvecBoucle()
        For Each c In Sheets(2).Range("B1", Range("B1").End(xlDown))
          If Not c.HasFormula Then
            c.Value = Mid(Trim(c.Value), 1, InStrRev(" " & Trim(c.Value), " ") - 1)
          End If
        Next
    End Sub
    Un grand merci

    Fring bonjour
    Je lis attentivement tes explications et je fais les tests
    Merci pour tout

    Bien cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. "erreur d'exécution" dépassement de capacité
    Par guigui71 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 30/04/2010, 01h04
  2. Erreur d'exécution '6': Dépassement de capacité
    Par XpFive dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 05/08/2009, 09h31
  3. Erreur d'éxecution '6' : dépassement de capacité
    Par mariafan dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 12/06/2008, 10h21
  4. [Access 2003] Erreur "Dépassement de capacité"
    Par Bapt.ice dans le forum Access
    Réponses: 2
    Dernier message: 08/06/2006, 12h15
  5. Réponses: 8
    Dernier message: 06/02/2006, 14h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo