[VBA] Daten einer gefilterten Tabelle ins Array einlesen
#1
Hi Leute,

ich benötige mal eine Einschätzung von euch Experten, bevor ich mich ans Programmieren mache. Ein Makro von mir (welches gut funktioniert) ist mir persönlich zu langsam. Es filtert eine Tabelle und kopiert dann die sichtbaren Daten in einen anderen Bereich. Nun bin ich seit kurzem Fan von Arrays geworden und möchte mich dran machen, das Makro zu beschleunigen.
Allerdings kommen nun mehrere Varianten in Frage und, da meine Zeit begrenzt ist, wollte ich nicht alles programmieren, um dann festzustellen, dass kein Geschwindigkeitsboost vorhanden ist. Vll habt ihr eine EInschätzung, welche Variante sich am meisten lohnt.

Ausgangslage:
Ich habe eine unsortierte Tabelle mit ca. 150 Zeilen und 2 Spalten (Name und Zugehörigkeit zu einer Abteilung)

Variante 1:
Ich sortiere die Daten immer zuerst nach Zugehörigkeit, filtere sie dann (beides in Excel) und lese sie ins Array ein, um sie dann aufs Tabellenblatt zu kopieren. Habe ich dadurch einen Mehrwert, weil nur das Kopieren und Einfügen "ersetzt" wird?

Variante 2:
Ich lese die gesamte Tabelle in ein Array ein und lösche dann mit einer for next-Schleife die nicht passenden Daten.

Variante 3:
Google hat mir sowas hier ausgespuckt, allerdings kann ich den Code nicht lesen (noch nie mit dictionary gearbeitet) und weiß nicht, was da passiert.
Code:
Function REFERENZ(rng As Range) As String
Dim dic As Object, c As Range
Dim max As Long

Set dic = CreateObject("Scripting.Dictionary")

For Each c In rng
  If Not c.EntireRow.Hidden Then dic(c.Value) = dic(c.Value) + 1
Next c
With Application
  max = .Match(.max(dic.Items), dic.Items, 0)
  REFERENZ = dic.keys()(max - 1)
End With
End Function

Weitere Varianten?
Vielleicht gibt es aber ja auch noch eine ganz andere Möglichkeit - ich wäre sehr dankbar für jeden Hinweis :)

Gruß
Antworten Top
#2
Hallo,

ohne deine Datei zu kennen, würde ich Variante 2 favorisieren. Wobei 150 Zeilen noch nicht sooo ein großer Umfang sind, dass es da Zeitprobleme geben sollte (kann).
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
[-] Folgende(r) 1 Nutzer sagt Danke an Klaus-Dieter für diesen Beitrag:
  • EasY
Antworten Top
#3
Danke für die Einschätzung - hätte ich nicht gedacht, aber ich wurde bisher immer wieder überrascht, wie schnell doch so ein Array sein kann. Dann werde ich mich dran machen, das zu programmieren.

Ja die fehlende Datei ist immer ein Problem, das weiß ich. Die nachzubauen wäre ein ziemlicher Aufwand. Deswegen habe ich auch nicht nach konkreten Lösungen gefragt, sondern nur eine Einschätzung. Mir macht es echt sau viel Spaß, selber zu programmieren :)

Gruß
Antworten Top
#4
Hallo EasY,

ein Hintergrund, warum Arrays so schnell sein können, ist einfach der, dass man damit die Anzahl der Zellzugriffe drastisch reduzieren kann. Wenn du eine Anzahl Daten mit einer Schleife bearbeiten willst, sagen wir mal es handelt sich um tausend Datensätze, dann hast du beim Abarbeiten in der Liste tausend Zellzugriffe. Lädst du die Liste in ein Array, und lässt die Schleife da drüber laufen, hast du nur zwei Zellzugriffe. Laden der Daten ins Array und zurückschreiben des Array in die die Datei. Daten im Array werden im virtuellen Bereich bearbeitet, was einfach viel schneller ist.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#5
Zellzugriffe sind die Performancekiller - gut zu wissen :)
Antworten Top
#6
Hi,

also bei 150 Zeilen solltest du niemals das Gefühl haben, dass man etwas schneller machen muss. Ich vermute mal, dass du da irgendwas sehr ungeschickt programmiert hast. Möchtest du deinen bisherigen (zu langsamen) Code hier vorstellen? Dann könnte man dazu ein paar Anmerkungen machen.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#7
Code:
Sub M_snb()
  sn = Cells(1).CurrentRegion
  ReDim sp(UBound(sn), UBound(sn, 2) - 1)
 
  For j = 1 To UBound(sn)
    If sn(j, 1) = "criterium" Then
      For jj = 0 To UBound(sp, 2)
        sp(n, jj) = sn(j, jj + 1)
      Next
      n = n + 1
    End If
  Next
End Sub
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#8
Anbei die Datei mit Dummydaten :)


Angehängte Dateien
.xlsm   Forum.xlsm (Größe: 38,21 KB / Downloads: 6)
Antworten Top
#9
Hi,

also das einzige, was in deiner Routine Zeit kosten kann, ist die For-Schleife. Hier könntest du die ganze Schleife durch 
PHP-Code:
ActiveSheet.Cells(Zeile_Position 2Spalte_Position).SpecialCells(xlCellTypeConstants).OffSet(, 1).Value "X" 
ersetzen.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#10
Warum nicht ?

Code:
Sub M_snb()
  With Tabelle2.ListObjects(1).DataBodyRange
      .AutoFilter 11, "X"
      .Rows.Delete
      .AutoFilter
  End With
End Sub
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top


Gehe zu:


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