Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1076to1080
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

schnellerer Variante für (Daten einlesen ohne )

schnellerer Variante für (Daten einlesen ohne )
22.05.2009 15:02:02
Franc
Betreff zu kurz ^^
Die Liste umfasst aktuell 17.000 Einträge (und werden mehr)
gefiltert ergibt das aktuell rund 3.600 Einträge
ich lass die spalten sortieren und lese mit dem makro unten die daten ein und ignoriere gleich doppelte
Die Wartezeit für eine Spalte ist noch ok aber bei 3 Spalten gibt es eine spürbare verzögerung von gut 7 sek.
Gibt es eine Möglichkeit das schneller zu gestalten?
Gibt ja in Excel die Funktion, das man in der Tabelle die Spalte an anderer Stelle Filtern kann (ohne doppelte einträge)
Geht das auch so - ohne die Einträge in der Tabelle selbst zu filtern?

Sub einlesen()
zeile = 0
var_Ort = Array("")
With Workbooks(Tabellenname).Sheets(Blattname_Daten)
For i = 2 To .Range("A1").End(xlDown).Row
If .Cells(i, 10) = var_Ort(zeile) Then
Else
zeile = zeile + 1
ReDim Preserve var_Ort(zeile)
var_Ort(zeile) = .Cells(i, 10)
End If
Next
ReDim Preserve var_Ort(zeile - 1)
End With
End Sub


8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: schnellerer Variante für (Daten einlesen ohne )
22.05.2009 15:19:31
Daniel
Hi
so ganz blicke ich es noch nicht, was du da vorhast.
aber prinzipiell schneller könnte es gehen, wenn erst die komplette Tabelle in ein Array kopierst und dann mit diesem Array arbeitest anstatt mit .Cells, als in etwa so:

Sub einlesen()
dim arrDaten
zeile = 0
var_Ort = Array("")
arrDaten = Workbooks(Tabellenname).Sheets(Blattname_Daten).Cells(1,1).currentregion
For i = 2 To Ubound(arrDaten,1)
If arrDaten(i, 10) = var_Ort(zeile) Then
Else
zeile = zeile + 1
ReDim Preserve var_Ort(zeile)
var_Ort(zeile) = arrDaten(i, 10)
End If
Next
ReDim Preserve var_Ort(zeile - 1)
End With
End Sub


Das sollte das ganze schon mal beschleunigen weil nicht mehr mit Excel-Objekten gearbeitet wird, sondern nur noch mit Array-Variablen.
Gruß, Daniel

Anzeige
genauere Beschreibung
22.05.2009 16:13:32
Franc
eine Tabelle
26 Spalten mit Daten
17.000 Zeilen
Die Tabelle enthält unter anderem Straßen, Orte und Lokalitäten
Bedingt dadurch, das in einem Ort mehrere Lokalitäten sind, sind in der Liste die Orte auch entsprechend oft drin. (teilweise 20 x der selbe Name)
In einer Userform möchte ich eine Vorschlagliste einblenden, sobald man 3 oder mehr buchstaben im entsprechenden Suchfeld eingegeben hat.
Dafür brauch ich die Orte ohne Doppel in einem Array.
Das gleiche wiederum brauche ich für die Straßen und Lokalitäten.
Deshalb muß er quasi 3 x 17.000 Datensätze ohne doppel einlesen.
Das klappt auch alles nur dauert das einlesen "ewig". (einlesen wenn man die Userform öffnet)
Anzeige
AW: per Hilfstabelle und Spezialfilter
22.05.2009 16:49:49
Daniel
HI
du kannst doch per Speziafilter die Liste oder Teile davon an eine andere Stelle ohne Duplikate.
von dieser Stelle kannst du die Daten dann direkt in die List- oder Combobox einlesen.
Als Markofunktion das ist die .AdvancedFilter - Methode (weiteres dazu dann in der Hilfe)
oder du führst das ganze von Hand aus und lässt dabei den Recorder mitlaufen.
Gruß, Daniel
AW: genauere Beschreibung
22.05.2009 16:57:52
Tino
Hallo,
vielleicht geht es so etwas schneller.
ist nur ein Beispiel, Daten müssen entsprechend angepasst werden.
Private Sub UserForm_Initialize()
Dim Dic1 As Object, Dic2 As Object, Dic3 As Object
Dim myTempAr
Dim A As Long

Set Dic1 = CreateObject("Scripting.Dictionary")
Set Dic2 = CreateObject("Scripting.Dictionary")
Set Dic3 = CreateObject("Scripting.Dictionary")

'Bereich eventuell anpassen 
With Tabelle1
 myTempAr = .Range("A2:C" & .Cells(Rows.Count, 1).End(xlUp).Row)
End With

    For A = 1 To Ubound(myTempAr)
     Dic1(myTempAr(A, 1)) = 0 'Ort 
     Dic2(myTempAr(A, 2)) = 0 'Straße 
     Dic3(myTempAr(A, 3)) = 0 'sonst was 
    Next A

    Me.ComboBox1.List = Dic1.keys 'Ort 
    Me.ComboBox2.List = Dic2.keys 'Straße 
    Me.ComboBox3.List = Dic3.keys 'sonst was 


Erase myTempAr
Set Dic1 = Nothing: Set Dic2 = Nothing: Set Dic3 = Nothing
End Sub


Gruß Tino

Anzeige
AW: genauere Beschreibung
22.05.2009 17:00:18
Tino
Hallo,
bei ...Cells(Rows.Count, 1)... fehlt noch ein Punkt also ...Cells(.Rows.Count, 1)... .
Gruß Tino
AW: genauere Beschreibung
22.05.2009 20:40:44
franc
das sieht extrem gut aus und ist auch sehr schnell
hab die liste zwar nicht hier aber habs mal mit 23.000 Daten probiert und das hat denk mal höchstens 1 sek gedauert die einzulesen.
Über eine Combobox löse ich das zwar nicht sondern über eine eingeblendete Listbox (soweit das gewollt wird)
Da sieht man dann direkt 10 vorschläge und halt dann nur die passenden einträge und kann diese dann per klick auswählen.
Das nur einzelne Einträge eingelesen werden, bewirkt das "Scripting.Dictionary" ?
Wofür steht denn bitte Dic1(myTempAr(A, 1)) = 0 ?
Er geht jeden Eintrag durch und nach und nach die 3 dimensionen aber werde trotzdem nicht schlau draus (mich irritiert die 0 ^^)
Anzeige
AW: genauere Beschreibung
22.05.2009 21:05:53
Tino
Hallo,
schau mal in der VBA Hilfe unter dem Stichwort Dictionary bzw. Google mal danach.
Dic1(myTempAr(A, 1)) = 0
Also dieser Schlüssel (myTempAr(A, 1)) wird nur hinzugefügt, wenn dass Ergebnis 0 ist.
Ist das Ergebnis nicht 0, ist dieser Schlüssel bereits im Dictionary-Objekt enthalten.
Gruß Tino

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige