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 :

Problème Tri Cellule


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 116
    Par défaut Problème Tri Cellule
    Bonjour à tous,

    Je voudrais créer une procédure pour trier les cellules A1 à A500 par ordre croissant de mon classeur

    Voici la procédure que j'essaie de créer mais je reçois une erreur : Erreur de compilation, Argument non facultatif sur la ligne Call TableauDécalerElément(MonTableau(), True) ' Appelle la fonction de tri du tableau.. Je n'arrive pas à corriger.

    Ce serait sympa de m'aider
    Merci

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    Option Explicit
    '-------------------------------------------------------------------------------
    Sub TableauDécalerElément(ByRef TabDonnées() As Variant, _
            ByRef IndiceElément As Long, ByRef IndiceMini As Long, ByRef IndiceMaxi As Long)
    '-------------------------------------------------------------------------------
    Dim i As Long
    
    If IndiceElément > (IndiceMaxi + IndiceMini) / 2 Then
        For i = IndiceMaxi To IndiceElément Step -1 ' Décale vers le haut.
            TabDonnées(i + 1) = TabDonnées(i)
        Next i
        IndiceMaxi = IndiceMaxi + 1 ' Nouvel indice maxi du tableau.
    Else
        For i = IndiceMini To IndiceElément         ' Décale vers le bas.
            TabDonnées(i - 1) = TabDonnées(i)
        Next i
        IndiceMini = IndiceMini - 1 ' Nouvel indice mini du tableau.
        IndiceElément = IndiceElément - 1 ' Décale l'emplacement du nouvel élément.
    End If
    
    End Sub
    '--------------------------------------------------------------------------------------------------------------------------------------------------------
    Sub TriRapide(ByRef TabDonnées() As Variant)
    '--------------------------------------------------------------------------------------------------------------------------------------------------------
    Dim i As Long, n As Long, TabClassés() As Variant
    ReDim TabClassés(-UBound(TabDonnées) - 1 To UBound(TabDonnées) + 1)
    Dim TabDébut As Long, TabFin As Long
    
    ' Si moins de deux données à trier alors quitte.
    If Abs(UBound(TabDonnées) - LBound(TabDonnées)) < 1 Then Exit Sub
    
    ' Classe les 2 premiers éléments par ordre croissant.
    n = LBound(TabDonnées)
    If TabDonnées(n + 1) > TabDonnées(n) Then i = 1
    TabClassés(n) = TabDonnées(n + 1 - i)
    TabClassés(n + 1) = TabDonnées(n + i)
    
    TabDébut = LBound(TabDonnées): TabFin = LBound(TabDonnées) + 2   'Limites tableau classé
    
    ' Boucle sur les autres éléments à classer.
    For n = 2 + LBound(TabDonnées) To UBound(TabDonnées)
        ' Recherche la position dans la liste des éléments classés.
        i = TableauRecherchePosition(TabClassés(), TabDébut, TabFin, TabDonnées(n))
        ' Décale les éléments déjà classés pour faire une place.
        Call TableauDécalerElément(TabClassés(), i, TabDébut, TabFin)
        ' Insère l'élément dans la liste des éléments classés.
        TabClassés(i) = TabDonnées(n)
    Next n
    
    ' Retourne le tableau classé :
    n = LBound(TabDonnées)
    For i = TabDébut To TabFin - 1
        TabDonnées(n) = TabClassés(i):
        n = n + 1
    Next i
    End Sub
    
    '--------------------------------------------------------------------------------------------------------------------------------------------------------
    Function TableauRecherchePosition(ByRef TabDonnées() As Variant, ByVal Début As Long, _
                        ByVal Fin As Long, ByVal ValRecherchée As Variant) As Long
    '--------------------------------------------------------------------------------------------------------------------------------------------------------
    Dim Milieu As Long
    
    ' Si nouvelle extrémité inférieure ou supérieure
    If ValRecherchée <= TabDonnées(Début) Then TableauRecherchePosition = Début: Exit Function
    If ValRecherchée >= TabDonnées(Fin - 1) Then TableauRecherchePosition = Fin: Exit Function
    
    Do
        Milieu = (Début + Fin) / 2 'Calcule le milieu du tableau borné par Début et Fin.
        ' Si l'élément à classer est compris entre Milieu et Milieu+1
        If ValRecherchée >= TabDonnées(Milieu) And ValRecherchée <= TabDonnées(Milieu + 1) Then
            TableauRecherchePosition = Milieu + 1   ' Retourne la position où insérer l'élément.
            Exit Do             ' Sort de la boucle
        End If
        If ValRecherchée > TabDonnées(Milieu) Then  'Compare l'élément avec le milieu
            Début = Milieu + 1              'Nouvelle borne de début.
        Else
            Fin = Milieu - 1                'Nouvelle borne de fin.
        End If
    Loop
    End Function
    
    '-------------------------------------------------------------------------------
    Sub ChargeLesDonnées()
    '-------------------------------------------------------------------------------
    Dim MonTableau() As Variant ' Déclare un tableau Variant dynamique.
    Dim y As Long               ' Indique la ligne à analyser.
    Dim i As Long               ' Indice du tableau.
    
    y = 1
    While Cells(y, 1) <> ""           ' Boucle sur les lignes de la colonne A.
        ReDim Preserve MonTableau(i)  ' Redimensionne le tableau d'après l'indice.
        MonTableau(i) = Cells(y, 1)   ' Mémorise la valeur de la cellule.
        i = i + 1                     ' Incrémente l'indice du tableau.
        y = y + 1                     ' Passe à la ligne suivante.
    Wend
    
    Call TableauDécalerElément(MonTableau(), True)   ' Appelle la fonction de tri du tableau.
    
    For y = LBound(MonTableau) To UBound(MonTableau) ' Boucle sur les éléments.
        Cells(y + 1, 2) = MonTableau(y)              ' Affiche l'élément en B.
    Next y
    
    Application.ScreenUpdating = True
    
    End Sub

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    le message d'erreur est pourtant clair, la fonction attend plusieurs arguments

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ByRef TabDonnées() As Variant, _
            ByRef IndiceElément As Long, ByRef IndiceMini As Long, ByRef IndiceMaxi As Long)
    Très exactement elle en attend 4 obligatoires

    Toi, tu lui en fournis deux.

    Si les deux derniers ne sont pas obligatoires, tu dois les passer en Optional et leur donner une valeur par défaut

    Exemple pour comprendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Option IndiceMini As Long = 1

  3. #3
    Membre Expert Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Par défaut
    Salut,

    Ta procédure TableauDécalerElément, à 4 paramètres. Ces paramètre ne sont pas facultatifs, et c'est pour cela que çà plante

    Sub TableauDécalerElément(ByRef TabDonnées() As Variant, _
    ByRef IndiceElément As Long, ByRef IndiceMini As Long, ByRef IndiceMaxi As Long)

    Si tu veux les rendre facultatifs, utilise le paramètre Optional

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub sub name(ByVal parameter1 As datatype1, Optional ByVal parameter2 As datatype2 = defaultvalue)

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 116
    Par défaut
    Merci pour vos réponses

    Je corrige.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 116
    Par défaut
    Bonjour à tous

    Je reviens vers vous parce que j'ai toujours un problème.

    Après avoir changer la ligne

    Sub TableauDécalerElément(ByRef TabDonnées() As Variant, _
    ByRef IndiceElément As Long, Optional ByRef IndiceMini As Long = 1, Optional ByRef IndiceMaxi As Long = 500)

    Je n'ai plus d'erreur...

    Mais les valeurs reportées en colonne B ne sont pas triées

    Qui peut m'aider SVP

    Merci

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Pour trier une plage d'une feuille de calculs, rien ne sert de réinventer la roue au risque qu'elle fusse carrée,

    il suffit juste d'utiliser le tri existant déjà dans Excel et en une seule instruction via la méthode Sort en VBA !

    _________________________________________________________________________________________________________
    Je suis Paris, Berlin, Nice, Bruxelles, Charlie, …

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 116
    Par défaut
    Bonjour
    Oui bien sûr, mais je suis en train de suivre le tutoriel de ce site :
    http://www.developpez.net/forums/d15...ion-vba-excel/
    Et ne n'arrive pas à comprendre la fin du paragraphe 7 Exercice : créer une procédure de tri des données pour pouvoir continuer à m'améliorer en VBA.

Discussions similaires

  1. [Tableaux] Problème tri de tableau à deux dimensions
    Par squall62 dans le forum Langage
    Réponses: 21
    Dernier message: 24/05/2006, 19h18
  2. [VBA-A]Problème de cellule Excel vide
    Par soad029 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 05/05/2006, 15h12
  3. Problème tri tutoriel selection multiple
    Par qbihlmaier dans le forum Access
    Réponses: 24
    Dernier message: 14/03/2006, 12h24
  4. [PERL] problème tri de tableau
    Par LE NEINDRE dans le forum Langage
    Réponses: 2
    Dernier message: 31/08/2005, 16h42
  5. Problême tri par ardre croissant
    Par vince86000 dans le forum ASP
    Réponses: 2
    Dernier message: 28/04/2005, 14h10

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