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 :

[E-03] Pile pleine


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Par défaut [E-03] Pile pleine
    Bonjour. J'ai un petit problème de pile pleine avec excel 2003.

    Ce que je veut faire:
    -Dans une case("Nb_devise") j'ai un entier qui correspond au nombre de lignes de mon tableau.
    -Ensuite, dès que cette case est modifiée (elle peut l'être de plusieures manières), je trace des bordures sur le tableau, efface les cases dessous, et met des valeurs par défaut dans les champs vides.

    Mon problème: temps d'éxécution super long, voire plantage pour cause de pile pleine... je croit que c'est plot_borders qui fait planter mais je ne suis pas sur, et je ne sait pas pourquoi.

    Voici mon 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
    56
    57
    58
    59
    60
    Private Sub Worksheet_Change(ByVal Nb_Devise As Range)
     
         Dim tmp As Integer
         tmp = Range("Nb_Devise").Value
     
         'On trace les bordures autour du tableau des devises
         plot_borders (tmp)
     
         'On met des valeurs par défaut dans les cellules vides
         Dev_complete (tmp)
     
         'On efface les lignes inutilisées
         Dev_clean (tmp)
     
    End Sub
     
    Private Sub Dev_complete(tmp As Integer)
     
         'Si les cellules sont vides, alors on leur assigne les valeurs par défaut.
         For i = 0 To tmp - 1
             If IsEmpty(Range("Debut_Tab_Dev").Offset(i, 0)) And    IsEmpty(Range("Debut_Tab_Dev").Offset(i, 1)) Then
                 Range("Debut_Tab_Dev").Offset(tmp - 1, 0).Value = "#Name"
                 Range("Debut_Tab_Dev").Offset(tmp - 1, 1).Value = "#Value in USD"
             End If
         Next i
     
    End Sub
     
    Private Sub Dev_clean(tmp As Integer)
     
         Range(Range("Debut_Tab_Dev").Offset(tmp, 0), Range("Debut_Tab_Dev").Offset(tmp + 3, 1)).Value = ""
     
    End Sub
     
    Private Sub plot_borders(tmp As Integer)
     
         'On enleve les bordures en dessous du tableau
         Range(Range("Debut_Tab_dev").Offset(tmp, 0), Range("Debut_Tab_dev").Offset(tmp + 3, 1)).Borders.LineStyle = xlLineStyleNone
     
         'On place les bordures a gauche:
         With Range("Debut_Tab_Dev", Range("Debut_Tab_dev").Offset(tmp - 1, 0)).Borders
             .LineStyle = xlContinuous
             .Weight = xlThin
         End With
     
         With Range("Debut_Tab_Dev", Range("Debut_Tab_dev").Offset(tmp - 1, 0)).Borders(xlEdgeRight)
             .LineStyle = xlLineStyleNone
         End With
     
         'On place les bordures a droite
         With Range(Range("Debut_Tab_dev").Offset(0, 1), Range("Debut_Tab_dev").Offset(tmp - 1, 1)).Borders
             .Weight = xlThin
             .LineStyle = xlContinuous
         End With
     
         With Range(Range("Debut_Tab_dev").Offset(0, 1), Range("Debut_Tab_dev").Offset(tmp - 1, 1)).Borders(xlEdgeLeft)
             .LineStyle = xlLineStyleNone
         End With
     
    End Sub

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Par défaut
    En fait, dans "Nb_Devise", il y a la taille du tableau.

    Le tableau que j'encadre commence à "Debut_Tab_Dev", a 2 colonnes, et tmp lignes ...

    Ben j'ai bidouillé ce que je pouvais pour les autres fonctions, et si c'est pas comme ça qu'il faut faire en 2003, je vais attendre qu'une ame charitable vienne m'aider!

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Par défaut
    bonjour

    Tu déclenches depuis l'evenement Change, une procédure qui va modifier une cellule. Cela provoque une boucle récursive infinie.

    Utilise EnableEvents pour pallier ce phénomène :

    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
    Private Sub Worksheet_Change(ByVal Nb_Devise As Range)
         Dim tmp As Integer
     
         Application.EnableEvents = False
     
         tmp = Range("A1").Value
         'On met des valeurs par défaut dans les cellules vides
         Dev_complete (tmp)
         '
         '...
         '
     
         Application.EnableEvents = True
     
    End Sub

    http://silkyroad.developpez.com/VBA/EvenementsFeuille/



    bon week end
    michel

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Par défaut
    ah ... j'ai comprit!
    je croyais qu'on pouvait, grace au parametre, ne surveiller qu'une cellule de la feuille.

    merci beaucoup silky road

    bon week-end

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

Discussions similaires

  1. [VBA-E]problème de pile pleine
    Par stos dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/01/2007, 12h37
  2. La mémoire en Pmode et en Rmode - la pile
    Par le mage tophinus dans le forum Assembleur
    Réponses: 15
    Dernier message: 16/02/2003, 02h00
  3. Réponses: 17
    Dernier message: 17/10/2002, 21h06
  4. [TASM] Déclarer le segment de pile
    Par cipher dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 01/10/2002, 04h58
  5. plein écran
    Par patapetz dans le forum OpenGL
    Réponses: 9
    Dernier message: 21/08/2002, 15h15

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