mimi_939
Messages postés50Date d'inscriptionvendredi 31 décembre 2004StatutMembreDernière intervention 3 août 2007
-
30 juin 2007 à 10:34
mimi_939
Messages postés50Date d'inscriptionvendredi 31 décembre 2004StatutMembreDernière intervention 3 août 2007
-
4 juil. 2007 à 13:30
Bonjour,
je suis en train de développer une application en utilisant excel.
J'ai créé un module qui est appelé à chaque fois qu'on modifie la valeur d'une certaine colonne (liste) dans la feuille active.
Seulement, toutes les valeurs marchent sauf une. Quand je met "PAS PRÊT ALERTE 2" comme choix, une erreur s'affiche : Erreur d'exécution '28' Espace pile insuffisante
Et pourtant quand je valide l'erreur, le traitement est quand même effectué.
Pouvez vous m'aidez à savoir d'où ça vient et comment résoudre ce problème ?
Merci bien.
Voilà mon code :
Sub Gestion_Retard()
Dim x As Integer
Dim y As Integer
Dim z As Integer
Dim t As Integer
Dim nomTBdependant As String
Dim nomTB1 As String
'Blocage de l'écran
Application.ScreenUpdating = False
TBPrincipal = Evaluate("TBPrincipal")
Application.Goto Reference:="Curseur"
'Récupère le numéro de la dernière ligne de la zone
dernièreLigne1 = Cells(65536, 1).End(xlUp).Row
'Instruction de blocage du recalcul automatique
Application.Calculation = xlCalculationManual
For x = 6 To 31 'dernièreLigne1
Select Case Range("H" & x).Value
Case "PAS PRÊT - ALERTE 2"
Range("D" & x).Value = "RETARD !"
For y = 2 To 27
z = 0
Do While Sheets("TB").Range(Chr(67 + z) & y).Value <> ""
nomTB1 = Sheets("TB").Range(Chr(67 + z) & y).Value
If Range("C" & x).Value = nomTB1 Then
nomTBdependant = Sheets("TB").Range("B" & y).Value
For t = 6 To 31
If Range("C" & t).Value = nomTBdependant Then
Range("D" & t).Value = "RETARD ! cause : TB " & Range("C" & x).Value
Range("H" & t).Value = "EN ATTENTE DES SOURCES"
End If
Next t
Exit Do
Else
If Sheets("TB").Range(Chr(67 + z) & y).Value = "" Then
z = z + 1
Exit Do
End If
End If
z = z + 1
Loop
Next y
Case "LIVRE"
Range("D" & x).Value = "OK"
Case "PRÊT"
Range("D" & x).Value = ""
Case Else
If Range("D" & x).Value = "RETARD !" Then
Range("D" & x).Value = ""
ElseIf Range("D" & x).Value = "OK" Then
Range("D" & x).Value = ""
End If
End Select
Next x
'Instruction de déblocage du recalcul automatique
Application.Calculation = xlCalculationAutomatic
End Sub
PS : Avant d'utiliser un select case, j'utilisais des If ... Then... Else, l'erreur ne se produisait pas mais le temps d'exécution était interminable.
mimi_939
Messages postés50Date d'inscriptionvendredi 31 décembre 2004StatutMembreDernière intervention 3 août 2007 30 juin 2007 à 11:29
Oui merci, j'ai effectué les modifications que vous m'avez conseillé. Je n'ai plus l'erreur. Par contre, le temps d'exécution est trop long. Il faut que je tape Echap pour arreter l'exécution, et le traitement est quand même effectué.
Il semblerait que j'ai trop d'appel à ce module.
Comment faire pour réduire le temps d'exécution ?
Mon algo est trop complexe ?
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201822 30 juin 2007 à 13:31
Do While Sheets("TB").Range(Chr(67 + z) & y).Value
Tu pourrais initialiser z = 3 ' tu sembles commencer à C (colonne 3)
et utiliser
Cells(y, z)
De cette manière, tu ne te limites pas aux colonnes C à Z
Aussi,
Next t
Exit Do
Else
If Sheets("TB").Range(Chr(67 + z) & y).Value = "" Then
z = z + 1 Exit Do
End If
End If
z = z + 1 Loop
Next y
J'enlèverais la condition en bleu qui n'est pas nécessaire
MPi
Vous n’avez pas trouvé la réponse que vous recherchez ?
mimi_939
Messages postés50Date d'inscriptionvendredi 31 décembre 2004StatutMembreDernière intervention 3 août 2007 3 juil. 2007 à 10:18
Merci beaucoup pour la réponse précédente!
J'ai cru que cette modification m'avait résolu complètement mon problème.
Seulement, il y a un petit problème.
Au début, j'ai eu aucun problème, dès que je faisais une modification dans la colonne en question, le traitement était instantané mais de temps en temps, le problème se présente à nouveau sans que j'ai changé le code.
Je ne comprends plus, y a-t-il un moyen de résoudre définitivement le problème. C'est assez curieux quand même.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201822 3 juil. 2007 à 11:47
Tu refais 2 fois la boucle 6 to 31
... à première vue, je ne pense pas que ce soit nécessaire. En fait, il doit y avoir moyen d'en laisser tomber une, non ?
Peut-être que si tu copiais/collais une partie de tes données et expliquais ce que tu cherches à faire, ce serait plus simple te t'aiguiller (?) seulement quelques lignes et quelques colonnes pour faciliter la lecture...
La colonne "Etat du Tb" est une liste déroulante et on peut choisir 1 valeur parmi plusieurs. En fonction de la valeur choisie par l'utilisateur, je veux effectuer un traitement sur la colonne "Prévisions". Par exemple, si je choisi la valeur "PAS PRÊT ALERTE NIVEAU 2", je voudrais que dans prévisions il y ait RETARD qui s'inscrive! Si un Tableau de bord en retard a une incidence sur un autre TB, alors lui aussi sera en retard et en plus je veux indiqué le Tb en cause...
Voila en gros les traitements que je veux effectuer!
J'espère que c'est assez explicite.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201822 3 juil. 2007 à 23:48
Lorsque tu dis "liste déroulante" veux-tu parler d'une liste de choix que tu remplis avec le menu "Validation" ?
J'ai encore de la difficulté à comprendre exactement ce que tu cherches à faire et tout ce qui est impliqué... mais peut-être que ce petit bout de code pourrait aider (?)
Donc, si tu as une liste déroulante, tu peux intercepter les changements dans Worksheet_Change(...)
Tu dois vérifier si la colonne est bien celle qui contient la liste et, selon le choix, inscrire les données nécessaire dans les cellules voisines sur la même ligne... j'espère que je suis dans la bonne voie... Pour mon test, j'ai mis la liste de choix dans la colonne J (10)
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 10 Then 'la colonne de la liste de choix
Select Case Target.Value
Case "LIVRE" 'différentes valeurs de cette liste de choix
Range("D" & Target.Row) = "OK"
Case "PAS PRÊT ALERTE NIVEAU 2"
Range("D" & Target.Row) = "RETARD ! cause : TB " & Range("C" & Target.Row)
Case "FAISABLE"
Range("D" & Target.Row) = "Whatever"
Case "PRÊT"
Range("D" & Target.Row) = ""
Case Else
If InStr(1, Range("D" & Target.Row), "RETARD !") > 0 Then
Range("D" & Target.Row) = ""
ElseIf Range("D" & Target.Row) = "OK" Then
Range("D" & Target.Row) = ""
End If
End Select
End If
End Sub
Il reste des choses à y ajouter, mais je pense que tu comprendras mon idée ...
en espérant que ça puisse s'adapter à ton problème...