Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Selezionate le celle mettere in ordine con precisi criteri

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Selezionate le celle mettere in ordine con precisi criteri

Postdi ikwae » 21/05/20 22:28

Ciao a tutti… ho migliaia di stringhe tipo GE_Gr2_C-04-051 terno Cagliari la stringa comprende:

Punto 1) l’indicazione della ruota iniziale (GE)
Punto 2) il gruppo di appartenenza (Gr2)
Punto 3) la cinquina(C-04)
Punto 4) il concorso (051)
Punto 5) la ruota finale (Cagliari)

La stringa “recita”: La cinquina 4, del gruppo 2, della ruota di Genova, ha realizzato un terno nel concorso 51
sulla ruota di Cagliari.
…sono all’inseguimento del terno, se lo trovo ne basta uno solo! intanto passo il tempo con il mio hobby… :undecided:

Mettendo in colonna le stringhe, riesco con semplici macro, a estrapolare nella colonna a dx un dato al massimo due
dei 5 punti sopra citati. E così si possono ordinare in funzione a dei criteri personalizzati.
Per ordinare i punti rimanenti devo rifare la procedura ma dopo aver separato le celle in sottogruppi “omogenei”.

Un lavoraccio! (che mi piace molto). Tuttavia non si ha il tempo materiale, tra una estrazione e l’altra, ad aggiungere
le nuove stringhe, ordinare i gruppi e preparare i pronostici. Quindi ho iniziato delle procedure casarecce automatizzate
a svolgere tutto il compito e altre cosucce per avere più info possibili ma alcune macro non riesco proprio a farle.
Quindi l’aiuto che cerco è una macro multiuso che, selezionate le celle, posso ordinale in uno dei 5 punti personalizzati.

Se si decide di fare una unica macro la scelta dei punti deve essere esclusivamente da codice.
Se invece si devono fare 5 macro (una per criterio personalizzato) e sono onerosi in tempo e quindi se non avrò
risposte dividerò l’aiuto in più richieste. Se invece si pensa di procedere, in allegato, un file con maggiori dettagli
sulla macro con l’esito finale.

Ringrazio anticipatamente tutti coloro che mi possono aiutare 73 ikwae
http://www.filedropper.com/zselezionecrescente
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 172
Iscritto il: 27/12/17 23:14

Sponsor
 

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi Anthony47 » 22/05/20 00:02

Hummm...
Credo che puoi ottenere quello che cerchi con delle semplici macro autoregistrate. Ad esempio:
-copi tutta la colonna dei dati (diciamo la A) e la incolli nella colonna adiacente (diciamo la B)
-selezionata la colonna B, usando il comando Trova e Sostituisci cerchi i "_" e li sostituisci con " " ("spazio")
-sempre selezionando la colonna B, metti in 7 colonne i campi che compongono il dato complessivo; la prima riga risultera' cosi' frazionata: BA/Gr1/C-14/-/152/tern/Bari
A questo punto puoi selezionare da colonna A fino all'ultima e impostare un ordinamento per i campi che vuoi tu; immagino che il primo ordinamento sara' per i campi BA + Gr1 + C-14 + 152
Ripetendo l'ordinamento con altri parametri avrai il secondo risultato, e poi il terzo etc etc

Se fai tutto questo mentre registri una macro avrai a disposizione 5 macro da lanciare a piacere in funzione del risultato da ottenere.
Per i suggerimenti di base su come registrare una macro: viewtopic.php?f=26&t=103893&p=622593#p622593

Se questo processo non ti quadra allora faremo altri ragionamenti.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17041
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi ikwae » 22/05/20 08:54

Ciao Anthony gentilissimo come sempre a rispondermi.... ho seguito le tue indicazioni(per quello che ho capito) e ho registrato tre macro ma tutte riportano il nome del foglio, colonne e celle. Dato che le macro devono essere "anonime" da applicare in selezioni di volta in volta diverse ossia senza riferimenti a fogli o celle gradirei se possibile delle semplicissime macro che se riesco li posso modificare per altri lavori dato che ho una oceanica mole di dati di ambi terni e quaterne. Ringraziandoti per il tuo gradito e prezioso aiuto cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 172
Iscritto il: 27/12/17 23:14

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi Anthony47 » 22/05/20 20:31

Con un po' di prova e riprova una macro autoregistrata puo' essere modificata per ottenere risultati diversi; alcuni esempi sono descritti qui: viewtopic.php?f=26&t=103893&p=647676#p647676

Comunque io in questo caso non ho proprio capito che cosa vorresti ottenere; ti propongo quindi questa macro che puo' ordinare i tuoi dati con criteri personalizzati:
Codice: Seleziona tutto
Sub FlexSort()
Dim PKey(), keyS, BArr, CArr(), kRow As String, kSplit
Dim I As Long, J As Long, SwapI As String
'
keyS = Array(4, 1)                  '<<< I CAMPI secondo cui ordinare
ReDim PKey(1 To UBound(keyS) + 1)
BArr = Range(Selection, Selection.End(xlDown)).Value
ReDim CArr(1 To UBound(BArr), 1 To UBound(BArr, 2))
kRow = Replace(Replace(BArr(2, 1), "_", " ", , , vbTextCompare), " - ", " ", , , vbTextCompare)
kSplit = Split(kRow, " ", , vbTextCompare)
For I = 0 To UBound(keyS)
    PKey(I + 1) = InStr(1, BArr(2, 1), kSplit(keyS(I) - 1), vbTextCompare)
Next I
For I = 1 To UBound(BArr)
    For J = 1 To UBound(PKey)
        CArr(I, 1) = CArr(I, 1) & Mid(BArr(I, 1), PKey(J), 4)
    Next J
Next I
'fase di bblsort:
For I = 1 To UBound(CArr) - 1
    For J = I + 1 To UBound(CArr)
        If UCase(CArr(I, 1)) > UCase(CArr(J, 1)) Then
            SwapI = CArr(I, 1)
            CArr(I, 1) = CArr(J, 1)
            CArr(J, 1) = SwapI
            SwapI = BArr(I, 1)
            BArr(I, 1) = BArr(J, 1)
            BArr(J, 1) = SwapI
        End If
    Next J
Next I
'Area di Output:
'Selection.Cells(1, 1).Offset(0, 1).Resize(UBound(BArr), 1) = BArr   'Ipotesi "Colonna adiacente"
Selection.Cells(1, 1).Resize(UBound(BArr), 1) = BArr                'Ipotesi "Rimpiazza"
End Sub


L'istruzione marcata <<< consente di indicare quali campi saranno valutati, e in quale ordine, per l'ordinamento. Le corrispondenze sono queste:
Codice: Seleziona tutto
-1--2---3------4---5----6-
BA_Gr1_C-14 - 152 tern Bari

Devi selezionare la prima cella della tabella da ordinare. Poi avvia la macro; verrà "lavorata" l'area sottostante alla cella selezionata, fino alla prima cella vuota.
I dati vengono ordinati in memoria, e alla fine vengono riscritti sul foglio Excel.
Nel codice proposto, la scrittura dei dati ordinati avviene per sostituzione dei dati originali (vedi istruzione marcata "Ipotesi Rimpiazza"); ma e' possibile che i dati ordinati vengano replicati in una posizione diversa, es nella colonna adiacente (vedi l'istruzione commentata marcata "Ipotesi Colonna adiacente")

Potrai quindi creare N copie della macro, ognuna con chiavi di ordinamento diverse secondo i tuoi bisogni

Fai sapere se con questa macro risolvi la questione
Avatar utente
Anthony47
Moderatore
 
Post: 17041
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi ikwae » 23/05/20 00:53

Gentilissimo Anthony …

ho provato tua la proposta di macro inserendo cinque chiavi che di volta in volta commento e tutte funzionano
in modo crescente al 100% sia selezionando la prima cella che l’intero range di celle perfette come da richiesta.

Tuttavia l’ordinamento crescente, purtroppo, solo per i punti 1 e 3 sono giusti mentre i rimanenti (2-4-6) anche se
funzionanti non seguono i criteri specifici descritti sul foglio INFO in allegato con il primo post.

'-1-----2----3- -----4-----5----6-
' BA_ Gr1_C-14 – 152 tern Bari

-in particolare il punto riferito ai gruppi (2) anziché ordinare in Gr0 Gr1 Gr2 dovrebbe ordinare decrescente Gr2 Gr1 Gr0

-in particolare il punto riferito ai concorsi (4) anziché ordinare dall’1 al 157 dovrebbe
ordinare “spezzato” da 140 al 157 e dal 1 al 139 perché, come già indicato, dal 140
al 157 sono concorsi del 2019 mentre dall’1 al 139 sono concorsi del 2020.

-in particolare il punto riferito alla ruota finale (6) scrive la ruota Nazionale sotto a quella
di Napoli ma dovrebbe essere ultima

Aggiungo che non sono capricci di pignoleria ma tutto il “mondo” dei miei dati, che
sono oceanici e, le mie semplici macro di tipo casareccio, sono “configurate” con i
criteri descritti sopra e come specificato nel foglio INFO allegato al primo post.

Indico come info la prova che ho fatto per il punto 2(Gruppi) provando il tempo di esecuzione
con 5mila righe ordinandole in pochi istanti mentre con 254.404 righe ha impiegato un tempo
ragionevolmente accettabile (sempre in ordine crescente che non va bene). Quindi tempo ok.

Mentre facevo la prova per il punto 2 ho trovato altre stringhe che contengono anche
l’anno (ricerche attuali con estensione agli anni precedenti) e ho notato subito la diversa
lunghezza e all’istante ho provato la macro e funziona ugualmente in tutti i punti tranne
per il punto 6 (ruota finale) non ha nessun segno di “vita” anche se si clicca per mandare in
esecuzione la macro non succede nulla.

BA_Gr0_C-16 - 009 ambo (20) Palermo
BA_Gr0_C-03 - 037 ambo (19) Genova
MI_Gr2_C-02 - 034 ambo (13) Palermo
MI_Gr1_C-04 - 126 ambo (12) Bari

Pertanto se potresti aggiungere una chiave tipo 7 (personalizzata) che “richiama” alcune righe di
codice come riferimento ai punti da aggiustare e anche alla diversità dell’anno (punto 6) io scriverei nelle
righe richiamate le giuste indicazioni di ordinamento come menzionate sul foglio INFO e sopra riportate.

Nel ringraziarti mille e mille volte per il tempo che mi stai dedicando e la tua gradita pazienza cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 172
Iscritto il: 27/12/17 23:14

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi Anthony47 » 23/05/20 15:20

Pero' tu non puoi chiederci di andare a leggere tra le righe degli allegati per capire che cosa stai chiedendo...

Comunque dopo le ultime informazioni sono tornato all'ipotesi di una macro autoregistrata che copia i dati in un nuovo foglio, li mette in colonna, aggiusta le varie colonne perche' siano compatibili con le tue ipotesi (anche quelle fantasione, tipo l'ordinamento a zigo-zago), esegue l'ordinamento, restituisce l'array ordinato ed elimina il foglio di servizio.
Il tutto e' riconducibile al seguente codice:
Codice: Seleziona tutto
Sub Registrata()
' +-------------------------------------------------------------------------------------------
' |  RICORDA LE CONVENZIONI:
' |      CAMPI (valore Intero)
' |  2  3   4      6   7   8
' |  BA Gr1 C-04 - 152 tern Bari
' |      ORDINE (valore Decimale)
' |  x.0 o x.1=Crescente; > x.1=Decrescente
' |     ESEMPIO:
' |  keyS = Array(6, 2.1, 3.2)
' |  Ordine Crescente su campo 6; Ordine Crescente su campo 2;  Ordine Decrescente su campo 3
' +-------------------------------------------------------------------------------------------
'
Dim wArr, newSh As Worksheet, StSh As Worksheet
keyS = Array(2, 3.2, 6)             '<<< I CAMPI secondo cui ordinare
'
    Set StSh = ActiveSheet
    Selection.Cells(1, 1).Select
    Range(Selection, Selection.End(xlDown)).Copy
    Sheets.Add
    Set newSh = ActiveSheet
'
    Range("A1").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Selection.Replace What:="_", Replacement:=" ", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
    Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1), Array(9, 1)), TrailingMinusNumbers:=True
'Stop               '???Decodifica tracciato
Call BNorm(1)
'Call CNorm
Call FNorm(1)
Call SSort(keyS)
wArr = newSh.Range(Range("A1"), Range("A1").End(xlDown)).Value
Stop
Application.DisplayAlerts = False
newSh.Delete
Application.DisplayAlerts = True
StSh.Select
'COMPILA AREA DEI RISULTATI:
Selection.Cells(1, 2).Resize(UBound(wArr), 1).Value = wArr          'Ipotesi colonna Adiacente
'Selection.Cells(1, 1).Resize(UBound(wArr), 1).Value = wArr          'Ipotesi RIMPIAZZA
Beep
End Sub


Sub BNorm(Dummy)
'Dim wArr, I As Long
'
Range(Range("B1"), Range("B1").End(xlDown)).Select
    Selection.Replace What:="RN", Replacement:="ZZ", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
End Sub


Sub FNorm(Dummy)
Dim wArr, I As Long, cWA As Long, xTra As String
'
wArr = Range(Range("F1"), Range("F1").End(xlDown)).Value
For I = 1 To UBound(wArr)
    cWA = wArr(I, 1)
    If cWA > 139 Then xTra = "A" Else xTra = "B"
    wArr(I, 1) = xTra & Format(cWA, "000")
Next I
Range("F1").Resize(UBound(wArr), 1).Value = wArr
End Sub


Sub SSort(SKeys)
'
Dim RCnt As Long, CCnt As Long, I As Long, sOrd As Long
    Range("A1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    RCnt = Selection.Rows.Count
    CCnt = Selection.Columns.Count
    ActiveWorkbook.Worksheets(ActiveSheet.Name).Sort.SortFields.Clear
    For I = 0 To UBound(SKeys)
    If SKeys(I) * 10 Mod 10 < 2 Then sOrd = 1 Else sOrd = 2
        ActiveWorkbook.Worksheets(ActiveSheet.Name).Sort.SortFields.Add2 Key:=Cells(1, Int(SKeys(I))).Resize(RCnt, 1) _
            , SortOn:=xlSortOnValues, Order:=sOrd, DataOption:=xlSortNormal
    Next I
    With ActiveWorkbook.Worksheets(ActiveSheet.Name).Sort
        .SetRange Range("A1").Resize(RCnt, CCnt)
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

In testa alla Sub Registrata e' possibile definire quali campi vanno ordinati e in quale sequenza; cioe' e' possibile indicare quale campo ordinare e se Crescente o Decrescente.
Riporto qui le convenzioni a cui devi attenerti:
Codice: Seleziona tutto
' |  RICORDA LE CONVENZIONI:
' |      CAMPI (valore Intero)
' |  2   3   4      6   7   8
' |  BA Gr1 C-04 - 152 tern Bari
' |      ORDINE (valore Decimale)
' |  x.0 o x.1=Crescente; >= x.2=Decrescente
' |     ESEMPIO:
' |  keyS = Array(6, 2.1, 3.2)
' |  Ordine Crescente su campo 6; Ordine Crescente su campo 2;  Ordine Decrescente su campo 3


In particolare ho capito che ti serve indicare come Decrescente l'ordinamento del campo "3" (quindi scriverai: 3.2)

Puoi quindi creare tante Sub RegistrataXX, ognuna con una sua logica di ordinamento impostata tramite l'istruzione keyS=Array(etc etc)

Nel codice ho inserito uno Stop, per farti vedere quali dati sono stati utilizzati per eseguire il lavoro; magari c'e' qualche colonna che ti puo' interessare.
Quando hai visto, completa la macro tramite il comando F5 (Continua), poi elimina lo Stop

Il dato cosi' ordinato viene infine riportato nel foglio di partenza, nella colonna "Adiacente" a quella di partenza; se modifichi le istruzioni in coda alla Sub Registrata (vedi 'COMPILA AREA DEI RISULTATI) puoi scrivere i risultati in altre posizioni (ad esempio puoi RIMPIAZZARE quelli di partenza, anche se io non raccomando mai di alterare i dati di partenza)

Quanto ho detto e' riferito al tracciato record contenuto nel file pubblicato.
Se cambi il tracciato allora devi ridecodificare i campi: a questo scopo ho inserito uno Stop per ora "Commentato" (vedi riga "???Decodifica tracciato").
Se "scommenti" lo Stop (elimina l'apostrofo iniziale) la macro si fermera' e ti permettera' di verificare quanti campi sono stati creati e come sono identificabili (usa la colonna: 2=B, 3=C, etc etc)
In questo modo potrai impostare chiavi di ordinamento diverse da quelle originali.

Insomma dovresti avere uno strumento adattabile ai tuoi imprevedibili bisogni.
Per tutto questo credo sia equo un compenso pari al 10% delle vincite (delle perdite non voglio sentire parlare, neh?)

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17041
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi ikwae » 23/05/20 21:25

Gentilissimo Anthony …
Ho letto con attenzione il tuo post e nell’esecuzione della macro si blocca e diventa giallo la parte asteriscata.
Codice: Seleziona tutto
Application.CutCopyMode = False
 '**************************************************************************************************
    Selection.Replace What:="_", Replacement:=" ", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
 '*************************************************************************************************
    Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
        ... ....
'Stop               '???Decodifica tracciato
Call BNorm(1)

Le procedure che ho eseguito; aperto il file dell’allegato del primo post ho incollato le macro
in un nuovo modulo ho selezionato la cella A6 del foglio FINE ho mandato in esecuzione
la Sub Registrata () con diverse chiavi (una alla volta) ma esce sempre l’errore su menzionato.
Codice: Seleziona tutto
 keyS = Array(3.2) ‘ questa dovrebbe essere quella giusta per i gruppi se ho capito bene!
‘keyS = Array(3.1)
'keyS = Array(3, 1)
'keyS = Array(3)
'keyS = Array(3, 3.1)
'keyS = Array(2, 3.2, 6) '<<< I CAMPI secondo cui ordinare 

Quindi non sono riuscito a fare nulla solo prove inconcludenti. Dove sbaglio? cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 172
Iscritto il: 27/12/17 23:14

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi Anthony47 » 24/05/20 00:09

Elimina la parte ", FormulaVersion:=xlReplaceFormula2", cioe' termina con "ReplaceFormat:=False"; credo sia un parametro introdotto in versioni recenti di Excel (ma ora non posso controllare)
Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17041
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi ikwae » 24/05/20 01:14

ho remmato come hai scritto è andato avanti e si è bloccato ancora alla Sub BNorm (Dummy) ho remmato anche qui lo stesso di prima e si è fermato alla Sub SSort (SKeys) avvisando errore di runtime '438': Proprietà o metodo non supportati dall'oggetto . Se ti viene in mente qualche cosa va bene altrimenti domani farò altre prove con calma e ti farò sapere per adesso buona notte.
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 172
Iscritto il: 27/12/17 23:14

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi Anthony47 » 24/05/20 12:03

Togli la riga .SortMethod = xlPinYin
Se ancora non va allora, quando va in debug ferma la macro e registra una tua macro di ordinamento della tabella che vedi nel foglio, con campi a piacere.
Poi confronta il codice della tua macro con quello della Sub SSort (la seconda parte) e cerca di trovare quale e' il comando non compatibile.
Se non ci riesci allora pubblica il tuo codice e vedremo...
Avatar utente
Anthony47
Moderatore
 
Post: 17041
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi ikwae » 24/05/20 22:42

Gentilissimo Anthony … mi hai chiesto di remmare SortMethod = xlPinYin ma sia remmato,
che non, si ferma molto prima quindi lo stesso ho registrato la macro che hai richiesto
con esito positivo. Penso che sia un problema a monte. Inutile dirti che ho passato ore a capire
come risolvere ma senza speranza... Poi ho fatto un confronto con qualche sostituzione dei valori
giusti della macro registrata con quella che evidenzia di giallo con errore ma non riesco a “leggere” :diavolo: :diavolo:
'
Codice: Seleziona tutto
  >>>>>wae macro registrata esito positivo
 Range("A1:H32").Select
 ActiveWorkbook.Worksheets("Foglio2").Sort.SortFields.Clear
 ActiveWorkbook.Worksheets("Foglio2"). _
 Sort.SortFields.Add Key:=Range("C1:C32"), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ‘--------------------------------------------------------------------
 'Sub SSort(SKeys) wae >>>>>>tutte linee di errore
 ActiveWorkbook.Worksheets(ActiveSheet.Name). _ (wae si presume ok)
 Sort.SortFields.Add2 Key:=Cells(1, Int(SKeys(I))).Resize(RCnt, 1), _ (FORSE UN 90% CHE L’ERRORE è QUI!!)
 SortOn:=xlSortOnValues, Order:=sOrd, DataOption:=xlSortNormal (wae si presume ok)

Finito il confronto e girando sul foglio creato dalla tua macro mi sono accorto, quando
esce l’errore, che sulla colonna dei Concorsi c’è una lettera davanti al numero pensando
che sia uno sbaglio ma poi forse ho capito che la macro mette la lettera per non perdere
gli zeri iniziali... è giusto così?
BA Gr1 C-14 -A152 ternBari
BA Gr1 C-04 -B008 ternCagliari
CA Gr0 C-18 -B042 ternVenezia
CA Gr1 C-18 -B031 ternTorino
CA Gr1 C-16 -A151 ternBari

Ricapitolando due delle 5 macro sono già sicure e ci sono. Adesso mancano tre: Gruppi decrescenti. La ruota Nazionale che deve essere scritta come ultima voce . Il Concorso che penso che sia il più importante delle 5 macro richieste per l’aiuto ossia “”le tue ipotesi (anche quelle fantasiose, tipo l'ordinamento a zigo-zago),”” a questo punto ho registrato una macro completa che funge a meraviglia ma non la posso usare perché come detto su ha i riferimenti a fogli e range.
Codice: Seleziona tutto
Uno stralcio importante dopo “TestoInColonne”…     
    Range("B6:D37").Select
    ActiveWorkbook.Worksheets("FINE").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("FINE").Sort.SortFields.Add Key:=Range("C6:C37"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _ "140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,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,34,35,36,37,38,39,40,41,42,43, 44 _
44,45,46,47,48,49,50" _
        , DataOption:=xlSortNormal ‘(wae per le prove fino a 50)
    With ActiveWorkbook.Worksheets("FINE").Sort
        .SetRange Range("B6:D37")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

Sarei molto contento riuscire a trovare l’errore da solo ma penso che sia tempo invano e sprecato
addirittura sottratto a qualche aiuto (ad altre persone) più importante tipo il lavoro e non a un hobby
perché non ho conoscenza per questo “livello” avanzato, almeno per adesso, forse a dir poco tra una
decina di anni potrei anche riuscirci. Prova a vedere se con le mie misere indicazioni riesci a fare qualche
cosa. Cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 172
Iscritto il: 27/12/17 23:14

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi Anthony47 » 25/05/20 02:13

Allora confermo la rimozione di SortMethod = xlPinYin, e poi devi, nella mia Sort.SortFields.Add2 etc etc usare .Add invece che .Add2
La lettera prima del numero serve per ottenere l'ordinamento zigo-zago

Con un margine di confidenza superiore al 50% direi che ora dovrebbe arrivare fino in fondo, ordinando come gli dici di fare.
Ri-riprova....
Avatar utente
Anthony47
Moderatore
 
Post: 17041
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi ikwae » 25/05/20 18:12

Gentilissimo Anthony …
Siamo a 4 e mezzo delle 5 macro dell’aiuto richiesto. :) Dico 4 e mezzo perché quella della ruota finale non scrive come ultima
la ruota Nazionale. Dato che tutte le altre funzionano e, con le tue “Divine” info, ho registrato una macro e per mezza giornata
ho tolto i fastidiosi blocchi gialli perché in conflitto. Finito con il conflitto passo altra mezza giornata per mandare in
esecuzione la macro registrata e ci sono riuscito ma l’esito finale non cambia anche se accetta la macro con l’ordinamento corretto. Purtroppo l’ordinamento che propone come ordinamento finale è errato.

Qualche info maggiore per finire anche la mezza macro? Cordialmente ikwae

Codice: Seleziona tutto
Sub CNorm() ' RUOTA FINALE PERSONALIZZATA       
        'Range(Range("H1"), Range("H1").End(xlDown)).Select
        Columns("B:H").Select
        ActiveWorkbook.Worksheets(ActiveSheet.Name).Sort.SortFields.Clear
        ActiveWorkbook.Worksheets(ActiveSheet.Name).Sort.SortFields.Add Key:=Range("H1:H32") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
        "Bari,Cagliari,Firenze,Genova,Milano,Napoli,Palermo,Roma,Torino,Venezia,Nazionale" _
        , DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets(ActiveSheet.Name).Sort
        .SetRange Range("B1:H32")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With   
End Sub     
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 172
Iscritto il: 27/12/17 23:14

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi Anthony47 » 26/05/20 00:35

Ma quindi hai abbandonato il mio codice? Non me la prendo, e puoi sempre copiare come avevo risolto (almeno spero) l'ordinamento di RN (vedi Sub BNorm)

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17041
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi ikwae » 26/05/20 11:19

Gentilissimo Anthony ….
Anthony47 ha scritto:Ma quindi hai abbandonato il mio codice? Non me la prendo, e puoi sempre copiare come avevo risolto (almeno spero) l'ordinamento di RN (vedi Sub BNorm)
Ciao

Non lo pensare nemmeno… anche perché non so come puoi pensare minimamente
una cosa del genere dato che sto lavorando unicamente sulla tua magnifica macro…
Detto questo, come ho detto su, ho passato diverse ore a cercare soluzioni e in particolare
provando sulla CALL Sub FNorm(Dummy) (quella dei concorsi per capirci) per modificarla
a dare una codifica iniziale e finale (come hai fatto tu con le lettere) ma come detto non ci
sono speranze… Quindi pensando altre soluzioni ho notato che la 'Call CNorm sia un
diminutivo di CN(ormale) che, solitamente è commentata, ho pensato che l’hai messa
per procedure personalizzate e da qui la macro che ho registrato sopra postata.
Codice: Seleziona tutto
    Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1), Array(9, 1)), TrailingMinusNumbers:=True
'Stop                  '???Decodifica tracciato
Call BNorm(1)
'Call CNorm  <<<<<<<<<<<<<<<<<<<<<<<<<<<
Call FNorm(1)
Call SSort(keyS)
wArr = newSh.Range(Range("A1"), Range("A1").End(xlDown)).Value

Con spunto al tuo ultimo post ho sostituito, impropriamente, le colonne da A a H ma il risultato
anche se errato non lo considera affatto.

Codice: Seleziona tutto
Sub BNorm(Dummy)
'Dim wArr, I As Long
'
Range(Range("H1"), Range("H1").End(xlDown)).Select
    Selection.Replace What:="Nazionale", Replacement:="ZZ", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False ', FormulaVersion:=xlReplaceFormula2 
'Stop
End Sub

Per poter procedere dovrei sapere quale è l’istruzione o il rigo di codice che chiude
Il foglio “aggiunto” per poi cancellarlo. Ossia che cosa “blocca” o “Imprime”
l’ordinamento che è stato generato prima sul foglio aggiunto. Ho anche escluso,
nelle prove, il riordino delle chiavi e l’ordinamento rimane. Ti dico questo perché
ho seguito con tanti “Stop” l’ordinamento sul foglio e rimane (con l’ordinamento voluto)
fino al rigo di codice che cancella il foglio che una volta cancellato proporre l’ordinamento finale errato.

Finite le macro per l’ordinamento si devono rimettere le due “_” che sono state
tolte all’inizio della macro ma questo penso che con una semplice macro
Concatena o Replace lo posso fare ma dovrei sapere che cosa blocca
l’ordinamento che poi viene proposta come soluzione finale. Cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 172
Iscritto il: 27/12/17 23:14

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi Anthony47 » 26/05/20 14:38

Se stai lavorando col mio codice allora non capisco le difficolta' che incontri ancora.

Ripeto il comportamento della Sub Registrata e il resto del codice:
-l'utente imposta nel codice della macro i campi e il tipo di ordinamento (crescente/decrescente) che gli servono
-l'utente seleziona l'origine di una tabella di dati (tipo NA_Gr1_C-16 - 031 tern Nazionale), poi avvia la macro.
-la macro crea un nuovo foglio di servizio
-sul nuovo foglio crea una copia della tabella dati
-la stessa tabella viene suddivisa in N colonne (NA /Gr1/C-16 /- / 031 /tern / Nazionale)
-vengono fatte sulle colonne B ed F delle "normalizzazioni" per adattare i dati alle esigenze (in colonna B, RN viene sostituita da ZZ per avere la "ruota nazionale" in coda a tutte le altre; in colonna F si aggiunge un prefisso per ottenere l'ordinamento "zigo-zago")
-selezionate tutte le colonne, dalla A (dati originali) alla H, viene eseguito un ordinamento secondo i parametri indicati
-a fine ordinamento la colonna A, cioe' i dati originali ma ordinati, vengono copiati in memoria
-qui la macro ha uno Stop utile per visionare il risultato degli ordinamenti; poi lo rimuovi
-il foglio di servizio viene rimosso
-i dati in memoria vengono incollati in un'area anche essa impostabile nel codice (ora e' scritto "copia nella colonna adiacente alla tabella di origine", vedi riga Selection.Cells(1, 2).Resize(UBound(wArr), 1).Value = wArr)

Quindi col codice che ti ho dato, applicate le variazioni per compatibilita' con la tua versione, dovresti avere la tabella prescelta ordinata secondo i campi e le modalita' indicate nel codice.
Se non ottieni quanto ho detto, allora c'e' ancora qualche problema da risolvere
Se quello che ottieni non e' quello che volevi allora c'e' un altro problema, prima da capire e poi da affrontare

Quindi, tu dove sei arrivato?

Hai anche notato la presenza di una Sub CNorm, che poi non viene richiamata dalla Sub Registrata; questa inizialmente doveva servire per predisporre l'ordinamento inverso sulla colonna C (Grxx), ma alla fine ho preferito inserire la possibilita' di scegliere se un campo va ordinato Crescente o Decrescente, quindi la "normalizzazione" di quella colonna non serve piu', basta che tu tenga presente che vuoi l'ordinamento al contrario e lo imposti nell'istruzione keyS = Array(etc etc)
Insomma la Sub CNorm avrei fatto meglio a cancellarla dal codice

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17041
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi ikwae » 26/05/20 18:56

Gentilissimo Anthony ….
Subito dopo il mio ultimo post sono andato a cercare delle tue efficienti macro di precedenti aiuti e
ho capito come è impostato il flusso della scrittura e qui “apriti cielo” sono riuscito e finire tutto.
Poi hai confermato la procedura con il tuo ultimo post. A questo punto finite le 5 macro per poterle
utilizzare ossia metterle in circolo con lo standard degli altri necessita che si ricompongano i due
trattini “_” che sono stati tolti prima ma dato che è una settimana che ti sto facendo perdere tempo
e conoscendo ormai la struttura della macro vorrei farlo da solo e quindi se non hai qualche info
strategico si può chiudere il post. Se non riesco a fare qualche cosa è possibile che nei prossimi
mesi ti chiuderò aiuto.

Codice: Seleziona tutto
Selection.Replace What:="_", Replacement:=" ", LookAt:=xlPart, _
       SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
       ReplaceFormat:=False ', FormulaVersion:=xlReplaceFormula2

Pertanto ringraziandoti per la tua cortesia e la gentilezza e soprattutto per la tua pazienza posso
rinnovare la spaghettata sui Navigli a Milano e te e tutti i collaboratori del Forum di pc-facile.
Cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 172
Iscritto il: 27/12/17 23:14

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi Anthony47 » 27/05/20 11:46

Ah gia'...
Per ripristinare il formato, nella Sub Registrata possiamo aggiungere questo blocco in questa posizione:
Codice: Seleziona tutto
wArr = newSh.Range(Range("A1"), Range("A1").End(xlDown)).Value
'>>> Blocco da ggiungere:
For I = 1 To UBound(wArr)
    wArr(I, 1) = Replace(wArr(I, 1), " ", "_", 1, 2, vbTextCompare)
Next I
'<<< Fine blocco
Stop

Quanto ai Navigli, stai tranquillo che prima o poi ti facciamo pagare tutto :D :D

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17041
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi ikwae » 27/05/20 12:30

Anthony47 ha scritto:Ah gia'...
Per ripristinare il formato, nella Sub Registrata possiamo aggiungere questo blocco in questa posizione:
Codice: Seleziona tutto
wArr = newSh.Range(Range("A1"), Range("A1").End(xlDown)).Value
'>>> Blocco da ggiungere:
For I = 1 To UBound(wArr)
    wArr(I, 1) = Replace(wArr(I, 1), " ", "_", 1, 2, vbTextCompare)
Next I
'<<< Fine blocco
Stop

Quanto ai Navigli, stai tranquillo che prima o poi ti facciamo pagare tutto :D :D
Ciao


Gentilissimo Anthony ... ho appena finito le 5 macro come le volevo :lol: :lol: e stavo preparando il file per completare, come
giusto che sia il post e, aggiungendo le risposte che non ti ho dato nei precedenti post .... Il tempo di renderlo "leggibile" e l
o allego. Cordialmente ikwae

Note: la tua gradita e apprezzata soluzione l'ho pensata per prima ma poi ho pensato che metterebbe i "_" anche negli spazi
del terno e della ruota finale e quindi ho fatto diversamente.
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 172
Iscritto il: 27/12/17 23:14

Re: Selezionate le celle mettere in ordine con precisi crite

Postdi Anthony47 » 27/05/20 13:06

Note: la tua gradita e apprezzata soluzione l'ho pensata per prima ma poi ho pensato che metterebbe i "_" anche negli spazi
del terno e della ruota finale e quindi ho fatto diversamente.
Ma se la guardi bene vedrai che non é come ti aspettavi, con i parametri giusti
Comunque hai fatto bene ad andare avanti da solo!
Avatar utente
Anthony47
Moderatore
 
Post: 17041
Iscritto il: 21/03/06 16:03
Località: Ivrea

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Selezionate le celle mettere in ordine con precisi criteri":


Chi c’è in linea

Visitano il forum: Nessuno e 45 ospiti