XL 2010 [RESOLU] Arrêt temporaire evenement

cathodique

XLDnaute Barbatruc
Bonjour:),

Mais critères de recherches ne m'ont pas mené bien loin.
Une feuille me sert à saisir des données à archiver et de consultation de ces mêmes données.
le haut de la feuille est l'en-tête jusqu'à ligne 10, à partir de ligne 12 le tableau de données.
la macro ci-dessous gère événement sur colonne C (12 à 50)
VB:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Range("C12:C50"), Target) Is Nothing Then
        If Not IsEmpty(Target) Then
            Call MontantBudgetPrévision
        Else
            Target.Resize(, 5).Value = ""
            Target.Resize(, 5).Borders.LineStyle = xlNone
        End If
    End If
End Sub
Mon souci (remarqué au pas à pas), quand j'exécute la macro de consultation (elle reconstitue l'en-tête avant le tableau) pour chaque ligne de code, la macro évènementielle s’exécute alors que les cellules concernées ne sont pas sollicitées.

Je pose ma question. Est-il possible d'arrêter temporairement un événement Feuille de calcul?

En vous remerciant par avance.

Bon dimanche à toutes et à tous.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour cathodique :),

Pas certain d'avoir bien compris.
Une piste ci-dessous. La gestion d'erreur n'est présente que pour réactiver la détection des évènements en cas d'erreur.
VB:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Range("C12:C50"), Target) Is Nothing Then
    On Error GoTo Err001
    Application.EnableEvents = False
    If Not IsEmpty(Target) Then
      Call MontantBudgetPrévision
    Else
      Target.Resize(, 5).Value = ""
      Target.Resize(, 5).Borders.LineStyle = xlNone
    End If
  End If
  Application.EnableEvents = True
  Exit Sub

Err001:
  MsgBox "Erreur n° " & Err.Number & vbLf & Err.Description
  Application.EnableEvents = True
End Sub
 

cathodique

XLDnaute Barbatruc
Merci beaucoup Mapomme:),

En fait, je n'ai pas d'erreur d'exécution (la macro ne plante pas).
Désolé de ne pouvoir joindre le fichier (trop "gros":D).

Voilà, pour consulter je mets 1 chiffre en G6 et clique sur un bouton qui déclenche la macro qui remplit l'entete (de A1 à G9) et les détails (de C12 à E&dl). En suivant au pas à pas le déroulement de la macro, j'ai constaté que lors de la reconstitution de l'entete (normalement ses cellules ne sont pas concernées par l'évènement de la feuille) pour chaque ligne de code, l'évènement change de la feuille est appelé.

peut-on arrêter cet appel plus qu'il y a cette condition If Not Intersect(Range("C12:C50"), Target) Is Nothing

Normalement, avec cette condition la macro n'est pas appelée ou je me trompe.

Merci.
 

cathodique

XLDnaute Barbatruc
Merci beaucoup Pierrejean:) de t'intéresser à mon problème.

Je t'avoue que ça me prendra un bon bout de temps pour monter un fichier. De plus il ne reflétera sûrement pas le fichier original.

Je n'ai pas de plantage, le code fonctionne bien.
J'ai juste constaté qu'au pas à pas pour chaque ligne de code de la macro de consultation, ça passer par worksheets_change. Et, je me demandais si le déroulement du programme était normal.

Pour la macro MontantBudgetPrévision, à partir de ligne 12 colonne C il y a une liste de validation, en sélectionnant un compte, je devais récupérer les montants des budgets et Prévisions dans 2 tableaux différents sur une autres feuille.
VB:
Sub MontantBudgetPrévision()
Dim c As Range, Plage As Range, x As String
Dim L As Byte, Cl As Byte, L1 As Byte, C1 As Byte
Application.ScreenUpdating = False

L1 = ActiveCell.Row
C1 = ActiveCell.Column
x = Sheets("Opérations").Cells(L1, C1).Value
Set Plage = Sheets("Paramètres").UsedRange
Set c = Plage.Find(What:=x)
If Not c Is Nothing Then
    L = c.Row
    Cl = c.Column
   ActiveCell.Offset(, 4) = Sheets("Paramètres").Cells(L, Cl).Offset(, 1)
End If
Application.ScreenUpdating = True
Merci de proposer ton aide.
Bon dimanche.
 

pierrejean

XLDnaute Barbatruc
Re
Veux-tu tester ceci:
Code:
Sub MontantBudgetPrévision()
Dim c As Range, Plage As Range, x As String
Dim L As Byte, Cl As Byte, L1 As Byte, C1 As Byte
Application.ScreenUpdating = False

L1 = ActiveCell.Row
C1 = ActiveCell.Column
x = Sheets("Opérations").Cells(L1, C1).Value
Set Plage = Sheets("Paramètres").UsedRange
Set c = Plage.Find(What:=x)
If Not c Is Nothing Then
    L = c.Row
    Cl = c.Column
   Application.EnableEvents = False
   ActiveCell.Offset(, 4) = Sheets("Paramètres").Cells(L, Cl).Offset(, 1)
   Application.EnableEvents = True
End If
Application.ScreenUpdating = True
 

job75

XLDnaute Barbatruc
Bonjour cathodique, mapomme, pierrejean,

Worksheet_Change plante si par exemple on efface une plage de cellules disjointes en colonne C.

Il faut analyser les cellules modifiées une par une et paramétrer la macro MontantBudgetPrévision :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Range("C12:C50"), Target) Is Nothing Then
        For Each Target In Intersect(Range("C12:C50"), Target)
            If Not IsEmpty(Target) Then
                MontantBudgetPrévision Target
            Else
                Target(1, 2).Resize(, 4) = ""
                Target.Resize(, 5).Borders.LineStyle = xlNone
            End If
        Next
    End If
End Sub
Code:
Sub MontantBudgetPrévision(Target As Range)
Dim lig As Long, col As Integer, x As String, C As Range
lig = Target.Row
col = Target.Column
x = Sheets("Opérations").Cells(lig, col)
Set C = Sheets("Paramètres").UsedRange.Find(What:=x)
If Not C Is Nothing Then Target(1, 5) = C(1, 2)
End Sub
Je n'ai pas essayé de tester la 2ème macro ...

A+
 

Dranreb

XLDnaute Barbatruc
Bonjour.
C'est hélas 'normal' que même si elle est n'est induite que par du code une modification de cellule provoque l'exécution de la Worksheet_Change. Ça ne sert à rien, ce n'est qu'une source d'ennui, mais c'est comme ça. Il n'y a pas de dispositif analogue à la protection avec un paramètre UserInterfaceOnly.
Mais il ne fallait pas passer à coté de la proposition de mapomme qui montre qu'on peut l'empêcher en mettant Application.EnableEvents = False avant l'instruction effectuant la modification.
 

cathodique

XLDnaute Barbatruc
Dranreb:), Job7:), Pierrejean:), Mapomme:),

Merci du fond du cœur pour votre aide. J'ai testé vos propositions.
Maintenant, avec du recul, il me semble que j'ai posé hâtivement ma question.
Etant donné qu'on sollicite worksheet_change, target c'est bien chaque cellule de la feuille
et dans la suite du code on vérifie sur quelles cellules doit agir la suite du code.
Du coup, en testant tous vos codes au pas à pas, je me suis aperçu qu'obligatoirement le code de la feuille est invoqué pour cellule de la feuille et Application.EnableEvents = False ne faisait rien (dans mon cas).

@job75;), ta 2ème macro, je n'y avais pas pensé. Merci.

Merci à vous. Bonne fin de dimanche.
Joyeuse fête du travail ou du travailleur?:rolleyes:
 

Discussions similaires

Réponses
0
Affichages
176
Réponses
7
Affichages
359

Membres actuellement en ligne

Statistiques des forums

Discussions
312 489
Messages
2 088 855
Membres
103 977
dernier inscrit
Hermet