Problème de gestion mémoire et utilisation ressources ...

cs_Sp00ky Messages postés 112 Date d'inscription vendredi 21 janvier 2005 Statut Membre Dernière intervention 20 novembre 2006 - 19 août 2005 à 14:55
cs_Sp00ky Messages postés 112 Date d'inscription vendredi 21 janvier 2005 Statut Membre Dernière intervention 20 novembre 2006 - 19 août 2005 à 16:01
Bonjour,

J'ai un problème de gestion de la mémoire et d'utilisation des ressources que je n'arrive pas à résoudre ...

J'ai un Classeur Excel 2003 sur lequel j'aimerais effectuer une macro sur une ligne à chaque modification d'une cellule de cette ligne.

Ainsi, dans le code de Feuil1, je mets :

Private Sub Worksheet_Change(ByVal Target As Range)
For Each Cellule In Target
If Cellule.Column <> Alertes_Col Then
l = Cellule.Row
If l <> old Then
Call Module5.Verif
old = l
End If
End If
Next
End Sub

Mon Module5.Verif contient une macro qui vérifie des choses dans la cellule.
Lorsque je l'appelle depuis un bouton placé sur ma feuille (et non pas automatiquement a chaque modif), cette macro marche parfaitement et c'est super rapide (c'est fait pour etre a chaque modification de cellule, donc c'est instantané le resultat)

Seulement dès qu'elle se lance d'elle meme quand je fais une modif dans une cellule, ca me mets une erreur 28 : Espace Pile Insuffisant. De plus, ca mets un certain temps avant d'afficher cette erreur, ca réfléchit anormalement.

J'ai essayé plusieurs méthodes :

1. Call Module5.Verif
=> cf plus haut

2. Executer à l'intérieur de Feuil1
= > Beaucoup trop lent, et si j'utilise des fonctions : Espace Pile Insuffisant

3. Verif(l) où l est la ligne
=> Beaucoup trop lent, et Espace Pile Insuffisant

4. Le meilleur : Verif.Show où Verif est un UserForm qui execute la macro au chargement.
> Parfait, cependant le UserForm se charge, et ne se ferme pas de lui même ...
Si je le fais se fermer par Verif.Hide, comme j'ai mis le code dans UserForm_Initialize, il ne le refait pas lors du prochain Verif.Show ...

Enfin bref, comment la faire executer de facon "normale" sans qu'elle rame, comme si je cliquais simplement sur le bouton (qui lui marche parfaitement) ... ?

merci !


<HR>

$p00ky
______________________________________________
.:: KoC-FR ::. Alliance Francophone Kings of Chaos
Venez jouer au meilleur MMORPG gratuit et facile !</FON< body>

3 réponses

BasicInstinct Messages postés 1470 Date d'inscription mardi 5 février 2002 Statut Membre Dernière intervention 20 octobre 2014 12
19 août 2005 à 15:34
'lut

j'ai eu le mm pb depile y'a pa si longtemps dans un tout autre contexte :

J'appellais ma fonction A qui me chargeait un combobox (et dc m'executait cbo_change)

dans CboChange j'appelais ma fonction B qui avait une sous-fonction qui appelais ma fonction A (me rechageant mon cbobox) etc.....

je pense que ton pb vient de la

tu modifies une cellule, ce qui execute worksheet_change qui modifie une cellule....

Perso, j'ai resolue le pb en gerant un boolean global qui sortait de cbochange si il avait pas l'executer...

BasicInstinct
0
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
19 août 2005 à 15:53
je pense que ta fonction tourne en boucle :

tu lance une fonction sur un evenement on_change d'une cellule A, mais cette fonction doit (enfin c'est ce que je pense) modifier la cellule A. donc quand la fonction modifie cette cellule, elle genere a nouveau l'evenement on_change, qui rappelle la fonction... qui remodifie la celleule A, ce qui rappelle la fonction... et c'est sans fin.

est-ce que tu pourrais nous donner le code de la fonction appelée.

sinon la solution pour eviter ca est de declarer une variable globale que tu place a True lorsque la fonction est en train de s'executer, et au debut de la fonction tu verifie si la variable est a True, tu sors directement de la fonction

public bIsFonctiunRunning as boolean

public function maFonction() as ...
if bIsFonctiunRunning then exit function
bIsFonctiunRunning = true

...
...
bIsFonctiunRunning = false
end function
0
cs_Sp00ky Messages postés 112 Date d'inscription vendredi 21 janvier 2005 Statut Membre Dernière intervention 20 novembre 2006 1
19 août 2005 à 16:01
Effectivement, ca devait venir de là, merci à vous deux ;)

En fait j'ai réussi a m'en sortir car je ne changeais qu'une colonne en particulier quand j'appellais la macro.
D'ailleurs j'avais résolu ce pb avec :
If Cellule.Column <> Alertes_Col Then
(cf premier post)

Donc il ne tournait aps en boucle puisque les modifs que faisaient la macro étaient dans Alertes_Col ....

En tous cas maintenant, ca marche !
Avec Verif.Show vbModeLess
et Verif.Hide .... va savoir pkoi ...



<HR>

$p00ky
______________________________________________
.:: KoC-FR ::. Alliance Francophone Kings of Chaos
Venez jouer au meilleur MMORPG gratuit et facile !</FON< body>
0
Rejoignez-nous