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 par ordre croissant variable tableau [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Mars 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études

    Informations forums :
    Inscription : Mars 2014
    Messages : 51
    Points : 24
    Points
    24
    Par défaut Tri par ordre croissant variable tableau
    Bonsoir,

    J'ai essayé d'effectuer un tri croissant dans une variable tableau.
    Je me suis basé sur ce qui est fait dans l'exemple de ce lien https://silkyroad.developpez.com/vba/tableaux/#LXIV-D

    Mais lors de l'exécution du code, j'ai une erreur qui apparaît "Erreur d'exécution 9, l'indic n'appartient pas à la sélection."
    Je sais pas si c'est un souci de déclaration de variable, je n'arrive pas à comprendre.

    Je mets le bout de code ci-dessous pour mieux comprendre :

    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    Option Explicit
    Option Base 1
    Sub Calcul()
     
    Dim i As Long
    Dim j As Long
    Dim k As Long
    Dim l As Long
    Dim m As Long
    Dim n As Long
    Dim Feuille1 As String
    Dim L_Titre1 As Long
    Dim C_RepChemCab1 As Long
    Dim C_RepCable1 As Long
    Dim C_LargeurD1 As Long
    Dim C_PremColonne1 As Long
    Dim C_DerColonne1 As Long
    Dim L_PremLigne1 As Long
    Dim L_DerLigne1 As Long
    Dim L_DerLigne As Long
     
    Dim Feuille2 As String
    Dim L_Titre2 As Long
    Dim C_Dalle2 As Long
    Dim C_PremColonne2 As Long
    Dim C_DerColonne2 As Long
    Dim L_PremLigne2 As Long
    Dim L_DerLigne2 As Long
     
    Dim Feuille3 As String
    Dim L_DerLigne3 As Long
     
    Dim Feuille4 As String
    Dim Feuille5 As String
     
    Dim C_RepCabTabMDB As Long
    Dim C_PositionTabMDB As Long
    Dim C_SectionTabMDB As Long
    Dim C_LargeurCabTabMDB As Long
    Dim C_RepChemCabTabMDB As Long
    Dim C_RepDalleTabMDB As Long
    Dim C_LargeurChemCabTabMDB As Long
    Dim C_NbCabTabReserve As Long
    Dim L_LargeurDTabReserve As Long
    Dim Valeur As Integer
    Dim Cible As Variant
     
    Dim RepChemCabTabChemCab As String
    Dim LargeurD As Long
    Dim LargeurEncomb As Double
    Dim LargeurDRes As Double
    Dim NbCab As Long
    Dim NbCircUni As Long
    Dim NbCircMulti As Long
     
    'Déclaration variable tableau
    Dim Tablotmp1
    Dim Tablotmp2
    Dim TabMDB As Variant
    Dim TabChemCab As Variant
    Dim Ncol As Long
    Dim clé As String
    Dim d As Object
    Dim TabReserve As Variant
     
     
        Application.ScreenUpdating = False
     
        Feuille1 = "MdB BAV MHSA"
        Feuille2 = "Réserve"
        Feuille3 = "Feuil2"
        Feuille4 = "Feuil3"
        Feuille5 = "Feuil4"
     
        Sheets(Feuille1).Activate
        If Worksheets(Feuille1).FilterMode Then
        Worksheets(Feuille1).ShowAllData
        Else
        End If
     
        L_Titre1 = Sheets(Feuille1).Cells.Find("RepereCable", lookat:=xlWhole).Row
        C_RepCable1 = Sheets(Feuille1).Rows(L_Titre1).Find("RepereCable", lookat:=xlWhole).Column
        C_RepChemCab1 = Sheets(Feuille1).Rows(L_Titre1).Find("RepereCheminCable", lookat:=xlWhole).Column
        C_LargeurD1 = Sheets(Feuille1).Rows(L_Titre1).Find("LargeurCheminCable", lookat:=xlWhole).Column
        L_PremLigne1 = 1
        L_DerLigne1 = Sheets(Feuille1).Cells(Rows.Count, C_RepCable1).End(xlUp).Row
        C_PremColonne1 = 1
        C_DerColonne1 = Sheets(Feuille1).Rows(L_Titre1).Find("Local", lookat:=xlWhole).Column
     
        L_Titre2 = Sheets(Feuille2).Cells.Find("Nb câbles", lookat:=xlWhole).Row
        C_Dalle2 = Sheets(Feuille2).Rows(L_Titre2).Find("Dalles", lookat:=xlWhole).Column
        L_PremLigne2 = 1
        L_DerLigne2 = Sheets(Feuille2).Cells(Rows.Count, C_Dalle2).End(xlUp).Row
        C_PremColonne2 = 1
        C_DerColonne2 = Sheets(Feuille2).Cells(L_Titre2, Columns.Count).End(xlToLeft).Column
     
    ''''Tableau MDB
        TabMDB = Range(Sheets(Feuille1).Cells(L_PremLigne1, C_PremColonne1), Sheets(Feuille1).Cells(L_DerLigne1, C_DerColonne1))
     
    ''''Numero de colonne pour info dans tableau MDB
        For i = 1 To UBound(TabMDB, 2)
            If TabMDB(1, i) = "RepereCable" Then
                C_RepCabTabMDB = i
            ElseIf TabMDB(1, i) = "Position" Then
                C_PositionTabMDB = i
            ElseIf TabMDB(1, i) = "Section" Then
                C_SectionTabMDB = i
            ElseIf TabMDB(1, i) = "LargeurCable" Then
                C_LargeurCabTabMDB = i
            ElseIf TabMDB(1, i) = "RepereCheminCable" Then
                C_RepChemCabTabMDB = i
            ElseIf TabMDB(1, i) = "RepereDalle" Then
                C_RepDalleTabMDB = i
            ElseIf TabMDB(1, i) = "LargeurCheminCable" Then
                C_LargeurChemCabTabMDB = i
            End If
        Next i
     
    ''''Tri croissant sur le tableau TabMDB
        Do 'tri décroissant
            Valeur = 0
     
            For i = UBound(TabMDB) To 1 Step -1
                If TabMDB(i, C_LargeurCabTabMDB) < TabMDB(i - 1, C_LargeurCabTabMDB) And TabMDB(i - 1, C_LargeurCabTabMDB) <> "LargeurCable" Then
                    Cible = TabMDB(i)
                    TabMDB(i) = TabMDB(i - 1)
                    TabMDB(i - 1) = Cible
                    Valeur = 1
                End If
            Next i
        Loop While Valeur = 1
     
        'vérification du tri
        Sheets(Feuille5).Cells(1, 1).Resize(UBound(TabMDB, 1), UBound(TabMDB, 2)) = TabMDB
     
     
        Application.ScreenUpdating = True
    End Sub
    L'erreur est au niveau de la ligne 125.


    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par MM_13 Voir le message
    Bonjour,

    Actuellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            For i = UBound(TabMDB) To 1 Step -1
                If TabMDB(i, C_LargeurCabTabMDB) < TabMDB(i - 1, C_LargeurCabTabMDB) And TabMDB(i - 1, C_LargeurCabTabMDB) <> "LargeurCable" Then
                    Cible = TabMDB(i)
                    TabMDB(i) = TabMDB(i - 1)
                    TabMDB(i - 1) = Cible
                    Valeur = 1
                End If
            Next i
    Votre matrice étant à deux dimensions, vous devez préciser sur quelle dimension doit varier I : ici la dimension 1.
    Idem pour le reste, il faut indiquer les deux termes pour le passage des valeurs.

    Modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            For i = UBound(TabMDB, 1) To 1 Step -1
                If TabMDB(i, C_LargeurCabTabMDB) < TabMDB(i - 1, C_LargeurCabTabMDB) And TabMDB(i - 1, C_LargeurCabTabMDB) <> "LargeurCable" Then
                    Cible = TabMDB(i, C_LargeurCabTabMDB)
                    TabMDB(i, C_LargeurCabTabMDB) = TabMDB(i - 1, C_LargeurCabTabMDB)
                    TabMDB(i - 1, C_LargeurCabTabMDB) = Cible
                    Valeur = 1
                End If
            Next i

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Mars 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études

    Informations forums :
    Inscription : Mars 2014
    Messages : 51
    Points : 24
    Points
    24
    Par défaut
    Bonjour Eric,

    Alors je n'ai plus le message d'erreur mais ça ne fait pas ce que je veux, mais j'ai sans doute mal compris la logique des variables tableau.
    Est ce qu'il faut se l'imaginer comme un tableau classique qui serait dans une feuille Excel ou la façon de travailler avec une variable tableau est différente ?

    En fait dans le bout de code je veux y faire un tri croissant.
    Donc je compare les valeurs d'une colonne en i et i-1 comme j'aurais pu le faire dans un tableau classique.
    Puis je veux que si la valeur de i est plus petite que celle de i-1 alors il passe toute la ligne de i avant celle de i-1.
    C'est pour cela que j'avais mis "Cible = TabMDB(i)" pour sélectionner toute la ligne en question.

    Là dans la modification que vous m'avez fait, cela fait changer seulement les valeurs de la colonne "C_LargeurCabTabMDB" alors que je voudrais que ce soit toute la ligne qui change.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par MM_13 Voir le message
    Je n'ai pas regardé le reste du code. Mettez en ligne un fichier exemple sans données confidentielles.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Mars 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études

    Informations forums :
    Inscription : Mars 2014
    Messages : 51
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Eric KERGRESSE Voir le message
    Je n'ai pas regardé le reste du code. Mettez en ligne un fichier exemple sans données confidentielles.
    Je vous joins le fichier.
    Fichiers attachés Fichiers attachés

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabMDB = Range(Sheets(Feuille1).Cells(L_PremLigne1, C_PremColonne1), Sheets(Feuille1).Cells(L_DerLigne1, C_DerColonne1))
    Tu ne peux pas trier directement sur la feuille ?
    Ca sera beaucoup plus rapide que n'importe quel code que tu feras.
    Quitte à devoir insérer une colonne (que tu supprimes à la fin) avec la position des lignes si tu veux restaurer l'ordre ensuite.
    eric

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Mars 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études

    Informations forums :
    Inscription : Mars 2014
    Messages : 51
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par eriiic Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabMDB = Range(Sheets(Feuille1).Cells(L_PremLigne1, C_PremColonne1), Sheets(Feuille1).Cells(L_DerLigne1, C_DerColonne1))
    Tu ne peux pas trier directement sur la feuille ?
    Ca sera beaucoup plus rapide que n'importe quel code que tu feras.
    Quitte à devoir insérer une colonne (que tu supprimes à la fin) avec la position des lignes si tu veux restaurer l'ordre ensuite.
    eric
    Bonjour,

    Oui je pourrais faire le filtre dans la feuille directement, mais c'est la première fois que j'utilise des variables tableaux et en faisant cela je voulais comprendre comment ça fonctionne et voir ce qui peut être fait avec.
    Puis on m'a dit que travailler avec des variables tableaux est beaucoup plus rapide que travailler sur des feuilles.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par MM_13 Voir le message
    C'est pour cela que j'avais mis "Cible = TabMDB(i)" pour sélectionner toute la ligne en question.
    Cela ne marche pas comme cela. Si la matrice fait plusieurs colonnes, il faut travailler sur toutes les colonnes pour ce que tu veux faire. Jusqu'à deux colonnes ça va, après tu vas vite galérer pour mettre au point ton code, et le temps de traitement va être catastrophique. Pour info, j'utilise cette technique pour réordonner des ListBox, mais celles-ci n'ont qu'une voire deux informations et une quantité limitée de lignes.

    Je fais la même remarque qu'eriiic (que je salue), il faut trier directement le tableau.
    D'après le code, il faut simplement trier le tableau par rapport à la colonne C_LargeurCabTabMDB, n'est ce pas ?

    Ensuite, quelle est la finalité de ce que tu veux faire ?

  9. #9
    Membre à l'essai
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Mars 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études

    Informations forums :
    Inscription : Mars 2014
    Messages : 51
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Eric KERGRESSE Voir le message
    Cela ne marche pas comme cela. Si la matrice fait plusieurs colonnes, il faut travailler sur toutes les colonnes pour ce que tu veux faire. Jusqu'à deux colonnes ça va, après tu vas vite galérer pour mettre au point ton code, et le temps de traitement va être catastrophique. Pour info, j'utilise cette technique pour réordonner des ListBox, mais celles-ci n'ont qu'une voire deux informations et une quantité limitée de lignes.

    Je fais la même remarque qu'eriiic (que je salue), il faut trier directement le tableau.
    D'après le code, il faut simplement trier le tableau par rapport à la colonne C_LargeurCabTabMDB, n'est ce pas ?

    Ensuite, quelle est la finalité de ce que tu veux faire ?
    Je pensais que justement en travaillant avec des variables tableaux ça ferait gagner beaucoup de temps de traitement.

    Le tri oui se fait par rapport à la colonne C_LargeurCabTabMDB.
    Si la valeur de cette colonne sur la ligne i est plus petite que celle de la valeur de la ligne i-1 alors je voulais faire "remonter" la ligne i qui la valeur de la colonne C_LargeurCabTabMDBplus petite.

    Là pour envoyer le fichier j'ai couper le code, il y a d'autres feuilles avec des données d'entrées, que je mets aussi dans des variables tableaux.
    Et ensuite je traite tout cela, il y a plusieurs boucles imbriquées, je pensais qu'en pensant par les variables tableaux je gagnerais beaucoup de temps par rapport à un traitement classique par feuille.


    Mais du coup pour comprendre l'utilité des variables tableaux, à quoi ça sert ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ci-dessous un code fonctionnel. Tri sur la 1ère colonne d'un tableau à 2 dimensions. A adapter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    'Tri (A >>>Z)
     
    For i = LBound(Tablo) To UBound(Tablo)
        For j = LBound(Tablo) To UBound(Tablo)
            If Tablo(i, 1) < Tablo(j, 1) Then '==> Tri sur colonne 1
                  For a = 1 To 3  '==> le nbr de colonnes à balayer
                      Tmp = Tablo(i, a): Tablo(i, a) = Tablo(j, a): Tablo(j, a) = Tmp
                  Next a
            End If
         Next j
    Next i
    Bonne journée
    Sophie

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par MM_13 Voir le message
    Mais du coup pour comprendre l'utilité des variables tableaux, à quoi ça sert ?
    C'est bigrement intéressant si tu veux faire des calculs sur ta base par exemple, notamment pour mémoriser des résultats intermédiaires lorsque tu as des boucles. Autres exemple : Je veux travailler sur un échantillon limité d'une base au moyen d'un userform. Je ne vais charger que les informations qui m'intéressent pour cet échantillon dans cette matrice, les données sont ensuite travaillées dans l'usf et à la fin sont restituées dans une autre table.

    Jette un oeil aussi sur le site de Jacques BOISGONTIER http://boisgontierjacques.free.fr/pa...e/tableaux.htm.
    Regarde notamment sa méthode pour filtrer dynamiquement une matrice et alimenter des contrôles.

    Si le but est d'extraire des données sur ton onglet Feuil4, il est plus intéressant et plus rapide de le faire avec une recherche avancée (pas de VBA). Regarde ce tuto de Philippe TULLIEZ advancedfilter

  12. #12
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Puis on m'a dit que travailler avec des variables tableaux est beaucoup plus rapide que travailler sur des feuilles.
    Oui et non, tout dépend de ce que tu veux faire.
    Les opérations sur feuille sont grandement optimisées.
    Continue comme c'est pour apprendre, et au final tu chronomètres les 2 (sur feuille le code est vite fait) sur 100, 1000 et 10000 lignes pour te rendre compte.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par MM_13 Voir le message
    A tester :
    Nb : J'utilise ces routines tous les jours. Dans la fonction LigneDeTitreTrouvee, tu as un exemple d'utilisation d'une matrice.
    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
    Option Explicit
     
    Public DetectionColonnes As String
     
    Sub TrierLeTableauMdb()
     
    Dim ShMdbBav As Worksheet
    Dim TitreMdb As Long, ColLargeurCable As Long
     
        On Error GoTo Fin
     
        Set ShMdbBav = Sheets("MdB BAV MHSA")
     
        With ShMdbBav
     
            TitreMdb = LigneDeTitreTrouvee(ShMdbBav, Array("RepereCable", "RepereCheminCable", "LargeurCheminCable"), 100)
     
            If TitreMdb = 0 Then
               MsgBox "La ligne de titre n'a pas été trouvée !", vbCritical
               GoTo Fin
            End If
     
            DetectionColonnes = "Absence colonnes : " & Chr(10) ' Vérification utile si d'autres colonnes sont à détecter que celles pour LigneDeTitreTrouvee
            ColLargeurCable = ColonneFeuille(ShMdbBav, TitreMdb, "LargeurCable")
     
            If DetectionColonnes <> "Absence colonnes : " & Chr(10) Then
               MsgBox DetectionColonnes, vbCritical, "Vérification de la présence des colonnes"
               GoTo Fin
            End If
     
            TrierUnTableau ShMdbBav, TitreMdb, ColLargeurCable, "Croissant"
     
        End With
     
        MsgBox "Fin du tri !", vbInformation
     
        GoTo Fin
     
    Fin:
     
        Set ShMdbBav = Nothing
     
    End Sub
     
    Sub TrierUnTableau(ByVal FeuilleATrier As Worksheet, ByVal LigneDeTitre As Long, ByVal ColonneATrier As Long, ByVal OrdreDuTri As String)
     
    Dim DerniereColonne As Long, DerniereLigne As Long
    Dim AireATrier As Range, AireColonne As Range
     
        With FeuilleATrier
     
             DerniereColonne = .Cells(LigneDeTitre, .Columns.Count).End(xlToLeft).Column
             DerniereLigne = .Cells(.Rows.Count, ColonneATrier).End(xlUp).Row
     
             If DerniereLigne > LigneDeTitre Then
                Set AireATrier = .Range(.Cells(LigneDeTitre, 1), .Cells(DerniereLigne, DerniereColonne))
                Set AireColonne = .Range(.Cells(LigneDeTitre, ColonneATrier), .Cells(DerniereLigne, ColonneATrier))
     
                .Sort.SortFields.Clear
                If OrdreDuTri = "Croissant" Then
                   .Sort.SortFields.Add Key:=AireColonne, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                Else
                   .Sort.SortFields.Add Key:=AireColonne, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
                End If
                With .Sort
                     .SetRange AireATrier
                     .Header = xlYes
                     .MatchCase = False
                     .Orientation = xlTopToBottom
                     .SortMethod = xlPinYin
                     .Apply
                 End With
     
                 Set AireColonne = Nothing
                 Set AireATrier = Nothing
     
              End If
     
        End With
     
    End Sub
     
     
     
    Function ColonneFeuille(ByVal FeuilleTitre As Worksheet, ByVal LigneTitre As Long, ByVal TitreRecherche As String) As Long
     
    Dim NbColonnes As Long
    Dim Cellule As Range
    Dim Aire As Range
     
        With FeuilleTitre
     
             ColonneFeuille = 0
             NbColonnes = .Cells(LigneTitre, .Columns.Count).End(xlToLeft).Column
             Set Aire = .Range(.Cells(LigneTitre, 1), .Cells(LigneTitre, NbColonnes))
     
             For Each Cellule In Aire
                 Select Case Mid(Cellule.Value, 1, Len(TitreRecherche))
                        Case TitreRecherche
                             ColonneFeuille = Cellule.Column
                             Exit For
                 End Select
             Next
     
             If ColonneFeuille = 0 Then DetectionColonnes = DetectionColonnes & Chr(10) & TitreRecherche
     
             Set Aire = Nothing
     
        End With
     
    End Function
     
    Function LigneDeTitreTrouvee(ByVal FeuilleTestee As Worksheet, ByVal LibellesATester As Variant, ByVal NombreDeLignesTestees As Long) As Long
     
    Dim CompteurDeLignes As Long
    Dim CompteurDeColonnes As Long
    Dim CompteurDeLibelles As Long
    Dim NbChaines As Long
     
        With FeuilleTestee
             LigneDeTitreTrouvee = 0
             If .UsedRange.Rows.Count > 0 Then
                For CompteurDeLignes = .UsedRange.Row To .UsedRange.Row + NombreDeLignesTestees - 1
                    NbChaines = 0
                    For CompteurDeLibelles = LBound(LibellesATester) To UBound(LibellesATester)
                        If WorksheetFunction.CountA(.Rows(CompteurDeLignes)) > 0 Then
                           For CompteurDeColonnes = .UsedRange.Column To .Columns.Count
                               If CStr(.Cells(CompteurDeLignes, CompteurDeColonnes)) = LibellesATester(CompteurDeLibelles) Then NbChaines = NbChaines + 1
                           Next CompteurDeColonnes
                        End If
                    Next CompteurDeLibelles
                    If NbChaines = UBound(LibellesATester) + 1 Then
                       LigneDeTitreTrouvee = CompteurDeLignes
                       Exit Function
                    End If
                Next CompteurDeLignes
             End If
        End With
     
    End Function

  14. #14
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    Le tri Buuble-sort est un tri enseigné dans les écoles (temps de tri proportionnel à n*n) qu'il faut éviter d'utiliser au delà de 100 items.
    Utiliser la méthode la + rapide (quick sort)

    En PJ, une comparaison de différentes méthodes.

    Boisgontier

  15. #15
    Membre à l'essai
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Mars 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études

    Informations forums :
    Inscription : Mars 2014
    Messages : 51
    Points : 24
    Points
    24
    Par défaut
    Bonjour à tous,

    Désolé pour le temps de réponse très longue mais avec la reprise du taf j'avais moins de temps.

    Pour répondre à certains messages, c'est pas juste une macro pour stocker la table et faire un tri, en fait plusieurs boucles s'enchainent avec du calcul sur certaines infos et je pense qu'avec une macro sans variable tableau ça aurait été beaucoup plus long.

    J'ai réussi à obtenir ce que je voulais avec le bout de code de Clochete, j'ai compris maintenant qu'il n'y a pas de ligne dans les variables tableau.

    Il faut que je me plonge aussi dans les exemples de Jacques BOISGONTIER, mais j'avoue rien que les termes employés dans le message je suis perdu mais je vais persévéré.

    Merci pour votre aide !

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

Discussions similaires

  1. Tri par ordre croissant dans variable tableau
    Par jojo86 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 27/11/2009, 16h51
  2. Tri par ordre croissant
    Par KinF dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 13/12/2008, 20h19
  3. Analyse croisée : empêcher le tri par ordre croissant
    Par mouaa dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 19/02/2008, 14h08
  4. Tri par ordre croissant
    Par controle55 dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 12/01/2008, 21h16

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