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 :

erreur 9: With ActiveWorkbook.Worksheets().Sort


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    erreur 9: With ActiveWorkbook.Worksheets().Sort
    Bonjour, je suis nouveau en programmation et je rencontre un problème:

    je souhaiterai, à partir d'une plage de donnée d'un tableau à 1 colonne et n ligne, créer le même tableau mais cette fois ci avec les valeurs inverser.

    1
    2
    3
    4
    5
    6
    .....
    n


    devient:
    n
    ....
    6
    5
    4
    3
    2
    1

    Voici mon code
    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
    Sub cop()
     
    ' cop Macro
     
        Range("A3").Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.Copy
        Range("B3").Select
        ActiveSheet.Paste
        a = Selection.Cells.Count
        Range("H3") = a
        For i = 0 To a - 1
            Range("C" & i + 3) = i + 1
        Next
     
        Dim Maplage As Range
     
        Set Maplage = Range("B2:C" & a + 2)
        Range("C2") = "Final"
        Maplage.Select
     
        With ActiveWorkbook.Worksheets("Final").Sort
            .SetRange Maplage
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        Range("C2").Select
        Selection.Cut Destination:=Range("C1")
     
    End Sub


    Le code fonctionne jusqu'à Maplage.Select.
    Tout ce qui se trouve en dessous n'est plus effectué et la ligne de code With ActiveWorkbook.Worksheets("Final").Sort est soulignée en jaune.

    Merci de vos aides.

  2. #2
    Expert éminent sénior
    Pour les cas simples (moins de 3 critères), la méthode Sort de Range est beaucoup plus simple à utiliser que la méthode Sort de Worksheet.
    Lire ceci : https://msdn.microsoft.com/fr-fr/lib...6(v=office.15)

    Un autre détail : même si l'enregistreur de macro mets des Select/Selection partout, ce n'est pas un exemple à suivre. Ca complique le code et ralenti l'exécution.
    J'ai donc aussi retouché le début de ton code.

    Dernier détail : quand tu présentes un code, utilise la balise CODE (le # dans les icones) plutôt que la balise QUOTE qui est destinée aux citations.

    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
    Sub cop()
    Dim Fin As Long, i As Long
     
    Fin = Cells(Rows.Count, "A").End(xlUp).Row
    Range("A3:A" & Fin).Copy Range("B3")
    Range("H3").Value = Fin - 2
    Range("C2").Value = "Final"
    For i = 3 To Fin
       Cells(i, "C").Value = i - 2
    Next i
     
    Range("B3:C" & Fin).Sort  key1:=Range("C3"), order1:=xlAscending, header:=xlNo
     
    Range("C2").Cut Destination:=Range("C1")
    End Sub


    Pas sûr de comprendre à quoi sert le Cut final et la ligne du Range("H3") est sans doute inutile.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Membre émérite
    Bonjour,

    Je pense qu'il y a un problème dans la façon dont tu utilises la fonction Sort Ne serait-ce pas la plage MaPlage que tu veux trier ?
    Autre remarque : les Select / Activate / Selection et compagnie sont à éviter. Ils peuvent vite entraîner des erreurs qu'on a du mal à identifier. L'enregistreur de macro en met partout, mais c'est à nous de nettoyer derrière

    Voilà ce que me donne l'enregistreur de macro pour trier une plage (A1:A5, dans mon cas)

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add2 Key:=Range("A1"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Feuil1").Sort
            .SetRange Range("A1:A5")
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With


    Il te manque la partie en rouge

    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
    Sub cop()
     
    ' cop Macro
    Dim plageACopier As Range
     
    Set plageACopier = Range(Range("A3"), Range("A3").End(xlDown))
    plageACopier.Copy
    Range("B3").PasteSpecial
    a = plageACopier.Cells.Count
    Range("H3") = a
    For i = 0 To a - 1
         Range("C" & i + 3) = i + 1
    Next i
     
    Dim Maplage As Range
     
    Set Maplage = Range("B2:C" & a + 2)
    Range("C2") = "Final"
     
    ActiveWorkbook.Worksheets("Final").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Final").Sort.SortFields.Add2 Key:=maPlage, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
     
    With ActiveWorkbook.Worksheets("Final").Sort
        .SetRange Maplage
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("C2").Cut Destination:=Range("C1")
     
    End Sub


    Code non testé, à tester

  4. #4
    Membre à l'essai
    Bonjour, je viens d'effectuer le code envoyé mais celui là non plus ne fonctionne pas.
    L'erreur 9: l'indice n'appartient pas à la selection apparait toujours et la partie
    ActiveWorkbook.Worksheets("Final").Sort.SortFields.Clear

    apparait en jaune et dans mon tableau seule la colonne B est séléctionnée au lieu des colonnes B et C (Maplage)

    J'ai rajouté

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Maplage.Select


    juste avant

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    ActiveWorkbook.Worksheets("Final").Sort.SortFields.Clear


    ce qui a permis de sélectionner la plage ' Maplage' même si ça ne change rien au problème.

  5. #5
    Membre à l'essai
    Merci Menhir pour ta réponse, ton code fonctionne sans erreur mais ne sélectionne pas la plage à inverser ni n'inverse la plage.

  6. #6
    Expert éminent sénior
    Citation Envoyé par djobadi Voir le message
    Merci Menhir pour ta réponse, ton code fonctionne sans erreur mais ne sélectionne pas la plage à inverser ni n'inverse la plage.
    Tu pourrais peut-être prendre la peine d'être actif dans la résolution de ton problème en analysant le code proposé.
    Je t'ai même donner le lien vers l'aide de cette méthode.

    Change xlAscending en xlDescending.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  7. #7
    Membre à l'essai
    Merci Menhir, ça a fonctionné. J'avais essayé justement en modifiant xlAscending par xlTopToBottom et non par xlDescending sans succès.

    Encore merci.

  8. #8
    Expert éminent sénior
    Si tu avais ouvert le lien donné, tu aurais vu que xlTopToBottom n'est pas un choix pour le paramètre Order de ce Sort.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.