Problème de boucle infini

Boby94

XLDnaute Nouveau
Bonjour à tous.

J'ai un problème que je n'arrive pas à m'expliquer.

J'ai une boucle infini qui se met en route lors du lancement d'un macro alors qu'elle ne devrait pas exister.

Je souhaite récupérer la ligne et la colonne de certaine case spécifique qui entraine l'exécution d'une macro. Mais lorsque la macro s'execute, elle tourne en boucle.

Voici les codes que j'utilise.

Dans la feuille, pour récuperer la ligne et la colonne sachant que je n'autorise que des valeurs numériques.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
LigneCellule = ActiveCell.Row
ColonneCellule = ActiveCell.Column
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If ColonneCellule = 7 Then
Select Case LigneCellule
Case 13, 14, 15, 19, 20, 24, 25, 26, 27
If Not IsNumeric(Cells(LigneCellule, ColonneCellule)) Then
Cells(LigneCellule, ColonneCellule).Select
MsgBox "Veuillez renseigner un nombre dans cette case"
Exit Sub
Else
Call CalculSignal
End If
End Select
End If
End Sub

Dans un module, les macros utilisées sont les suivantes (j'ai simplifié mais le problème reste le même)

Sub CalculSignal()
If IsEmpty(Cells(LigneCellule, ColonneCellule)) Then Exit Sub
Call macro1
Call macro2
End Sub

Sub macro1()
Cells(LigneCellule, ColonneCellule + 4).Value = 1
End Sub

Sub macro2()
Cells(LigneCellule, ColonneCellule + 1).Value = 2
End Sub

Je ne trouve aucune solution à ce problème depuis hier.

Note: Si je n'execute que macro1 ou que macro2, la boucle n'apparait pas...
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Problème de boucle infini

Bonjour Boby, bonjour le forum,

Je te propose de supprimer l'événement SelectionChange avec ton code simplifié ci-dessous :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 7 Then
    Select Case Target.Row
        Case 13, 14, 15, 19, 20, 24, 25, 26, 27
            If Not IsNumeric(Target) Then
                Target.Select
                MsgBox "Veuillez renseigner un nombre dans cette case"
                'Target.ClearContents 'éventuellement...
                Exit Sub
            Else
                Call CalculSignal
            End If
    End Select
End If
End Sub
 
Sub CalculSignal()
If IsEmpty(ActiveCell) Then Exit Sub
Call macro1
End Sub
 
Sub macro1()
Cells(LigneCellule, ColonneCellule + 4).Value = 1
ActiveCell.Offset(0, 1).Value = 2
ActiveCell.Offset(0, 4).Value = 1
End Sub
 

piefra

XLDnaute Nouveau
Re : Problème de boucle infini

salut,

il faudrait savoir comment sont declares tes variables

LigneCellule = ActiveCell.Row
ColonneCellule = ActiveCell.Column

n'a pas d'effet si ce sont des variables locales ( par defaut )
il vaudrait mieux les passer en parametre de fonction / procedure byref afin que ces dernieres puissent etres actualisees

deplus "Cells(LigneCellule, ColonneCellule + 4).Value = 1" change la valeur de la celulle mais ne deplace pas la selection

je pense que ca tourne en rond parce que tu modifie toujours la meme celule et que la function sheet_change ne tombe jamais sur le exit sub car le curseur n'avance pas
le seul truc qui fait avancer le curseur serait "Cells(LigneCellule, ColonneCellule).Select"
mais pour y arriver il faut etre sur la bonne case et qu'elle ne soit pas numerique

voila je t'explique juste ce que j'ai compris de ton code
pour moi c'est un defaut d'organigramme , si il existe
( Organigramme de programmation - Wikipédia )
 

Boby94

XLDnaute Nouveau
Re : Problème de boucle infini

Bonjour Boby, bonjour le forum,

Je te propose de supprimer l'événement SelectionChange avec ton code simplifié ci-dessous :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 7 Then
    Select Case Target.Row
        Case 13, 14, 15, 19, 20, 24, 25, 26, 27
            If Not IsNumeric(Target) Then
                Target.Select
                MsgBox "Veuillez renseigner un nombre dans cette case"
                'Target.ClearContents 'éventuellement...
                Exit Sub
            Else
                Call CalculSignal
            End If
    End Select
End If
End Sub
 
Sub CalculSignal()
If IsEmpty(ActiveCell) Then Exit Sub
Call macro1
End Sub
 
Sub macro1()
Cells(LigneCellule, ColonneCellule + 4).Value = 1
ActiveCell.Offset(0, 1).Value = 2
ActiveCell.Offset(0, 4).Value = 1
End Sub

Merci pour cette réponse rapide et efficace, ça marche très bien. Je viens de me rendre compte a quoi servait ce fichu "ByVal Target As Range" :D.

En effet, je pense que l'événement "SelectionChange" me faisait bugguer le truc.

Je vous remercie pour votre aide.
 

Statistiques des forums

Discussions
312 286
Messages
2 086 801
Membres
103 392
dernier inscrit
doc_banane