Orinamento personalizzato



  • Orinamento personalizzato
    di paganiva (utente non iscritto) data: 19/04/2017 16:18:16

    Saluti a tutti
    Problemino.
    Quando faccio l'ordinamento personalizzato che ho inserito in un file, alla riapertura mi dice che il file è corrotto
    Da block notes errore:

    error069600_01.xmlRilevati errori nel file 'C:UsersvaniaDesktopSe12_anni_e_se.xlsm'Record rimossi: Ordinamento dalla parte /xl/worksheets/sheet1.xml
    Premesso che il codice non fa neanche quello che vorrei, e cioè ordinare i nomi dei tesserati, in base alla categoria colonna E iniziando però dalla 1^ Squadra, Juniores, Allievi ecc ecc come riporto nel "foglio 1" 1^ riga e a seguire le altre Categorie alfabeticamente
    Spero di essermi in qualche modo spiegato.
    Comunque e sempre grazie
     
    Sub ordina_per_CATEGORIA_Personalizzato()
      
        Range("A3:P2002").Select
       
        Application.AddCustomList ListArray:=Array("1^ Squadra", "Juniores", "Allievi A", _
            "Allievi B", "Giovanissimi A", "Giovanissimi B", "Esordienti A", "Esordienti B", _
            "Pulcini 2° anno", "Pulcini 1° anno", "Primi Calci 2° anno", "Primi Calci 1° anno", _
            "Piccoli Amici 2° anno", "Piccoli Amici 1° anno", "Preinserimento", "Prova", "All. Iscritto Albo", "All. Senza Q.", "Istr. Coni/Figc SC", "Dirig. Accomp.")
        ActiveWorkbook.Worksheets("__Tesserati__").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("__Tesserati__").Sort.SortFields.Add Key:=Range( _
            "E3:E2002"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
            "1^ Squadra,Juniores,Allievi A,Allievi B,Giovanissimi A,Giovanissimi B,Esordienti A,Esordienti B,Pulcini 2° anno,Pulcini 1° anno,Primi Calci 2° anno,Primi Calci 1° anno,Piccoli Amici 2° anno,Piccoli Amici 1° anno,Preinserimento, Prova, All. Iscritto Albo, All. Senza Q.,Istr. Coni/Figc SC, Dirig. Accomp." _
            , DataOption:=xlSortNormal
        ActiveWorkbook.Worksheets("__Tesserati__").Sort.SortFields.Add Key:=Range( _
            "A3:A2002"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        ActiveWorkbook.Worksheets("__Tesserati__").Sort.SortFields.Add Key:=Range( _
            "D3:D2002"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        With ActiveWorkbook.Worksheets("__Tesserati__").Sort
            .SetRange Range("A3:P2002")
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
       
        Range("E3").Select
      
    End Sub
    



  • di paganiva (utente non iscritto) data: 19/04/2017 16:21:12

    Mi scuso ma nel titolo ho scritto orinamento, invece di ORDINAMENTO, prego gli amministratori di correggere perchè a me non è permessso.
    Saluti e grazie



  • di Marius44 data: 19/04/2017 17:38:51

    Ciao paganiva
    Sostituisci la tua macro con quella postata sotto ed assegnala al pulsante.
    La macro ordina se è selezionata una delle celle A2, D2 o E2. Per quanto riguarda l'ordinamento della colonna E puoi aggirare il problema premettendo un numero ad ogni nome (per es. 1 - 1^ Squadra, 2 - All. Iscritto Albo) e quindi ordinare dal più piccolo al più grande. Se lasci l'elenco in quel modo l'ordinamento verrà fatto solo in ordine alfabetico, ascendente o discendente.
    Un'ultima cosa: per rendere dinamica la lista nella macro ho inserito il codice per individuare l'ultima cella piena della prima colonna.

    Prova e fai sapere.
    Ciao,
    Mario

     
    Sub OrdinamentoSelezionato()
    ord1 = "$A$2"
    ord2 = "$D$2"
    ord3 = "$E$2"
    If ActiveCell.Address <> ord1 And ActiveCell.Address <> ord2 And _
        ActiveCell.Address <> ord3 Then Exit Sub
    ur = Cells(Rows.Count, 1).End(xlUp).Row       'ultima cella piena col.A
    If ActiveCell.Address = ord1 Then 'ordina per nominativo (segue anno e cat)
        UNO = "A2:A" & ur
        DUE = "D2:D" & ur
        TRE = "E2:E" & ur
    ElseIf ActiveCell.Address = ord2 Then 'ordina per anno (segue nominativo e cat)
        UNO = "D2:D" & ur
        DUE = "A2:A" & ur
        TRE = "E2:E" & ur
    ElseIf ActiveCell.Address = ord3 Then 'ordina per cat (segue nominativo e anno)
        UNO = "E2:E" & ur
        DUE = "A2:A" & ur
        TRE = "D2:D" & ur
    End If
        ActiveWorkbook.Worksheets("__Tesserati__").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("__Tesserati__").Sort.SortFields.Add Key:=Range( _
            UNO), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        ActiveWorkbook.Worksheets("__Tesserati__").Sort.SortFields.Add Key:=Range( _
            DUE), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        ActiveWorkbook.Worksheets("__Tesserati__").Sort.SortFields.Add Key:=Range( _
            TRE), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        With ActiveWorkbook.Worksheets("__Tesserati__").Sort
            .SetRange Range("A2:O" & ur)
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End Sub
    



  • di paganiva (utente non iscritto) data: 19/04/2017 19:50:17

    Ciao Marius44
    In realtà l'ordinamento mettendo un numero davanti alla stringa era il metodo che usavo, ma successivamente avevo trovato nel web questa macro che prevede l'uso del metodo AddCustomList, e funzionava.
    Tratto da Ennius
    Elenchi Personalizzati. Sfruttiamo il metodo AddCustomList che richiede come argomento la ListArray alla quale va assegnato o un'intervallo di celle, se l'elenco deve essere preso da celle di un foglio di lavoro, oppure da una matrice (Array) nella quale scriveremo i valori, racchiusi tra doppi apici e separati da una virgola (sono gli elementi della matrice).
    Adesso ho aggiundo alla lista altri componenti e mi da errore, credo perchè non sono presenti nella colonna.
    Comunque grazie dell'interesse e della soluzione.
    Salutyi
     
    Application.AddCustomList ListArray:=Array("Cognome", "Nome", "Indirizzo", "Città", "P.iva", "telefono")  'usiamo una matrice scrivendo i componenti l'elenco 



  • di paganiva (utente non iscritto) data: 19/04/2017 22:25:04

    Ciao
    Come postato in precedenza, l'ordinamento non funzionava in quanto nella colonna indice "E" non comparivano tutti i nomi dei componenti indicati nell'array, adesso funziona.
    Ci sarà un modo perchè per rendere le matrici dinamiche in modo da renderle eseguibile anche se non tutti sono i nomi sono presenti?
    Saluti