Tri VBA : Erreur d'exécution '13': incompatibilté de type

Bonsoir (Bonjour) à tous ,

J'aimerais faire un tri personnalisé grâce à une macro.

Tout d'abord selon une liste fixe : (aaa,bbb,ccc).

Puis selon une liste variable définie par les valeurs des cellules d'une plage.

Pour cela, j'ai défini la liste de l'ordre de tri par une variable "Ordre" qui correspond à une chaîne de caractères obtenue en convertissant le tableau Nr() grâce à la fonction Array.

J'ai ensuite inséré la variable "ordre" dans les paramètres du tri comme ci-dessous

Sub tri()

Dim ordre As String 'variant
Dim ordre1 As String 'variant
Dim Nr(1 To 75) As String

    For i = 1 To 15
        Nr(i) = Cells(i, 1).Value
    Next i

    ordre = Join(Array(Nr(1), Nr(2), Nr(3), Nr(4), Nr(5), Nr(6), Nr(7), Nr(8), Nr(9), Nr(10), Nr(11), Nr(12), Nr(13), Nr(14), Nr(15)), ",")
    ordre1 = Join(Array(Chr$(34), ordre, Chr$(34)), "")

    'MsgBox ordre'***** Renvoie 10,20,30,quarante,50,60,70,80,90,100,,,,, (sans guillemets)
    'MsgBox ordre1'*****Renvoie "10,20,30,quarante,50,60,70,80,90,100,,,,," (entre guillemets)

    Range("C1:D15").Select

    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range( _
        "D1:D15"), SortOn:=xlSortOnValues, CustomOrder:= _
        "aaa,bbb,ccc", DataOption:=xlSortNormal

ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range( _
        "C1:C15"), SortOn:=xlSortOnValues, CustomOrder:=ordre, DataOption:=xlSortNormal 'ou ordre1 
'ERREUR 13: INCOMPATIBILITE DE TYPE (certainement a cause de la variable ordre

         With ActiveWorkbook.Worksheets("Feuil1").Sort
        .SetRange Range("C1:D15")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        End With

End Sub

Le problème: ça ne marche pas (ERREUR 13: INCOMPATIBILITÉ DE TYPE (certainement a cause de la variable ordre).

j'ai essayé de la déclarer comme String puis comme Variant mais toujours cette erreur

Pouvez-vous me dire ce qui cloche?

Merci d'avance pour vos réponses.

Ci-joint un fichier exemple

13tri-vba.xlsm (21.42 Ko)

Cdlt

Elo7

Bonjour,

Si tu veux faire un tel tri par VBA, je te conseillerais de t'assurer que tu peux le faire manuellement.

Le cas échéant après consultation de du chapitre Trier d'après une liste personnalisée, dans l'Aide.

Dès lors que tu parviens à trier ainsi manuellement, il n'y aura plus qu'un éventuel problème de syntaxe à régler...

Cordialement.

Bonjour,

Je ne suis pas sûre d'avoir compris votre message.

J'ai créer ce code grâce à l'enregistreur de macro, donc j'ai dû le faire manuellement dans un premier temps.

Maintenant j'aimerais un peu le modifier afin d'obtenir une macro de tri à liste (ordre) variable (ordre défini dans une plage de cellule: dans mon exemple plage A1:A10 ).

En enregistrant, je navais pas défini une nouvelle liste. Là je l'ai fait en croyant que c'était le problème et la nouveauté dans le code c'est cette partie.

 Application.AddCustomList ListArray:=Array(Nr(1), Nr(2), Nr(3), Nr(4), Nr(5), Nr(6), Nr(7), Nr(8), _
    Nr(9), Nr(10), Nr(11), Nr(12), Nr(13), Nr(14), Nr(15))

après l'instruction

 Range("C1:D15").Select

Mais ce n'est à priori pas cela la cause de l'erreur.

De plus j'ai vérifier si la liste a bien été ajoutée mais la liste ajoutée ne contient que la variable Nr(4) qui est la seule à renvoyer des lettres soit "quarante". les autres variables Nr () ont été ignorées.

Une telle Manipulation (Trier en fonction d'une liste définie par l'ordre des valeurs d'une plage de cellules) serait impossible?

Que faire?

Merci encore

cdlt

Elo7

Re bonjour,

Je sais bien que ton code provient pour une bonne part de l'enregistreur, c'est presque toujours le cas lorsqu'on utilise cette méthode de tri (au lieu de la méthode Sort de l'objet Range), et il facile de voir que ces pans de code n'ont fait l'objet d'aucune épuration : outre qu'il est reproduit façon enregistreur, il n'y a qu'à chercher xlPinYin (paramètre à la fois par défaut et dont le changement ne concerne que les langues chinoises !!!) dans le bas pour en être sûr.

Mais ce n'était pas ce qui était en question. La méthode Range.Sort n'est pas utilisable dans ton cas, le paramètre OrderCustom n'a rien à voir avec CustomOrder. Et au demeurant l'usage de l'enregistreur est au départ pleinement justifié pour trouver la syntaxe qui convient. Mon message n'avait pas d'autre sens : en réalisant une opération manuellement avec succès, on s'assure qu'elle faisable ; en l'enregistrant, on peut cerner la syntaxe adéquate sur les points délicats.

Au stade où tu en es, le problème semble se situer sur la création de la liste. Si elle ne se crée pas, soit la syntaxe n'est pas la bonne, soit le type de liste que tu veux créer n'est pas accepté par Excel. Je ne saurais dire. J'aurais le sentiment que le type de données de la liste doit être le même ?

Bon courage pour les tests.

Cordialement.

Bonsoir,

En lisant et relisant votre message, j'ai finalement compris ce que vous vouliez dire.

J'ai regardé l'aide d'excel concernant les tris comme vous me l'aviez suggéré et j'ai lu qu'il était possible de définir une telle liste (liste provenant des cellules) manuellement.

Je ne savais pas cela.

Et en testant, j'ai constaté que même manuellement ma liste n'est pas acceptée: le message affiché disait que seules les cellules contenant que des lettres seront considérées.

La liste ne doit contenir que du texte mais la mienne a des chiffres .

Du coup , j'ai mis la plage contenant ma liste au Format "texte" puis j'ai rentré les critères de tris dans les cellules ( d'abord formater puis entrer les valeurs pour que ce soit considéré comme du texte).

de plus j'ai fait des modification et le code final qui fonctionne (non épuré ) est donc:

Sub tri()

Dim ordre As String 'variant
Dim ordre1 As String 'variant
Dim Nr(1 To 75) As String

    For i = 1 To 15
        Nr(i) = Cells(i, 1).Value
    Next i

    Range("C1:D15").Select
    Application.DeleteCustomList ListNum:=10  ' Listenum est le rang de la liste de tri toujours vérifier ce numéro  et dans cette instruction on la supprime pour la remplacer par la nouvelle liste

    Application.AddCustomList Range("G9:G83")

    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range( _
        "D1:D15"), SortOn:=xlSortOnValues, CustomOrder:= _
        "aaa,bbb,ccc", DataOption:=xlSortNormal

ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range( _
        "C1:C15"), SortOn:=xlSortOnValues, CustomOrder:=10,Dataoption:=xlSortNormal ' 10 pour ma liste
'ERREUR 13: INCOMPATIBILITE DE TYPE (certainement a cause de la variable ordre

         With ActiveWorkbook.Worksheets("Feuil1").Sort
        .SetRange Range("C1:D15")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        End With

End Sub

Voilà, l'affaire est résolue.

Encore merci pour vos réponses MFerrand.

Cdlt

Elo7

Bonsoir,

Je n'y suis pour rien. Si les quelques voies d'orientation que j'ai essayé de mettre en avant ont pu servir, tant mieux. Mais c'est toi qu'il faut remercier pour être arrivé au bout de cette problématique particulière.

On pourra s'y référer ! D'autant que ce n'est pas une question courante.

Bonne continuation. Bien cordialement.

Et bon weekend.

Pour moi vous y êtes pour quelque chose. Je n'aurais jamais eu la bonne idée d'aller jeter un coup d'oeil dans l'aide de Microsoft Excel.

J'adore le travail d'équipe qu'offre ce forum! Et votre pleine participation (Eh oui! J'ai souvent des réponses de votre part sur mes sujets)

Merci et bon week-end à vous aussi.

Cdlt

Elo7

Rechercher des sujets similaires à "tri vba erreur execution incompatibilte type"