Ordinamento di una collection
Info
Esempi
Linguaggio
Librerie
Formule
Ultimi Inseriti

 Login

 Password

Volendo ordinare una collection che contiene oggetti, come quella dell'esempio dei dati univoci, poissiamo utilizzare una versione de classico QuickSort
In questo caso però il citerio di ordinamento non sarà in base al dato ma a uno dei dati contenuti nell'oggetto. Un metodo per rendere la proceudra riutilizzabile in diversi contesti, senza fare quindi modifiche al codice, è quello di aggiungere alla classe una proprietà che determini il valore in base a cui ordinare.
La nostra classe di esempio ClCliente sarà:
Public IdCliente As String
Public DsCliente As String

Property Get OrdinaPer() As Variant
  OrdinaPer = DsCliente
End Property

In questo modo qualsiasi siano gli elementi della nostra classe (clienti, articoli...) potremmo semplicente richiamare la procedura di ordinamento.
QuickSort nome della collection

Quinidi la procedure di ordinamento sarà:
Sub QuickSort(Coll As Collection, Optional primo As Long = 0, Optional ultimo As Long = 0)
  Dim vp As Variant
  Dim i As Long, j As Long, p As Long
  Dim tObj As Object
    
  If (ultimo = 0) Then
    primo = 1
    ultimo = Coll.Count
  End If
  
  i = primo
  j = ultimo
  ' valore del pivot
  vp = Coll((primo + ultimo) \ 2).OrdinaPer
  
  Do While i <= j
    Do While (Coll(i).OrdinaPer < vp And i < ultimo)
      i = i + 1
    Loop
    
    Do While (vp < Coll(j).OrdinaPer And j > primo)
      j = j - 1
    Loop
    
    If (i < j) Then
      ' scambia i valori
      Set tObj = Coll(i)
      Coll.Add Item:=Coll(j), After:=i
      Coll.Remove i
      Coll.Add tObj, Before:=j
      Coll.Remove j + 1
    End If
      
    If (i <= j) Then
      ' passa al successivo
      i = i + 1
      j = j - 1
    End If
  Loop
  
  'chiamate ricorsive
  If (primo < j) Then QuickSort Coll, primo, j
  If (i < ultimo) Then QuickSort Coll, i, ultimo
End Sub


L'esempio completo é scaricabile da questo link: Es423.xlsm (a questo link le info per attivare le macro se risultano bloccate)

Gli esempi contenuti nel sito sono per uso personale, non é consentito l'uso professionale, commerciale o la riproduzione senza autorizzazione.
Per dubbi o domande potete scriverci a domande@macrofacili.it, sulla nostra pagina FB MacroFacili.it o sul gruppo FB Excel, macro e formule.
 

data4idea srls - PIva 01881000937 - info@data4idea.it