Avatar billede bambus Nybegynder
27. august 2002 - 11:10 Der er 10 kommentarer og
1 løsning

Sortering af data i et Array med VBA

Jeg har et Array (4000,3), som  Jeg skal sortere efter første række (4000,1). Jeg bruger en bubble sort, men det tager 100 år, er der en hurtigere måde??
Avatar billede bak Seniormester
27. august 2002 - 11:49 #1
Her er et quicksort modul du kan bruge (det er meget hurtigere end boblesort når der er mange data), men faktisk er det lige så hurtigt at oprette et midlertidig ark, smide dit array ind på det, bruge excel's egen sortering (lynende hurtigt) og derefter henter det tilbage



Sub Quicksort(values(), ByVal min As Long, ByVal max As Long)

  Dim med_value As String
  Dim hi As Long
  Dim lo As Long
  Dim i As Long

  ' If the list has only 1 item, it's sorted.
  If min >= max Then Exit Sub

  ' Pick a dividing item randomly.
  i = min + Int(Rnd(max - min + 1))
  med_value = values(i)

  ' Swap the dividing item to the front of the list.
  values(i) = values(min)

  ' Separate the list into sublists.
  lo = min
  hi = max
  Do
    ' Look down from hi for a value < med_value.
    Do While values(hi) >= med_value
      hi = hi - 1
      If hi <= lo Then Exit Do
    Loop

    If hi <= lo Then
      ' The list is separated.
      values(lo) = med_value
      Exit Do
    End If

    ' Swap the lo and hi values.
    values(lo) = values(hi)

    ' Look up from lo for a value >= med_value.
    lo = lo + 1
    Do While values(lo) < med_value
      lo = lo + 1
      If lo >= hi Then Exit Do
    Loop

    If lo >= hi Then
      ' The list is separated.
      lo = hi
      values(hi) = med_value
      Exit Do
    End If

    ' Swap the lo and hi values.
    values(hi) = values(lo)
  Loop ' Loop until the list is separated.

  ' Recursively sort the sublists.
  Quicksort values, min, lo - 1
  Quicksort values, lo + 1, max

End Sub
Avatar billede bak Seniormester
27. august 2002 - 11:58 #2
her er lige et modul til til det med at bruge excels egen sortering


Sub WorksheetSort(list)
   
    Dim First As Integer, Last As Long
    Dim i As Long
    Dim FirstCell As Range, LastCell As Range
    Dim CurrCell As Range, FillRange As Range
    Dim wshTemp As Worksheet
    Set wshTemp = Worksheets.Add
   
    First = LBound(list, 1)
    Last = UBound(list, 1)
   
    Set FirstCell = wshTemp.Cells(1, 1)
    Set LastCell = wshTemp.Cells(Last, 1)
    Set FillRange = wshTemp.Range(FirstCell, LastCell)
    Application.ScreenUpdating = False
   
'  Transfer the array to worksheet
    FillRange.Value = list
   
'  Sort the worksheet range
    FirstCell.CurrentRegion.Sort Key1:=FirstCell, Order1:=xlAscending, Orientation:=xlTopToBottom
     
'  Transfer range back to the array and clear range
    For i = First To Last
        list(i, 0) = FirstCell.Offset(i - 1, 0)
    Next i
    Application.DisplayAlerts = False
    wshTemp.Delete
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
Avatar billede bambus Nybegynder
27. august 2002 - 12:04 #3
virker den første makro også på et array som (4000,4) husk det er kun den første række der skal sorteres.
Avatar billede bak Seniormester
27. august 2002 - 12:20 #4
Skal resten af værdierne ikke sorteres med ?
Avatar billede bambus Nybegynder
27. august 2002 - 12:25 #5
det er ikke nødvendigt...
Avatar billede bak Seniormester
27. august 2002 - 13:18 #6
ok bambus, denne sorterer dit array efter 1 række

Sub Quicksort(values(), min, max)
  Dim med_value
  Dim hi As Long
  Dim lo As Long
  Dim i As Long

  ' If the list has only 1 item, it's sorted.
  If min >= max Then Exit Sub

  ' Pick a dividing item randomly.
  i = min + Int(Rnd(max - min + 1))
  med_value = values(i, 1)

  ' Swap the dividing item to the front of the list.
  values(i, 1) = values(min, 1)

  ' Separate the list into sublists.
  lo = min
  hi = max
  Do
    ' Look down from hi for a value < med_value.
    Do While values(hi, 1) >= med_value
      hi = hi - 1
      If hi <= lo Then Exit Do
    Loop

    If hi <= lo Then
      ' The list is separated.
      values(lo, 1) = med_value
      Exit Do
    End If

    ' Swap the lo and hi values.
    values(lo, 1) = values(hi, 1)

    ' Look up from lo for a value >= med_value.
    lo = lo + 1
    Do While values(lo, 1) < med_value
      lo = lo + 1
      If lo >= hi Then Exit Do
    Loop

    If lo >= hi Then
      ' The list is separated.
      lo = hi
      values(hi, 1) = med_value
      Exit Do
    End If

    ' Swap the lo and hi values.
    values(hi, 1) = values(lo, 1)
  Loop ' Loop until the list is separated.

  ' Recursively sort the sublists.
  Quicksort values, min, lo - 1
  Quicksort values, lo + 1, max

End Sub
Avatar billede bambus Nybegynder
27. august 2002 - 13:25 #7
okay bak men du må lige hjælpe mig lidt...
Values() er = mit Array(4000,1) eller?...
jeg har en textbox, og hvergang der sker en ændring skal der sorteres
Avatar billede bak Seniormester
27. august 2002 - 13:34 #8
values()= mit_array(4000,3)
men det er kun første kolonne der sorteres altså mit_array(4000,1)

bruges sådan
Call quicksort(mit_array,1,4000)
Avatar billede bambus Nybegynder
27. august 2002 - 13:49 #9
Super kører helt perfekt!
Avatar billede bak Seniormester
27. august 2002 - 14:02 #10
Ok, men kører den også hurtigere som jeg påstod??  :-)
Avatar billede bambus Nybegynder
27. august 2002 - 14:03 #11
ja det må siges
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester