VBA - Makro beschleunigen bzw. durch Array ersetzen?
#1
Hi Leute,

ich habe eine etwas umfangreichere Tabelle, in der Personen in Abhängigkeit ihres Status sortiert werden sollen. Ich habe auch bereits ein Makro geschrieben, auf das ich sehr stolz bin, da ich es komplett selbst entwickelt habe :). Es macht auch alles, was es soll. Leider empfinde ich es mittlerweile als zu langsam und suche deshalb nach Alternativen. Ich habe zunächst an ein Array gedacht, allerdings habe ich bei snb-vba.eu gelesen, dass man innerhalb eines Arrays keine Sortierung vornehmen kann. Auf einer anderen Seite - welche weiß ich nicht mehr - habe ich allerdings von einem Array-Sortieralgorithmus gelesen, der das ggf. kann - verstanden habe ich da allerdings wenig bis nichts.
Vielleicht habt ihr ja auch gänzlich andere Alternativen oder Ideen.

Was tut das Makro:
In einem festen Bereich B7:B25 stehen Namen und in Spalte C entsprechend der Status. Es gibt gewisse Stati, die nach dem Sortieren oben stehen sollen. Danach sollen so viele Leerzellen folgen, dass am unteren Ende des Bereichs dann die restlichen Namen stehen, die einen anderen Status innehaben. Von diesen Bereichen habe ich viele auf vielen Tabellenblättern, die dann jeweils mittels Knopfdruck sortiert werden.
Ich denke eine Tabelle sagt mehr als tausend Worte - sie ist im Anhang.


Ich bedanke mich schon im voraus :)

Gruß Tim

P.S.: Bereiche, die für die Aufgabenstellung irrelevant sind, habe ich auskommentiert. Sie werden allerdings immer mit abgearbeitet.


Angehängte Dateien
.xlsm   Array.xlsm (Größe: 22,73 KB / Downloads: 13)
Top
#2
Hi

Ich würde den Teil so verändern. 
Code:
Public Sub test()
Dim Werte, i As Long

Werte = Range("B7:D25").Value

For i = 1 To UBound(Werte, 1)
            Select Case Werte(i, 2)
                Case "DAL"
                    Werte(i, 3) = 1
                Case "EWF"
                    Werte(i, 3) = 2
                Case "X", "x"
                    Werte(i, 3) = 3
                Case "TOG"
                    Werte(i, 3) = 5
                Case ""
                    Werte(i, 3) = 6
                Case "MV", "MV1", "MV2", "MV3", "MV4", "MV5"
                    Werte(i, 3) = 7
                Case "AP", "AP1", "AP2", "AP3", "AP4", "AP5"
                    Werte(i, 3) = 8
                Case "SD"
                    Werte(i, 3) = 9
                Case "TD"
                    Werte(i, 3) = 10
                Case "TP"
                    Werte(i, 3) = 11
                Case "GT"
                    Werte(i, 3) = 12
                Case "LG"
                    Werte(i, 3) = 13
                Case "Ehu", "EHU"
                    Werte(i, 3) = 14
                Case "k", "K"
                    Werte(i, 3) = 15
                Case "AO"
                    Werte(i, 3) = 16
                Case Else
                    Werte(i, 3) = 17
            End Select
    Next i
 Sheets("Zwischenspeicher").Range("A1").Resize(UBound(Werte, 1), 3) = Werte
    
End Sub

Dann machst du weiter wie bisher. Sortieren und übertragen.

Gruß Elex
[-] Folgende(r) 1 Nutzer sagt Danke an Elex für diesen Beitrag:
  • EasY
Top
#3
Ein Zweizeiler reicht in diesem Fall.

Code:
Sub M_snb()
    Application.AddCustomList Array("DAL", "EWF", "X", "x", "TOG", "", "MV", "MV1", "MV2", "MV3", "MV4", "MV5", "AP", "AP1", "AP2", "AP3", "AP4", "AP5", "SD", "TD", "TP", "GT", "LG", "Ehu", "EHU", "k", "K", "AO")
    Cells(7, 2).CurrentRegion.Sort Cells(7, 3), , , , , , , , Application.CustomListCount
End Sub

NB. die erste Zeile sollte man nur einmal laufen lassen.

Schau mal:

http://www.snb-vba.eu/VBA_Excel_customlist_en.html#L_6
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
[-] Folgende(r) 2 Nutzer sagen Danke an snb für diesen Beitrag:
  • Elex, EasY
Top
#4
Hi @snb
 
Mit den CustomLists habe ich mich nie wirklich beschäftigt.
Dachte bisher diese dienen nur der Autoausfüll Logik.

Gut zu wissen dass diese auch als Sortierschlüssel dienen.
Thumps_up 

Gruß Elex
Top
#5
(09.12.2019, 10:32)snb schrieb: NB. die erste Zeile sollte man nur einmal laufen lassen.

oder gleich so mit anschließendem Löschen der anfangs erstellten Benutzerdefinierten Liste:

Code:
Sub M_snb_Kuwer()
    Application.AddCustomList Array("DAL", "EWF", "X", "x", "TOG", "", "MV", "MV1", "MV2", "MV3", "MV4", "MV5", "AP", "AP1", "AP2", "AP3", "AP4", "AP5", "SD", "TD", "TP", "GT", "LG", "Ehu", "EHU", "k", "K", "AO")
    Cells(7, 2).CurrentRegion.Sort Cells(7, 3), , , , , , , , Application.CustomListCount
    Application.DeleteCustomList Application.CustomListCount
End Sub

Gruß Uwe
Top
#6
Hi,

vielen vielen Dank für eure Ratschläge, allerdings weiß ich nicht, wo ich den Zweizeiler bzw mit Ergänzung von Kuwer den Dreizeiler einbauen soll? Ich bin noch verwirrt :)


Gruß Tim
Top
#7
Benütze das Makromodul des Arbeitsblattes.
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Top
#8
Hi,

mal eine generelle Frage: Ist ein Array "immer" schneller?
Ich habe das Gefühl, dass die Prozedur wesentlich länger dauert, wenn ich es in einem Array abfrage, als wenn ich einzelne IF-Abfragen tätige.
Vielleicht liegt es auch nur an meinem Fall, .. mich würde mal eine generelle Meinung interessieren..

Merci
Top
#9
Das würde mich generell auch interessiere - die Antwort wird vermutlich sein "es kommt darauf an"
Snb schreibt, meine ich, auf seiner Homepage dass Arrays schon einen Geschwindigkeitsvorteil haben, weil sie im RAM berechnet werden. 

Mich würde zuvor aber interessieren wo genau ich den vba-code einbauen bzw welchen Teil meines Codes ich damit ersetzen muss? 

Gruß Tim
Top
#10
Moin Easy,

ich kenne deinen Code nicht. Wie snb aber schon geschrieben hat, gehört er in Modul deines Arbeitsblattes (F11)..

Na dann bin ich mal auf die Antwort gespannt Smile
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste