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 :

Espace pile insuffisant (Erreur 28)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Février 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Gestionnaire

    Informations forums :
    Inscription : Février 2022
    Messages : 4
    Par défaut Espace pile insuffisant (Erreur 28)
    Bonjour,

    Je me permets de poster sur ce forum pour demander de l'aide. Un point de contexte, j'ai appris le codage VBA "sur le tas" dans le cadre de mon emploi afin de faciliter le traitement de certaine tâche.

    Aujourd'hui j'essaye de déployer un "outil" Excel chez un collègue mais je rencontre des difficultés car lors de l'exécution, une erreur de type 28 - Espace pile insuffisant apparait sur son ordinateur. Je précise bien son ordinateur car je ne rencontre aucune difficulté sur le mien.

    La seule différence que j'ai trouvé entre nos deux machines est un Excel en 32 bits (chez moi) et 64 bits (chez lui). Est-ce que le problème serait issu de cette différence de version ? Mes connaissances en VBA ne sont pas assez poussées et je trouve que ma macro est assez "simple". Peut être ai-je omis des configurations importantes qui empêchent le portage ? Auriez-vous un avis sur la question ?

    Je vous laisse la macro ci-dessous si vous trouvez quelque chose de flagrant à modifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
        Dim MaVar1
        Dim MaVar2
        Dim MaVar3
        Dim MaVar4
        Dim MaVar5
        Dim MaVar6
        Dim MaVar7
        Dim MaVar8
     
     
     
     
    Sub MacroIntégration()
    '
    'Macro intégration macro
        Sheets("Extraction WC").Select
        Range("J2").Select
        Call MacroInsertion
    End Sub
     
    Sub MacroInsertion()
     
    Dim X
    X = Selection.Value
     
            MaVar1 = ActiveCell.Offset(0, -9)
            MaVar2 = ActiveCell.Offset(0, -8)
            MaVar3 = ActiveCell.Offset(0, -7)
            MaVar4 = ActiveCell.Offset(0, -6)
            MaVar5 = ActiveCell.Offset(0, -5)
            MaVar6 = ActiveCell.Offset(0, -4)
            MaVar7 = ActiveCell.Offset(0, -2)
            MaVar8 = ActiveCell.Offset(0, -1)
     
    If X = "x" Then 'si la valeur n'est pas présente dans le tableau synthèse
     
     
            Sheets("Tableau 1").Rows("2:2").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 'insertion cellule en bas
            Sheets("Tableau 1").Cells(2, 2) = MaVar1
            Sheets("Tableau 1").Cells(2, 3) = MaVar2
            Sheets("Tableau 1").Cells(2, 4) = MaVar3
            Sheets("Tableau 1").Cells(2, 10) = MaVar4
            Sheets("Tableau 1").Cells(2, 11) = MaVar5
            Sheets("Tableau 1").Cells(2, 12) = MaVar6
            Sheets("Tableau 1").Cells(2, 13) = MaVar7
            Sheets("Tableau 1").Cells(2, 14) = MaVar8
     
            ActiveCell.Offset(1, 0).Range("A1").Select 'Décalagae vers le bas
            Call MacroInsertion
     
    ElseIf Selection.Value > 0 Then
     
     
     
            MaVarRésultat = ActiveCell.Offset(0, 1) 'sauvegarde montant
            Sheets("Tableau 1").Cells(2, 2) = MaVar1
            Sheets("Tableau 1").Cells(2, 3) = MaVar2
            Sheets("Tableau 1").Cells(2, 4) = MaVar3
            Sheets("Tableau 1").Cells(2, 10) = MaVar4
            Sheets("Tableau 1").Cells(2, 11) = MaVar5
            Sheets("Tableau 1").Cells(2, 12) = MaVar6
            Sheets("Tableau 1").Cells(2, 13) = MaVar7
            Sheets("Tableau 1").Cells(2, 14) = MaVar8
     
        ActiveCell.Offset(1, 0).Range("A1").Select 'Décalagae vers le bas
        Call MacroInsertion
     
     
    ElseIf Selection.Value = "" Then
     
            MsgBox ("traitement complété")
     
    End If
     
    End Sub
    J'ai cherché de mon côté avant de poster mais je me trouve un peu désemparé soit par la complexité des informations que je trouve soit parce que je ne pense pas que ce soit pertinent.

    Merci par avance pour tout aide ou avis.

    Bien cordialement,

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    hello,
    je ne sais pas ce que doit faire ta macro à l'origine mais ce qui est louche ce que tu appelles la procédure MacroInsertion à l'intérieur de la procédure Macroinsertion. Il y a de fortes chances alors qu'il y ait un bouclage infernal avec à chaque fois l'utilisation de la pile à cause du call. Cela entraîne alors au bout d'un certain nombre d'appels une saturation de la pile.
    Ami calmant, J.P

  3. #3
    Candidat au Club
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Février 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Gestionnaire

    Informations forums :
    Inscription : Février 2022
    Messages : 4
    Par défaut
    Bonjour et merci pour ton regard extérieur,

    Le but de la macro est de mettre à jour un tableau sur l'onglet 1 par rapport à une extraction (présente sur l'onglet 2).
    Grace à une formule EQUIV, le tableur Excel est capable de savoir si la ligne de l'extraction est présente dans le tableau.
    Suivant cela 3 choix :
    - si EQUIV = X => ligne absente : rajout d'une ligne avec les données
    - si EQUIV = [un chiffre correspondant à la ligne du tableau de l'onglet 1] => présent : mise à jour des données
    - si EQUIV = " " => Fin de la macro car nous sommes arrivés à la fin de l'extraction.

    Existerait-il une solution moins gourmande en ressource ? Ce qui est "frustrant" c'est que je l'utilise depuis 3 ans sans soucis et qu'aujourd'hui sur une nouvelle machine cela ne fonctionne plus correctement (arrêt à la 360ème ligne sur 400+ alors que de mon côté j'en traite plus de 3600)

    Je suis prêt à la réécrire sans soucis. Mais je ne vois pas comment la rendre plus performante.

    EDIT : J'oubliais, je précise que j'ai réécris la macro en la subdivisant en sous macro de tel manière à ce que :

    Macro Insertion
    Appelle macro 1 / 2 / 3 suivant les conditions puis que Macro 1 / 2 /3 appelle macro insertion pour reformer la boucle.
    Le résultat est que le bug apparait encore plus rapidement...

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    D'après votre code, il semble que vous utilisiez encore les plages classiques et non des tableaux structurés

    Personnellement, je prévoirais une colonne supplémentaire à la table à mettre à jour dans laquelle j'insérerais la formule utilisant la fonction EQUIV (Une ligne d'instruction)
    En 2, pour la mise à jour des existant une boucle avec comme critère le numéro de la ligne du nouveau tableau
    En 3, j'utiliserais le filtre avancé (méthode AdvancedFilter) pour ajouter à la liste d'origine toutes les lignes absentes (1 ligne de code)

    A lire éventuellement


    et bien entendu, je ne peux que vous conseiller de passer aux tableaux structurés
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    D 'après ce que j'ai compris de ta macro tu balaies la colonne J ligne par ligne à partir de J2 jusqu'à ce que tu trouves une valeur vide.
    Je te propose la méthode suivante :
    On fait une boucle tant que la valeur de la colonne J n'est pas vide et on change de ligne à la fin de la boucle.
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Sub MacroInsertion()
    Dim MaVar1
    Dim MaVar2
    Dim MaVar3
    Dim MaVar4
    Dim MaVar5
    Dim MaVar6
    Dim MaVar7
    Dim MaVar8
    Dim MaVarRésultat
    Dim X
    X = Selection.Value
    ' on boucle tant que X n'est pas  vide
    While X <> ""
            MaVar1 = ActiveCell.Offset(0, -9)
            MaVar2 = ActiveCell.Offset(0, -8)
            MaVar3 = ActiveCell.Offset(0, -7)
            MaVar4 = ActiveCell.Offset(0, -6)
            MaVar5 = ActiveCell.Offset(0, -5)
            MaVar6 = ActiveCell.Offset(0, -4)
            MaVar7 = ActiveCell.Offset(0, -2)
            MaVar8 = ActiveCell.Offset(0, -1)
     
    If X = "x" Then 'si la valeur n'est pas présente dans le tableau synthèse
     
            Sheets("Tableau 1").Rows("2:2").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 'insertion cellule en bas
            Sheets("Tableau 1").Cells(2, 2) = MaVar1
            Sheets("Tableau 1").Cells(2, 3) = MaVar2
            Sheets("Tableau 1").Cells(2, 4) = MaVar3
            Sheets("Tableau 1").Cells(2, 10) = MaVar4
            Sheets("Tableau 1").Cells(2, 11) = MaVar5
            Sheets("Tableau 1").Cells(2, 12) = MaVar6
            Sheets("Tableau 1").Cells(2, 13) = MaVar7
            Sheets("Tableau 1").Cells(2, 14) = MaVar8
     
    ElseIf Selection.Value > 0 Then
     
     
            MaVarRésultat = ActiveCell.Offset(0, 1) 'sauvegarde montant
            Sheets("Tableau 1").Cells(2, 2) = MaVar1
            Sheets("Tableau 1").Cells(2, 3) = MaVar2
            Sheets("Tableau 1").Cells(2, 4) = MaVar3
            Sheets("Tableau 1").Cells(2, 10) = MaVar4
            Sheets("Tableau 1").Cells(2, 11) = MaVar5
            Sheets("Tableau 1").Cells(2, 12) = MaVar6
            Sheets("Tableau 1").Cells(2, 13) = MaVar7
            Sheets("Tableau 1").Cells(2, 14) = MaVar8
    End If
    'on descend d'une ligne
    ActiveCell.Offset(1, 0).Select 'Décalagae vers le bas
    X = Selection.Value
    Wend  ' fin de la boucle
    MsgBox ("traitement complété")
     
    End Sub
    Normalement cela devrait faire la même chose que ta procédure. A essayer sur un classeur de test par sécurité. Sinon utilise la méthode à Philippe

    Ami calmant, J.P

  6. #6
    Candidat au Club
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Février 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Gestionnaire

    Informations forums :
    Inscription : Février 2022
    Messages : 4
    Par défaut
    @Jurassik Pork,

    Un grand merci, j'ai testé ta solution et il semblerait que le problème ait disparu. Je vais continuer comme cela dans un premier temps. Cela va me permettre de continuer l'exploitation de l'outil.

    @Philippe Tulliez,

    Effectivement les notions que vous abordez me sont étrangères de premier abord. Il va falloir que j'entame une réelle formation même si cela doit être en "autodidacte". Je vais approfondir grâce aux liens que vous m'avez fournis. Je dois réécrire une partie du programme pour lui permettre de mieux répondre à nos besoins, je le ferai après avoir travaillé tout cela ; histoire d'avoir quelque chose de propre.

    Merci à vous pour votre aide et vos solutions vous avez été tellement réactif c'est incroyable.

Discussions similaires

  1. [AC-2010] Erreur N° 28 Espace pile insuffisant
    Par Hanyf dans le forum VBA Access
    Réponses: 6
    Dernier message: 31/01/2018, 19h20
  2. [VBA]" Erreur d'exécution '28' espace pile insuffisant"
    Par serialkiddy dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 24/02/2017, 10h34
  3. [XL-2013] Erreur "Espace Pile insuffisant"
    Par Ghost0000 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 30/03/2016, 13h20
  4. [XL-2000] VBA Erreur 1004 espace pile insuffisant
    Par L'Albatros dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 17/07/2013, 13h34
  5. MsFlexgrid - ESpace de pile insuffisant (erreur 28)
    Par GodGives dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 17/10/2007, 13h18

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