Condividi tramite

Ordinare decrescente - Ottimizzazione macro

Anonimo
2016-02-03T14:44:46+00:00

Salve,

ho un file excel con diversi fogli.

Vorrei ordinare il range di celle A2:D41 in ordine crescente sencondo la colonna D

Ho utilizzato la segunete macro, che vorrei ottimizzare

Sub ORDINA()

    Range("A2:D41").Select

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

    ActiveWorkbook.Worksheets("123 ").Sort.SortFields.Add Key:=Range("A2:A41") _

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

    ActiveWorkbook.Worksheets("123 ").Sort.SortFields.Add Key:=Range("D2:D41") _

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

    With ActiveWorkbook.Worksheets("123 ").Sort

        .SetRange Range("A1:D41")

        .Header = xlYes

        .MatchCase = False

        .Orientation = xlTopToBottom

        .SortMethod = xlPinYin

        .Apply

    End With

    Range("A2").Select

End Sub

A tale macro ho associato in ogni foglio un pulsante.

Ora, se mi trovo nel foglio 123 tutto funziona, ma se modifico il suo nome, mi va in errore.

Potreste ottimizzarmi la macro in modo che indipendentemente dal nome del foglio mi funzioni solo sul foglio attivo.

GRAZIE

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2016-02-04T00:01:36+00:00

Ciao frysky

Oltre agli ottimi suggerimenti di Mauro, credo sia consigliabile evitare, quando possibile,  le selezioni di celle. Pertanto, sfruttando i suggerimenti di Mauro, forse prova  qualcosa del genere:

'=========>>

Option Explicit

'--------->>

Public Sub ORDINA()

    Dim SH As Worksheet

    Dim Rng As Range

    Dim Res As Variant

    Const myCells As String = "A1:D41"                                 '<<=== Modifica

    Set SH = ActiveSheet

    Set Rng = SH.Range(myCells)

    With SH.Sort

        With .SortFields

            .Clear

            .Add Key:=Rng.Columns(1), _

                 SortOn:=xlSortOnValues, _

                 Order:=xlAscending, _

                 DataOption:=xlSortNormal

            .Add Key:=Rng.Columns(Rng.Columns.Count), _

                 SortOn:=xlSortOnValues, _

                 Order:=xlAscending, _

                 DataOption:=xlSortNormal

            End With

                .SetRange Rng

                .Header = xlYes

                .MatchCase = False

                .Orientation = xlTopToBottom

                .SortMethod = xlPinYin

                .Apply

            End With

End Sub

'<<=========

Se il numero di righe o colonne fosse variabile, da un foglio ad un altro e, a patto che l'intervallo da ordinare fosse racchiuso ad ogni lato da una riga o colonna vuota, forse potresti provare invece la seguente versione:

'=========>>

Option Explicit

'--------->>

Public Sub ORDINA()

    Dim SH As Worksheet

    Dim Rng As Range

    Dim Res As Variant

    Set SH = ActiveSheet

    Set Rng = SH.Range("A1").CurrentRegion

    With SH.Sort

        With .SortFields

            .Clear

            .Add Key:=Rng.Columns(1), _

                 SortOn:=xlSortOnValues, _

                 Order:=xlAscending, _

                 DataOption:=xlSortNormal

            .Add Key:=Rng.Columns(Rng.Columns.Count), _

                 SortOn:=xlSortOnValues, _

                 Order:=xlAscending, _

                 DataOption:=xlSortNormal

            End With

                .SetRange Rng

                .Header = xlYes

                .MatchCase = False

                .Orientation = xlTopToBottom

                .SortMethod = xlPinYin

                .Apply

            End With

End Sub

'<<=========

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2016-02-03T15:03:12+00:00

Alcune possibilità.

Se lo fai su tutti i fogli attivi, modifica:

With ActiveWorkbook.Worksheets("123 ").Sort

con:

With ActiveSheet.Sort


Oppure, se conosci a priori i nome dei fogli

With ActiveSheet

    Select Case .Name

         Case "Pippo", "Pluto", "Paperino", "ecc."

              'il codice da eseguire

    End Select

End With


Ancora, immaginando tu abbia un pulsante ActiveX che richiama la macro, nella dichiarazione della macro aggiungi un argomento:

Public Sub NomeMacro(ByVal sNomeFoglio As String)

e quindi più sotto avrai:

With ActiveWorkbook.Worksheets(sNomeFoglio).Sort

'ecc.

Il codice del pulsante che richiama la macro sarà:

Private Sub CommandButton1_Click()

    Call NomeMacro(Me.Name)

End Sub

Nei primi due casi puoi non utilizzare un pulsante ma un semplice tasto di scelta rapida.

La risposta è stata utile?

0 commenti Nessun commento

1 risposta aggiuntiva

Ordina per: Più utili
  1. Anonimo
    2016-02-06T14:12:21+00:00

    Grazie ad entrambi.

    Mauro, utilizzero la tua prima soluzione anche perchè volevo evitare di inserire il nome della scheda dato che potrei modificarlo a piacimento secondo la situazione.

    Ho un pulsante che attiva la macro, ma funzionando bene e non avendo dimestichezza con VB preferirei non modificare altro.

    Norman, sicuramente proverò la tua prima soluzione. La devo inserire pari pari al posto di quella esistente ?

    Per la tua seconda opzione, sicuramente le righe finiscono o ne ho una vuota alla fine, le colonne non posso farle finire perche ho altre formule che fanno riferimento ai valori che ho ordinato nella colonna D.

    La tua soluzione ordina in modo decrescente secondo la colonna D solo il range che ho indicato ?

    Grazie ad entrambi la settimana prox provo entrambe le soluzioni e vi faccio sapere.

    Grazie

    FP

    La risposta è stata utile?

    0 commenti Nessun commento