IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Tri automatique d'une plage


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut Tri automatique d'une plage
    Bonjour,

    Comment puis-je me passer d'un GoTo dans cette procédure ?
    J'imagine que ce code peut être optimisé, mais j'ignore comment !

    L'idée est de faire un tri automatique sur deux colonnes d'une même feuille sachant que si j'ai "A" "B" "C" et "a", ma cellule [h1] (ou [j1]) me renverra que c'est trié alors que ça ne l'est pas d'où conversion automatique des minuscules en majuscules.

    Nota 1 : [h1] = =Test_Tri($H$5:$H$40)
    Nota 2 : Function Test_Tri

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function Test_Tri(liste As Range) As String
    Dim i&
     
        For i = 2 To liste.Count
        If liste(i) <> "" Then If liste(i - 1) > liste(i) Or liste(i - 1) = "" Then Test_Tri = "Liste non triée": Exit Function
        Next
        Test_Tri = "Liste triée"
    End Function

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Private Sub Worksheet_Change(ByVal target As Range)
    Dim plg1
    Dim plg2
    Dim c As Range
     
    'Dim i As Integer
    '    For i = 9 To 14
    '        If Cells(2, i) <> "Trié" Then Range(Cells(2, i - 7), Cells(65536, i - 7).End(xlUp)).Sort Key1:=Cells(2, i - 7)
    '    Next
     
    Set plg1 = Intersect(target, [H5:H40])
    Set plg2 = Intersect(target, [J5:J100])
     
        '----
        If plg1 Is Nothing Then GoTo suite
    '        Exit Sub
    '    Else
            Application.EnableEvents = False
     
            For Each c In plg1.Cells
                c = UCase(c)
            Next
            Application.EnableEvents = True
    '    End If
         If [h1] <> "Liste triée" Then Range("H5:H40").Sort Key1:=[h5]
        '----
    suite:
     
        If plg2 Is Nothing Then
            Exit Sub
        Else
            Application.EnableEvents = False
            For Each c In plg2.Cells
                c = UCase(c)
            Next
            Application.EnableEvents = True
        End If
        '---
        If [j1] <> "Liste triée" Then Range("J5:J40").Sort Key1:=[j5]
    End Sub

    Un grand merci d'avance pour votre aide éventuelle,
    Cdt

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    bonjour
    alors heu.....
    par ou commencer?
    tri !! c'est quoi pour toi un tri ?
    en l'etat ta fonction ne fait absolument rien sinon te dire oui ou non alors qu'elle ne fait rien
    allez recommence au début
    tu veux faire quoi?
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut
    Bonsoir,

    Ma Function me renvoie "Liste triée" ou "Liste non triée" dans la cellule J1 =Test_tri (J2:J100)

    Ensuite, j'ajoute dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Worksheet_Change(ByVal target As Range)
    ... la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If [j1] <> "Liste triée" Then Range("J5:J40").Sort Key1:=[j5]
    Donc, si la liste à partir de J2 = B, C, D, F, A; alors le tri est automatique !

    Mais j'ai remarqué que si ma liste est B, C, D, F, a, alors le test me dit que ma liste est triée alors qu'elle ne l'est pas (cf. casse)

    Donc pour "résoudre" le problème, je convertis toutes saisie en majuscule ; et ça marche, mais je n'aime pas le GoTo et je suis sûr que ce code est optimisable.

    A bientôt ?
    Cdt

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 729
    Points : 28 555
    Points
    28 555
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Petite remarque.,Une fonction qui a pour but d'effectuer un test doit renvoyer une valeur booléenne et pas un texte et plutôt que de lancer l'exécution d'une procédure en fonction du résultat de la fonction test, il est plus simple de lancer l'exécution de la procédure directement en invoquant la fonction test
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If Test_Tri(range("A2:H1000")) Then NomDeLaProcedureTri
    Ceci étant dit ne serait-ce pas plus simple et plus rapide d'effectuer le tri sans passer par ce test ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    bonjour
    Ceci étant dit ne serait-ce pas plus simple et plus rapide d'effectuer le tri sans passer par ce test ?
    absolument
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut
    Bonjour,

    Certes, mais j'ai aussi besoin d'un résultat du Test dans la cellule J1 pour informer l'utilisateur que la plage est bien triée. Je retiens néanmoins ta proposition.

    Quid de ma quête de me passer de ce "GoTo" ? A moins que ça ne soit pas possible, ce qui me semble peu probable.

    Cdt

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 729
    Points : 28 555
    Points
    28 555
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Quid de ma quête de me passer de ce "GoTo" ? A moins que ça ne soit pas possible, ce qui me semble peu probable.
    Evidemment que c'est possible. L'instruction GoTo est à proscrire sauf pour l'instruction On Error parce-que l'on a pas le choix
    Intègre tes différentes procédures dans un structure décisionnelle telle que par exemple Select Case ou plutôt les lignes 18 à 25 dans un If
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut
    Bonsoir,

    J'y ai bien pensé, mais je ne sais pas faire :-( D'où mon post ici !
    Cdt

    PS : Je fais toujours tout ce que je peux pour éviter les GoTo mais dans le cas présent, je suis un peu perdu.

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 729
    Points : 28 555
    Points
    28 555
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Cela crève les yeux. Fais un dessin et tu trouveras tout de suite la solution.
    Inverse le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If plg1 Is Nothing Then
    et tu n'as plus besoin du Else

    Exemple 1 avec GoTo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub t1()
     Dim Valeur#
     Valeur = 4
     If Valeur = 0 Then
       GoTo Suite
      Else
       ' Différentes lignes
       MsgBox Valeur
     End If
    Suite:
    End Sub
    Exemple 2 sans GoTo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub t2()
     Dim Valeur#
     Valeur = 4
     If Valeur <> 0 Then
       ' Différentes lignes
       MsgBox Valeur
     End If
    Suite:
    End Sub
    Et bien entendu l'étiquette Suite n'a plus de raison d'exister
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut
    Bonjour,

    Ton exemple est clair et surtout simple ; je ne vois pas comment le transposer à ma question.

    Pour éviter le GoTo, j'ai inversé les propositions en ajoutant "Not" (sans conviction) devant "Nothing", mais ça ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Private Sub Worksheet_Change(ByVal target As Range)
    Dim plg1
    Dim plg2
    Dim c As Range
     
    Set plg1 = Intersect(target, [H5:H40])
    Set plg2 = Intersect(target, [J5:J100])
     
        If plg1 Is Not Nothing Then
            Application.EnableEvents = False
            For Each c In plg1.Cells
                c = UCase(c)
            Next
            Application.EnableEvents = True
        Else
            If plg2 Is Not Nothing Then
                Application.EnableEvents = False
                For Each c In plg2.Cells
                    c = UCase(c)
                Next
                Application.EnableEvents = True
            End If
        End If
     
        If [h1] <> "Liste triée" Then Range("H5:H40").Sort Key1:=[h5]
        If [j1] <> "Liste triée" Then Range("J5:J40").Sort Key1:=[j5]
     
    End Sub
    Cdt

  11. #11
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,
    La syntaxe correcte est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not plg1 Is Nothing Then ...

  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut
    Bonjour,

    ... et merci beaucoup RIAOLLE !!!

    Je n'ai jamais été très à l'aise avec les "Intersect" "Nothing", même si sa syntaxe crève les yeux ;-)

    Encore merci, ça marche parfaitement,
    Cdt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 29/06/2016, 16h31
  2. Réponses: 1
    Dernier message: 08/10/2011, 06h16
  3. Retirer le tri automatique d'une table
    Par tixo76 dans le forum MySQL
    Réponses: 10
    Dernier message: 24/02/2009, 16h10
  4. Désactiver le tri automatique dans une table paradox
    Par souminet dans le forum Débuter
    Réponses: 1
    Dernier message: 30/12/2008, 16h04
  5. Tri & Sélection d'une plage de taille inconnue
    Par pythagore3_14 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 04/08/2008, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo