Erreur 1004 : erreur définie par l'application ou par l'obje

Bonjour à tous,

Débutant en VBA, je bloque sur une erreur dont je n'arrive pas à connaître la cause.

Mon problème est de faire un tri dans une feuille sur 3 colonnes.

La plage doit être par définie par une variable entrée dans la feuille en "X28"

Je dois certainement avoir un problème dans le Range, mais je ne vois pas lequel.

Ci-dessous, la macro : (l'erreur est en rouge)

Sub Tri()

'

' Tri Macro

'

' Touche de raccourci du clavier: Ctrl+d

'

Dim a As Integer

Dim b As Integer

b = ActiveWorkbook.Sheets("Tabelle1").Range("X18").Value

For a = 2 To b

If Cells(a, 3) <> " " Then

ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Clear

ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range(Cells(2, 4), Cells(b, 4)).Select _

, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range(Cells(2, 5), Cells(b, 5)).Select _

, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range(Cells(2, 6), Cells(b, 6)) _

, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

With ActiveWorkbook.Worksheets("Tabelle1").Sort

.SetRange Range("B2:V51")

.Header = xlGuess

.MatchCase = False

.Orientation = xlTopToBottom

.SortMethod = xlPinYin

.Apply

End With

Else

End If

Next a

End Sub

Merci de votre aide !

Salut Kajou,

difficile de t'aider à coup sûr là-dedans!

Explique ce que tu veux faire en ajoutant un fichier, stp!

A+

Voilà, il s'agit d'un classeur pour classement d'un tournoi.

Le problème est que je voudrais faire un tri automatique dans "Tabelle1" en cliquant simplement sur le bouton "classement", tri se portant sur les colonnes d,e,f.

Je joins le fichier en espérant pouvoir recevoir de l'aide.

Salut Kajou,

quel est la colonne sur laquelle ton tri se base ? Il ne peut y en avoir qu'une! D, E ou F ?

Tu peux éventuellement faire plusieurs tris sur les colonnes DEF pour obtenir des classements selon différents critères mais 1 colonne à la fois!

A+

Bonsoir,

Le classement se fait d'abord sur la colonne D, ensuite sur la E et enfin sur la F : Colonne D = nombre de victoires, Colonne E : différence de points, colonne F : points engrangés.

En fait, auparavant, jesélectionnais la plage(suivant le nombre de participants), puis tri, colonne D,E,F du plus grand au plus petit, mais j'aurais voulu automatiser ça par une macro.

Salut Kajou,

nous sommes d'accord que c'est toi l'arbitre mais petite précision : les points engrangés (col. F) ne devraient-ils pas être la base du premier tri ?

A+

Salut Kajou,

voici ton fichier selon tes indications : tri selon D puis selon E puis F.

Private Sub cmdTri_Click()
'
iRow = Range("C1").End(xlDown).Row
If Cells(2, 3) = "" Or iRow < 3 Then Exit Sub
'
Range("B2:V" & iRow).Sort key1:=Range("D2"), order1:=xlDescending, Orientation:=xlTopToBottom
'
For x = 1 To 2
    iTri = IIf(x = 1, 4, 5)
    sTri = IIf(x = 1, "E2", "F2")
    iFlag1 = 2
    iFlag2 = 0
    For y = 3 To iRow
        If Cells(y, iTri) <> Cells(y - 1, iTri) Or y = iRow Then
            iFlag2 = IIf(y = iRow, iRow, y - 1)
            Range("B" & iFlag1 & ":V" & iFlag2).Sort key1:=Range(sTri), order1:=xlDescending, Orientation:=xlTopToBottom, Header:=xlNo
            iFlag1 = y
        End If
    Next
Next
'
End Sub

Bon amusement!

A+

5tritabelle.xlsm (69.21 Ko)

Bonsoir,

Pour le tri ainsi, à toutes fins utiles :

Sub Tri()
    With Worksheets("Tabelle1")
        .Range("B1:V51").Sort key1:=.Range("D1"), order1:=xlDescending, key2:=.Range("E1"), _
         order2:=xlDescending, key3:=.Range("F1"), order3:=xlDescending, Header:=xlYes
    End With
End Sub

(Eviter l'enregistreur... ! )

Je ne suis pas sûr que tes formules supporteront le tri , tu verras bien (je ne me suis pas appesanti...)

Un conseil en passant : rassembler tout ton code (des modules standard) dans un seul module. Une proc. par module n'est vraiment pas une bonne idée. Je n'ose imaginer le cas où tu en aurais plusieurs centaines.

Cordialement.

Merci Curulis57 ... ça fonctionne !

Mferrand, ça fonctionne ... mais sans définition de plage ... les "-" se retrouvent après les "0" qui ne jouent pas.

merci de votre aide

@MFerrand

Waouw!

Je n'avais jamais creusé la raison d'être des Key2,... Nouvelle erreur!

Mille mercis pour cette nouvelle leçon, MFerrand et adieu à mes codes obsolètes !

Les formules de notre hôte ont tenu le coup! mais il vaut mieux calculer iRow, vu la particularité des valeurs en "D:D"!

Moralité : la curiosité en VBA est un très joli défaut!

@Kajou

Private Sub cmdTri_Click()
'
iRow = Range("C1").End(xlDown).Row
If iRow < 3 Or iRow > 51 Then Exit Sub
'
Range("B2:V" & iRow).Sort key1:=Range("D2"), order1:=xlDescending, key2:=Range("E2"), order2:=xlDescending, key3:=Range("F2"), order3:=xlDescending
'
End Sub

A+

Bonjour,

Mferrand, ça fonctionne ... mais sans définition de plage ... les "-" se retrouvent après les "0" qui ne jouent pas.

Désolé, mais je n'avais rien compris à ton problème de ce point de vue... J'ai regardé X28 (vide), X18 (vide), je n'ai pas cherché plus loin !

J'ai simplement fourni un code de tri plus facile d'utilisation que ton code enregistré La plupart des utilisateurs l'enregistrent sans le comprendre et reproduisent pieusement toutes les valeurs par défaut que ne manque pas de fourguer l'enregistreur, jusqu'à y compris le fameux xlPinYin pour définir la méthode de tri , valeur qui par son libellé devrait pourtant susciter un minimum de curiosité pour savoir quelle est cette méthode ! (il s'agit d'un tri par valeurs phonétiques pour le chinois, complètement ignoré dans le reste du monde : qu'est-ce qu'on écrit comme inutilités avec l'enregistreur ! )

A savoir pour ne pas rester idiot que la seule méthode que connait l'enregistreur est une méthode Sort qui s'applique à l'objet Worksheet, pour renvoyer un objet Sort, lequel dispose de propriétés et de méthodes que l'on définit, dont une (Apply) pour réaliser le tri. Apparue avec les versions récentes d'Excel, elle constitue une extension du modèle objet d'Excel, et offre plus de possibilité que la méthode antérieure, mais aussi plus de complexité pour définir un tri ! Aussi, si l'on fait des tris particuliers (sur les couleurs de remplissage ou couleurs de police...) cette méthode s'impose, mais dès lors que l'on trie bêtement des valeurs, la méthode Range.Sort, préexistante, et toujours existante, produira le même résultat en se définissant beaucoup plus simplement et rapidement (une ligne de code) [NB- On n'y trouve pas xlPinYin car pour les langues exigeant des méthodes de tri spécifiques, cela relève de la méthode Range.SortSpecial, que l'on n'a pas à utiliser dans nos langues à écritures alphabétiques.

Curulis (Salut !) j'ai vu que tu avais zappé une partie de la méthode ! Et en fait c'est à ton intention que j'ai mis ce bout de code...

La méthode permet de trier sur 3 champs. Quand tu en as plus, tu fais autant de tris successifs que nécessaire en les regroupant par 3 ou fractions et en traitant chaque groupe en commençant par la fin : si tu dois trier sur 5 champs, 1re tri pour les champs 4 et 5, 2e tri pour les champs 1, 2 et 3...

Cordialement.

Bonsoir MFerrand,

grand merci pour ces infos que j'ai relu deux fois pour être sûr de retenir cette belle leçon de maîtrise VBA!

C'est toujours un plaisir de te lire!

A+

Rechercher des sujets similaires à "erreur 1004 definie application obje"