2017-10-19 17 views
1

Les données sont triées sur plusieurs champs, y compris un couple qui sont des ordres de tri personnalisés. Un des types personnalisés est par tailles, qui comprend 57 catégories. Si je déclare la variable de tri commeDéfinir l'ordre de tri personnalisé

Const SizeSort As String = "XXS,2XS,XS,S,M,L,XL,1X,2XL,2X,XXL,2X/3X,... (out to 57 items) 

Et:

.SortFields.Add Key:=Columns("H"), CustomOrder:=SizeSort 

tout fonctionne bien. Cependant, j'aimerais que quelqu'un puisse changer l'ordre de tri sans avoir à entrer dans le code lui-même. Je jouais avec l'idée d'enregistrer un classeur qui contenait l'ordre de tri courant dans une colonne, puis en utilisant:

unicorns = Cells(Rows.Count, "A").End(xlUp).Row 
For i = 1 To unicorns 
    SizeSort = SizeSort & "," & Range("A" & i) 
Next i 
SizeSort = Right(SizeSort, Len(SizeSort) - 1) 

Malheureusement, cela ne fonctionne pas - je reçois erreur d'exécution 13 Incohérence de type. J'imagine que cela a quelque chose à voir avec la déclaration Const, mais je ne peux pas comprendre pourquoi - les deux chaînes ressemblent identiques lorsqu'elles sont affichées dans la fenêtre Exécution.

+0

Ce fil peut aider https://stackoverflow.com/questions/22366188/vba-type-mismatch-on-corderorder – SJR

+2

@SJR En creusant ce fil, la réponse est d'utiliser une fonction séparée pour construire votre chaîne de tri, puis appelez-le directement à partir de l'instruction .Sort, CustomOrder: =. Bizarre, mais ça marche! Je vous remercie. – CAW

Répondre

0

Par souci d'exhaustivité, voici la méthode qui fonctionne, (adaptation de VBA Type Mismatch on CustomOrder, lien fourni par SJR):

Définir une fonction qui construit votre liste de tri:

Function Sortlist(TmpName) As String 
    '(TmpName = name of file with your sort values) 

    Dim unicorns, i As Long 
    Dim TmpBook as Workbook 
    Set TmpBook = Workbooks.Open(TmpName) 
    unicorns = Cells(Rows.Count, "A").End(xlUp).Row 
    For i = 2 To unicorns 
     Sortlist = Sortlist & "," & Range("A" & i) 
    Next i 
    Sortlist = Right(Sortlist, Len(Sortlist) - 1) 'trim the leading "," 
    TmpBook.Close 

End Function 

Alors appelez cette fonction directement à partir de votre procédure de tri:

With ActiveSheet.Sort 
    .SortFields.Clear 
    .SetRange Range("A1:M" & LR) 
    .SortFields.Add Key:=Columns("A") 
    .SortFields.Add Key:=Columns("B") 
    .SortFields.Add Key:=Columns("L"), CustomOrder:=YNSort 
    .SortFields.Add Key:=Columns("H"), CustomOrder:=Sortlist(filename) 
    .Header = xlYes 
    .Apply 
End With 

Je ne recommanderais cet pour les listes de tri personnalisés extrêmement longues, ou pour les listes qui doivent être chang ed fréquemment sans éditer le programme lui-même. Mais je peux confirmer avec certitude que cela fonctionne de cette façon ... J'apprécierais que quelqu'un puisse me dire POURQUOI, cependant!