Excel 2013, i dati possono essere riordinati automaticamente?


6

C'è un modo per riordinare automaticamente? Ho l'aggiornamento automatico delle celle e, a seconda dei valori in arrivo, le classifiche cambiano. Sto cercando un modo per fare in modo che la tabella ricorra automaticamente (simile alla formattazione condizionale) senza dover fare clic sul pulsante riordina.

L'obiettivo qui è quello di realizzare tale puramente attraverso una funzione integrata Excel2013. Non sto cercando una soluzione che coinvolga celle aggiuntive che aiutano l'ordinamento, come Rank (), ...

modificare

Includo il codice di una macro che aggiorna la cartella di lavoro a intervalli prestabiliti e anche il codice all'interno di un foglio di lavoro che dovrebbe aggiornare le tabelle su quel foglio su Worksheet_Calculate. Ricevo un errore di runtime non sei sicuro di cosa sia sbagliato?

Public RunWhen As Double
Const frequency = 5
Const cRunWhat = "DoIt"  ' the name of the procedure to run

Sub StartTimer()
    RunWhen = Now + TimeSerial(0, 0, frequency)
    Application.OnTime RunWhen, cRunWhat, Schedule:=True
End Sub

Sub DoIt()
    Sheets("RAWDATA").Calculate
    ActiveSheet.Calculate
    StartTimer  ' Reschedule the procedure
End Sub

Sub StopTimer()
    On Error Resume Next
    Application.OnTime RunWhen, cRunWhat, Schedule:=False
End Sub

e il codice che presumibilmente aggiorna le tabelle

Private Sub Worksheet_Calculate()

With Application
    .ScreenUpdating = False
    .EnableEvents = False
    .DisplayAlerts = False
End With

ActiveSheet.ListObjects("Table2").AutoFilter.ApplyFilter
    With ActiveWorkbook.Worksheets("Strategies").ListObjects("Table2").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

ActiveSheet.ListObjects("Table3").AutoFilter.ApplyFilter
    With ActiveWorkbook.Worksheets("Strategies").ListObjects("Table3").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

With Application
    .ScreenUpdating = True
    .EnableEvents = True
    .DisplayAlerts = True
End With

End Sub

2
Beh, credo che questo link dovrebbe mostrare un modo per farlo: stackoverflow.com/questions/13020878/...
Lowak

Quindi, presumo che non ci sia alcuna funzione in Excel2013 che attivi il riordinamento automatico delle tabelle? Sono sorpreso dal fatto che la formattazione condizionale si adatta automaticamente a qualsiasi modifica dei dati di origine. Quindi, trovo difficile credere che non esista alcuna funzionalità di ordinamento che si riordini sulla modifica dei dati. Capisco che posso semplicemente registrare una macro e riordinare manualmente e collegare il codice al metodo dell'evento WorkshSeet_Change (), ma è estremamente sporco, il minimo cambiamento nella ridenominazione della colonna rompe il codice per nominare solo un problema.
Matt

2
Gli "sfarfallio dello schermo" possono essere evitati se si utilizza Application.ScreenupdatingVero / Falso. Prima digiti False per disabilitare la visualizzazione di eventuali aggiornamenti apportati al foglio di lavoro e poi True per mostrarti cosa è stato fatto.
Lowak,

1
Un'altra cosa su Worksheets_change è creare buone ifcondizioni, quindi la macro non reagirà ogni volta che ti sposti in un'altra cella.
Lowak,

2
@Iowak, se vuoi, scrivi una risposta e la segnerò come ricercata. Grazie ancora per il tuo prezioso aiuto.
Matt

Risposte:


2

Non mi piace lasciare domande senza risposta quando hanno già ricevuto risposta, commenta. Puoi leggere la cronologia nei commenti, ma ecco la soluzione finale:

Private Sub Worksheet_Calculate()
    'If the active sheet is called "Strategies", then this reapplies the filter for two tables and re-sorts them

    Const wsName As String = "Strategies"

    If ActiveSheet.Name = wsName Then

        'Freeze everything and turn off events
        With Application
            .ScreenUpdating = False
            .EnableEvents = False
            .DisplayAlerts = False
        End With

        'Update Table2
        With Worksheets(wsName).ListObjects("Table2")
            .AutoFilter.ApplyFilter
            With .Sort
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
        End With

        'Update Table3
        With Worksheets(wsName).ListObjects("Table3")
            .AutoFilter.ApplyFilter
            With .Sort
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
        End With

        'Unfreeze things and turn events back on
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .DisplayAlerts = True
        End With

    End If
End Sub

Probabilmente potresti anche abbreviare il filtraggio e l'ordinamento a just

    With Worksheets(wsName).ListObjects("Table2")
        .AutoFilter.ApplyFilter
        .Sort.Apply
    End With

Questa è una wiki della comunità perché non ho ricavato la soluzione. Puoi modificarlo se vuoi, ma tutto quello che ho fatto è stato trascrivere il problema riscontrato nei commenti e ripulire un po 'il codice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.