Lancement d'une macro lorsque je change de feuille

Anonyme
2022-04-14T10:05:49+00:00

Bonjour,

J'ai un classeur avec 4 feuilles. Sur la feuille 1, j'ai une BD. Dans cette feuille 1, j'ai une macro (qui n'utilise que les valeurs de la feuille 1 et ne fait des changements que sur la feuille 1) qui va sélectionner des enregistrements et me créer une liste qui me servira pour les 3 autres feuilles. À chaque changement sur la feuille 1 je peux lancer une macro en Private Sub Worksheet_Change, mais la macro va se lancer très souvent et elle dure plus de 2 secondes.

Ce que je voudrais, c'est que, lorsque je quitte la feuille 1, la macro se lance (l'équivalent de BeforeClose du classeur). Si je la lance à l'activation d'une nouvelle feuille la macro va revenir sur feuille 1 pour faire le traitement et donc je ne m'en sors plus.

J'espère avoir été assez clair,

Richard

Microsoft 365 et Office | Excel | Pour la maison | Windows

Question verrouillée. Cette question a été migrée à partir de la Communauté Support Microsoft. Vous pouvez voter pour indiquer si elle est utile, mais vous ne pouvez pas ajouter de commentaires ou de réponses ni suivre la question.

0 commentaires Aucun commentaire

Réponse acceptée par l’auteur de la question

DanielCo 107.7K Points de réputation
2022-04-19T16:55:22+00:00

Tu définis ce nom à au moins 3 endroits. Fais une rechercche sur Names.Add

Cette réponse a-t-elle été utile ?

1 personne a trouvé cette réponse utile.
0 commentaires Aucun commentaire

Réponse acceptée par l’auteur de la question

DanielCo 107.7K Points de réputation
2022-04-18T17:27:11+00:00

Compris. Remplace la ligne :

.SetRange .Range("BA1:BJ" & NbActu)

par :

.SetRange Sheets("Adh").Range("BA1:BJ" & NbActu)

Daniel

Cette réponse a-t-elle été utile ?

1 personne a trouvé cette réponse utile.
0 commentaires Aucun commentaire

27 réponses supplémentaires

  1. DanielCo 107.7K Points de réputation
    2022-04-15T13:27:35+00:00

    Voici la macro rectifiée (à tester).

    Sub listImg() ' feuille Adh
    ' If ActiveSheet.Name <> "Adh" Then Exit Sub
    Application.ScreenUpdating = False
    ActiveSheet.Unprotect Password:="ricH"
    Application.EnableEvents = False
    With Sheets("Then")
    .Columns("BA:BJ").Delete Shift:=xlToLeft
    NbTot = .Range("AH6") - 1
    .Range("A1:J" & NbTot).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range( _
    "AA29:AA30"), CopyToRange:=.Range("BA1"), Unique:=False
    .Columns("BA:BJ").EntireColumn.AutoFit
    NbActu = Application.WorksheetFunction.CountA(.Range("BB:BB"))

      .Range("AZ1") = NbActu  
      .Sort.SortFields.Clear  
      .Sort.SortFields.Add2 Key:=.Range("BB2:BB" & NbActu) \_  
          , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal  
      .Sort.SortFields.Add2 Key:=.Range("BC2:BC" & NbActu) \_  
          , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal  
      With .Sort  
          .SetRange .Range("BA1:BJ" & NbActu)  
          .Header = xlYes  
          .MatchCase = False  
          .Orientation = xlTopToBottom  
          .SortMethod = xlPinYin  
          .Apply  
      End With  
      nbAdh = .Range("AZ1")  
    End With  
    ActiveWorkbook.Names.Add Name:="adher", RefersToR1C1:="=Adh!R2C53:R" & nbAdh & "C61"  
    Application.EnableEvents = True  
    ActiveWindow.LargeScroll ToRight:=-100  
    

    End Sub

    Elle se lance à la désactivation de la feuille BDD. Dans le module de cette feuille :

    Private Sub Worksheet_Deactivate()
    listImg
    End Sub

    Daniel

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  2. Anonyme
    2022-04-15T12:22:16+00:00

    La macro suppose que la feuille Adh soit sélectiionnée, voici le code :

    Sub listImg() ' feuille Adh

    If ActiveSheet.Name &lt;&gt; "Adh" Then Exit Sub 
    
    Application.ScreenUpdating = False 
    
    ActiveSheet.Unprotect Password:="ricH" 
    
    Application.EnableEvents = False 
    
    Columns("BA:BJ").Select 
    
    Selection.Delete Shift:=xlToLeft 
    
    NbTot = Range("AH6") - 1 
    
    Range("A1:J" & NbTot).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( \_ 
    
        "AA29:AA30"), CopyToRange:=Range("BA1"), Unique:=False 
    
    Columns("BA:BJ").EntireColumn.AutoFit 
    
    NbActu = Application.WorksheetFunction.CountA(Range("BB:BB")) 
    
    Range("AZ1") = NbActu 
    
    ActiveWorkbook.Worksheets("Adh").sort.SortFields.Clear 
    
    ActiveWorkbook.Worksheets("Adh").sort.SortFields.Add2 Key:=Range("BB2:BB" & NbActu) \_ 
    
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    
    ActiveWorkbook.Worksheets("Adh").sort.SortFields.Add2 Key:=Range("BC2:BC" & NbActu) \_ 
    
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    
    With ActiveWorkbook.Worksheets("Adh").sort 
    
        .SetRange Range("BA1:BJ" & NbActu) 
    
        .Header = xlYes 
    
        .MatchCase = False 
    
        .Orientation = xlTopToBottom 
    
        .SortMethod = xlPinYin 
    
        .Apply 
    
    End With 
    
    nbAdh = Worksheets("Adh").Range("AZ1") 
    
    ActiveWorkbook.Names.Add Name:="adher", RefersToR1C1:="=Adh!R2C53:R" & nbAdh & "C61" 
    
    Application.EnableEvents = True 
    
    ActiveWindow.LargeScroll ToRight:=-100 
    

    End Sub

    Je filtre la BD à une autre place, je trie la BD filtrée et je crée une liste qui me servira pour les autres feuilles

    Richard

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  3. DanielCo 107.7K Points de réputation
    2022-04-15T09:19:59+00:00

    Bonjour,

    Tout dépend de ta macro. Si elle suppose que la première feuille est sélectionnée, alors oui, il faut modifier la macro. Le plus simple serait que tu postes le code de la macro.

    Daniel

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire