Macro en quittant un onglet

Résolu
fadmaam Messages postés 35 Statut Membre -  
fadmaam Messages postés 35 Statut Membre -
Bonjour,

Je souhaiterais faire tourner une macro lorsque je quitte un onglet. Actuellement la macro tourne dès que je modifie une cellule et ça prend donc bcp de temps.

Voici le code que j'ai actuellement:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Row = 1 Then Exit Sub
Valeur = Target
If Application.Intersect(Columns("A:C"), Target) Is Nothing Then Exit Sub 'si le changement a lieu ailleurs que dans les colonnes A, B ou C, sort de la procédure
Range("A2:AZ500").Select
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("C2") _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal

Set c = Columns("A:AZ").Find(Valeur, LookIn:=xlValues)
c.Select

End Sub

J'ai essayé avec la fonction "deactivate" (en gardant juste la partie "Range... -> normal") mais ça ne fonctionne pas. Je présume que c'est parce qu'il faut préciser dans quel onglet il faut sélectionner les données à trier mais je ne sais pas comment faire...

Merci d'avance pour votre aide...

Cordialement,
FadY

2 réponses

  1. Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   65
     
    Bonjour,

    Le code avec Deactivate devrait marcher mais effectivement, il faut alors préciser dans quel onglet on l'exécute. Donc je procéderais comme cela :

    Private Sub Worksheet_Deactivate()
    
    Dim Valeur As String
    
    'Valeur = Target : il va falloir changer cette donnée car en quittant l'onglet, il est évident que la 'target' ne sera pas la bonne cellule.
    
    'pour pallier à ce problème, je vous propose ce code :
    
    Valeur = InputBox("Tapez le nom de la valeur à rechercher :")
    
    If InputBox = "" Then
       MsgBox("Aucune saisie.")
       Exit Sub
    End If
    
    Sheets("le nom de votre feuille").Range("A2:AZ500").Select 
    Selection.Sort Key1:=Sheets("le nom de votre feuille").Range("A2"), Order1:=xlAscending, Key2:=Sheets(le nom de votre feuille").Range("C2") _ 
    , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _ 
    False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _ 
    :=xlSortNormal 
    
    Set c = Sheets("le nom de votre feuille").Columns("A:AZ").Find(Valeur, LookIn:=xlValues) 
    Sheets("le nom de votre feuille").c.Select 
    
    End Sub 


    Cordialement.
    0
    1. fadmaam Messages postés 35 Statut Membre
       
      Bonjour Kuartz,

      Merci pour votre réponse.

      J'ai corrigé le code et voici ce que ça donne :

      Private Sub Worksheet_Deactivate()
      Sheets("Contract Portfolio").Range("A2:AZ250").Select
      Selection.Sort Key1:=Sheets("Contract Portfolio").Range("A2"), Order1:=xlAscending, _
      Key2:=Sheets("Contract Portfolio").Range("C2"), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, _
      MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal
      End Sub


      J'ai enlevé le reste car en fait ça ne sert plus à grand chose si on quitte l'onglet...

      Par contre, j'ai un message d'erreur :"Select method of Range clas failed".
      Désolé, je ne suis vraiment pas doué :-(


      FadY
      0
      1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > fadmaam Messages postés 35 Statut Membre
         
        Excuse moi de t'avoir dérangé en te proposant quelque chose de simple

        Blacklist
        0
      2. fadmaam Messages postés 35 Statut Membre > michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Monsieur,

        Je suis navré mais il n'y avait rien d'autre sur mon écran que la réponse de Kuartz lorsque j'ai répondu tout à l'heure. J'étais occupé à essayer sa solution et n'ai sans doute pas rafraichi la page avant de répondre.


        FadY
        0
    2. Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   65
       
      Bonjour michel_m,

      J'espère que vous n'êtes pas en colère contre moi...

      fadmaam, vous auriez dû prêter attention à la réponse de michel_m.

      Ce qui plante sur le code, c'est la ligne :

      Sheets("Contract Portfolio").Range("A2:AZ250").Select


      Et pour cause, vous sélectionnez des cellules d'une feuille où vous n'êtes pas.

      Le code modifié et fonctionnel :

      Private Sub Worksheet_Deactivate()
      Sheets("Contract Portfolio").Range("A2:AZ250").Sort Key1:=Sheets("Contract Portfolio").Range("A2"), Order1:=xlAscending, _
          Key2:=Sheets("Contract Portfolio").Range("C2"), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, _
          MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal
      End Sub


      Cordialement.
      0
    3. fadmaam Messages postés 35 Statut Membre
       
      Merci !
      Ca fonctionne nickel ;-)

      Cordialement,
      FadY
      0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour
    SUPPRIME SUITE A ATTITUDE DEDAIGNEUSE DE FADMANN
    Michel
    0
    1. fadmaam Messages postés 35 Statut Membre
       
      ???
      0