Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1360to1364
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

Auswahl bie Autofilter und mehr als 65536 zeilen

Auswahl bie Autofilter und mehr als 65536 zeilen
12.05.2014 13:42:45
yummi
Hallo zusammen,
ich habe folgendes Problem:
Ich habe ein oder mehrere Sheets gefüllt mit bis zu 1048576 zeilen. Nach Einstellen des Autofilter will ich die sichtbaren Zeilen markieren um mit diesen dann später weiter arbeiten zu können. Für die Version unter 65536 zeilen funktioniert es:

' Bereich der sichtbaren Zellen ohne Überschriftenzeile ermitteln
For Each Current In objWkbZuordnung.Worksheets
If InStr(1, Current.Name, "Ausgabe", vbTextCompare)  0 Then
With Current
If WorksheetFunction.Subtotal(103, .Columns(1)) > 1 Then
With .UsedRange
Set rngFilter = .Offset(1, 0).Resize(.Rows.Count - 1, 1).SpecialCells( _
xlCellTypeVisible)
End With
For Each rngArea In rngFilter
For lngRow = 1 To rngArea.Rows.Count
.Range("A" & rngArea.Row & ":" & WandleZahlInBuchstaben(ilastcolakt) &  _
rngArea.Row).Interior.ColorIndex = 4
.Cells(rngArea.Row, ilastcolakt + 1).Value = "x"
Next lngRow
Next rngArea
End If
End With
End If
Next
Da aber .Offset(1, 0).Resize(.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible) einen Integer Wert liefert kommt es jetzt natütlich zum Knall. Wenn ich den ganzen Ausdruck mit CLng caste gibt es eine Typunverträglichkeit.
Hat jemand eine Idee wie ich hier einen long Wert bekomme?
Vielen Dank
yummi

25
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Auswahl bie Autofilter und mehr als 65536 zeilen
12.05.2014 13:50:32
Rudi
Hallo,
Da aber .Offset(1, 0).Resize(.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible) einen Integer Wert liefert
Quatsch! Das liefert einen Range.
Gruß
Rudi

AW: Auswahl bie Autofilter und mehr als 65536 zeilen
12.05.2014 14:00:09
yummi
Hallo Rudi,
du hast recht, allerdings wenn ich mir den Ausdruck im Debugger anschaue zeigt dieser mir an, das mit Integer weiter gerechnet werden soll, was bei der Anzahl der Zeilen dann zu einem Laufzeitfehler führt.
Gruß
yummi

AW: Auswahl bie Autofilter und mehr als 65536 zeilen
12.05.2014 16:43:15
yummi
Hat keiner eien Idee warum bie Offset mit mehr als 65535 Zeilen ein Laufzeitfehler 1008 kommt und wie man das umgehen kann?

AW: Auswahl bie Autofilter und mehr als 65536 zeilen
12.05.2014 16:57:23
Daniel
Hi
ich vermute mal, das Problem ist, dass du mit .SpecialCells nur eine begrenzte Anzahl von nicht zusammenhängenden Zellbereichen ansprechen kannst
(Beispiel: Range("A1:ZZ:100000") ist ein lückenlos zusammenhängender Zellbereich, Range("A1,A3,A5,A7") sind schon vier Zellbereiche!)
in Excel 2003 war diese Anzahl der verarbeitbaren Zellbereiche (Areas) auf 8192 limitiert, mit Excel 2007 sollte das Limit erhöht worden sein, trotzdem vermute ich, dass es weiterhin existiert (wenn auch mit einer anderen Grenze)
die Abhilfe bestand schon in der alten Version darin, dass man die Tabelle vor der Anwendung des Autofilters nach den Filterspalten sortiert hat, so dass die sichtbaren Zellen einen einzigen lückenlos zusammenhängenden Zellblock bilden.
(den Autofilter kann man sich dann ggf sparen, wenn man mit .FIND die erste und letzte Zeile des Zellblocks ermitteln kann (Seachdirection:=xlNext/xlprevious) und dann alle Zellen dazwischn bearbeitet.
Gruß Daniel

Anzeige
AW: Auswahl bie Autofilter und mehr als 65536 zeilen
13.05.2014 08:58:15
yummi
Hallo Daniel,
das mit dne Grenzen der zusammenhängenden Blöcke kann nicht sein, da es auch passiert, wenn nur die Titelleiste und eine weitere Zeile als Ergebnis des Autofilters stehen bleiben (vorausgesetzt, die Zeile ist größer 65536).
Ich habe jetzt die Zeile mit offset genz weg gelassen und beim Durchlaufen der rngFilter mache ich die Unterscheidung ob Zeile 1 oder nicht, so scheint es zu gehen.
Danke
yummi

AW: Auswahl bie Autofilter und mehr als 65536 zeilen
13.05.2014 10:09:52
Daniel
Hi
bei mir kommt da jetzt kein Fehler 1008.
der Fehler 1004 kommt bei mir, wenn ich die Tabelle bis zur letzten Zeile befülle.
Das liegt daran, das ein Zellbereich nicht über den vorhanderen Zellbereich herausragen darf, daher ist bei einem Zellbereich, der bis zur letzen Zeile reicht, kein .Offset(1, 0) mehr möglich.
wenn du die Reihenfolge umdrehst und erst das Resize und danach den Offset ausführst, sollte es funktionieren:
Set rngFilter = .Resize(.Rows.Count - 1, 1).Offset(1, 0).SpecialCells(xlCellTypeVisible)
sollte das auch nicht helfen, müsstest du mal eine Beispieldatei mit dem Fehler hochladen.
Gruß Daniel

Anzeige
AW: Auswahl bie Autofilter und mehr als 65536 zeilen
13.05.2014 10:21:47
yummi
Hallo Daniel,
danke für den Tip, dass werde ich ausprobieren, klingt sehr vielversprechend.
momentan läuft das script (leider bei den massen sehr langsam)
die Tabelle ist verteilt auf 2 Blätter mit 1200000 Einträge und darauf werden momentan 20000 (später 860000) Regeln angewendet (so oft muss ich den Autofilter einstellen) um die gültigen Kombinationen zu finden. Leider dauert der Autofilter bei diesen Mengen sehr lange.
Danke für deinen Hinweis.
yummi

AW: Auswahl bie Autofilter und mehr als 65536 zeilen
13.05.2014 10:35:25
Daniel
Hi
probiere zum Autofilter mal folgende Alternative:
füge eine Hilfsspalte ein, welche per Formel alle Zeilen, die angezeigt werden soll, mit einer Zahl (1) und alle die ausgeblendet werden sollen mit einem Text ("" oder "x") kennzeichnet.
dann kannst du über .SpecialCells(xlcelltypeformulas, 1) gezielt auf die Zellen mit Zahlen zugreifen:
With .UsedRange
Set rngFilter = Intersect(.Cells, .Columns(?).SpecialCells(xlCellFormulas, 1))
End With

Gruß Daniel

Anzeige
AW: Korrektur
13.05.2014 10:36:54
Daniel

With .UsedRange
Set rngFilter = Intersect(.Cells, .Columns(?).SpecialCells(xlCellFormulas, 1).EntireRow)
End With

AW: Korrektur
13.05.2014 10:52:01
yummi
Hallo Daniel,
für das Löschen der nicht gültigen Einträge ist das ne gute Methode die ich mal ausprobiere.
Aber um die entsprechenden Zeilen mit x zu markieren (ist schon im Code drin) komme ich ja um den Autofilter nicht drum herum und das braucht gerade viel Zeit (mehrere Stunden)
Gruß
yummi

AW: Korrektur
13.05.2014 10:57:10
Daniel
HI
warum kommst du da um den Autofilter nicht herum?
lässt sich die Filterregel nicht als Formel formulieren?
Filterregeln für mehrere Spalten lassen sich mit UND verketten.
Beispiel: du filterst in Spalte A nach "a" und in Spalte B nach "b"
sieht als Formel für die Hilfsspalte dann so aus:
=Wenn(Und(A2="a";B2:="b");1;"x")

Gruß Daniel

Anzeige
AW: Korrektur
13.05.2014 11:17:06
yummi
Hallo Daniel,
vlt stecke ich schon zu lange in der Idee fest. ich versuch mal zu erklären was ich genau habe.
Ich habe, sagen wir mal, 13 spalten, die mit unterschiedlicher Anzahl an Werten gefüllt werden. Alle Spalten haben unterschiedliche Werte. Ich habe jetzt eine Tabelle angelegt, die sämtliche Kombinationsmöglichkeiten abbildet (für den akt. Fall über 1048576), bei bedarf über mehrere Sheets.
In einer anderen Datei habe ich in diesem Fall 86000 Zeilen die gültige und ungültige Kombinationen beschreiben.
Momentan stelle ich für jede Zeile den Autofilter ein und markiere die übrig gebliebenen gültigen Zeilen mit x. Das Ergebnis einer Überprüfung kann auch mehrere gültige Zeilen beinhalten.
Danach lösche ich die nicht markierten Zeilen und erhalte so alle gültigen Kombinationen.
Wenn ich deine Idee richtig verstehe, dann baue ich mir für jede Zeile (86000) die Wenn Formel, wende diese dann jeweils auf die über 1048576 Zeilen an und lösche dann oder hab ich dich missverstanden?
Gruß
yummi

Anzeige
AW: Korrektur
13.05.2014 11:37:31
Daniel
Hi
ja, so hatte ich mir das gedacht.
du solltest halt mit ein paar wenigen Formeln testen, obs wirklich schneller ist als der Autofilter.
Gruß Daniel

AW: Vorgehen bei der genannten Datenmenge
13.05.2014 13:28:49
Daniel
bei der genannten Datenmenge würde ich folgendes Vorgehen favorisieren:
1. fasse in einer Hifsspalte die 13 Spalten zu einem Begriff zusammen (=A2&B2&C2&...&M2)
2. mache das gleiche für die 86000 gültigen Kombinationen in einer weitern Tabelle
3. sortiere die Spalte mit den gültigen Kombinationen aufsteigen.
4. Prüfe ob eine Kombination aus der Gesamtliste in der Liste der gültigen vorkommt mit Hilfe des SVerweises:
(Hilfspalte in Gesamtliste sei Spalte N, Liste der gültigen Kombinationen in Tabelle "Gültige", Spalte N)
=Wenn(SVerweis(N2;Gültige!N:N;1;Wahr)=N2;1;"x")
die Liste der gültigen sollte mit dem Dummywert 0 beginnen.
damit kannst du alle 86.000 Kombinationen gleichzeitig abbprüfen und das aufgrund der Sortierung und des SVerweises mit 4. Parameter = WAHR in einer akzeptablen Rechenzeit.
Gruß Daniel

Anzeige
AW: Vorgehen bei der genannten Datenmenge
13.05.2014 16:00:51
yummi
Hallo Daniel,
ich habe das mal versucht umzusezten, aber ich bekomme in jeder Zeile nur ein x (zwar sehr schnell aber nicht richtig)
Meine Gesamtliste sieht so aus

Spalte A:O Einzelwerte
Spalte P A&"+"&B&"+"&C& ... &O (Zusammenfassung mit jeweils + dazwischen, aber nicht davor)

Meine Gültig Liste

Spalte A Einzelwerte mit + dazwischen und davor
Spalte B "Gültig" bzw "Ungültig"

In Spalte Q der Gesamtliste habe ich die formel eingegeben

=WENN(SVERWEIS(P2;[Export_mit_ESI.xlsx]Tabelle1!$A:$A;1;WAHR)=P2;1;"x")

Mal abgesehen davon, dass der Bezug ob Gültig oder ungültig noch fehlt, bekomme ich nur x als Ergebnis, egal ob das führende + vorhanden ist oder nicht.

=WENN(UND(SVERWEIS(P2;[Export_mit_ESI.xlsx]Tabelle1!$A:$A;1;WAHR)=P2; [Export_mit_ESI.xlsx]Tabelle1!$B:$B="Gültig");1;"x")

Ich hab mal das UND Zeile = Gültig in Spalte B eingebaut, weiß aber nicht ob das so passt.
Kannst Du mir noch einmal auf die Sprünge helfen was auch bei dem von dir vorgeschlagenen Teil noch nicht stimmt?
Wenn die Formel stimmt geht es definitiv schneller (Zeitgewinn von 1 Tag hin zu 1s) Viel besser ;-))
Vielen Dank für deine Unterstützung
yummi

Anzeige
AW: Beispieldatei
13.05.2014 16:28:04
Daniel
kannst du mal ne Beispieldatei hochladen?
(gesamtliste und gültige jeweils in einem Tabellenblatt)
ein paar Zeilen von den Gesamtdaten und den Gültigen reichen aus, ich sollte sehen, wie die Daten aufgebaut sind, in den gesamtdaten sollte auch mindestens eine gültige Zeile vorkommen.
Gruß Daniel

AW: Beispieldatei
13.05.2014 16:49:07
Daniel
beim Aufbau deiner Gültig-Liste:
Spalte A Einzelwerte mit + dazwischen und davor
Spalte B "Gültig" bzw "Ungültig"
müsste die Formel so aussehen:
=WENN(SVERWEIS(P2;[Export_mit_ESI.xlsx]Tabelle1!$A:$A;1;WAHR)=P2;SVERWEIS(P2;[Export_mit_ESI.xlsx]Tabelle1!$A:$B;2;WAHR)="gültig";1;"x");"x")
hierbei bekommen alle Werte, die in der gültig-Liste vorkommen UND bei denen ein "gültig" in Spalte B eingetragen ist, eine 1.
Alle Werte, die nicht in der Gültig-Liste vorkommen oder die vorkommen und bei deinen kein "gültig" in Spalte B eingetragen ist, bekommen ein "x".
Ob du jetzt in deinen Hilfsspalten die Werte richtg, dh immmer auf die gleiche Weise zusammengesetzt hast, kann ich von hieraus nicht beurteilen, das müsstest du an Einzelfällen prüfen.
Aber wenn in der einen Liste kein "+" davor steht und in der anderen steht eines davor, dann brauchst du dich nicht wundern, warum der SVerweis keine Übereinstimmung findet, denn die Werte müssen schon identisch sein, damit der SVerweis einen Treffer ergibt.
wenn in der Gesamt-Liste das "+" am Anfang steht und und es in der Gültig-Liste fehlt, dann kannst du es mit "+"&P2 anstelle von P2 in der Formel ergänzen, wenn es in der Gesamtliste vorhanden ist aber in der Gültig-Liste fehlt, dann kannst du es mit Teil(P2;2;99) anstelle von P2 entfernen und so die gleichheit herstellen (auf so sachen sollte man bei "Excel gut" aber von alleine kommen)
Gruß Daniel

Anzeige
AW: Beispieldatei
13.05.2014 16:55:35
yummi
Hallo Daniel,
dann müsste ich erst ein paar fiktive zusammen baune, da die Dat3en nicht im Netz auftauchen sollten.
Ich habe die Formel jetzt so:

=WENN(SVERWEIS("+"&$P2;[Export_mit_ESI.xlsx]Tabelle1!$A:$A;1;FALSCH)="+"&$P2;"x";)

Wenn eine existierende Zeile kommt dann steht das x da wie gewünscht. Wenn die zeile ungültig ist kommt #NV anstatt ""
Das Problem mit gültig kann ich umgehen, indem ich aus der Refernztabelle alle ungültigen rausschmeise.
Aber das #NV würde ich gern noch weghaben.
Noch eine Idee
Zeile könnte so aussehen
AAA+BBB+CCC+DDD+EEE+FFF+GGG+HHH+III+JJJ+KKK+LLL+MMM+NNN
AA1+BBB+CCC+DDD+EEE+FFF+GGG+HHH+III+JJJ+KKK+LLL+MMM+NNN
gültig ist nur die 2. so als Beispiel
sieht dann so aus
+AA1+BBB+CCC+DDD+EEE+FFF+GGG+HHH+III+JJJ+KKK+LLL+MMM+NNN
Gruß
yummi

Anzeige
AW: Beispieldatei
13.05.2014 17:33:49
Daniel
ähmmmmm
warum verwendest du den SVerweis mit 4. Parameter = FALSCH ?
denn kannst du bei deiner Datenmenge (86.000 Zeilen in der Suchmatrix bei 1,04 Mio Wiederholungen) in die Tonne kloppen, der braucht c.a. 5000x länger als die Variante mit WAHR.
Gruß Daniel

AW: Beispieldatei
14.05.2014 09:59:22
yummi
Hallo Daniel,
vielen Dank für deine Unterstützung!!!!! :-)))))
ich habe die Formel noch etwas mdoifiziert:

=SVERWEIS("+"&$P2;[Export_mit_ESI.xlsx]Tabelle1!$A:$B;2;WAHR)
Damit habe ich in meiner erzeugeten spalte die Werte #NV gültig und ungültig und kann dann die nicht gültigen rausschmeissen.
Für den Fall das beim Export nicht alle Gruppen erfasst werden erzeuge ich mir eien Hilfsspalte ohne die Gruppen und kann die selbe Formel anwenden.
Das ganze ist dann anstatt in mehreren Studnen in 1s fertig, super klasse!!!!!
Vielen Dank
yummi

AW: Bitte beachten
14.05.2014 10:18:30
Daniel
bei dieser kurzen Formel musst du beachten, dass wenn der Suchbegriff in der Suchmatrix nicht vorkommt (was bei dir ja mehrheitlich der Fall ist), der nächstkleinere Wert als Ergebnis verwendet wird!
was du tun musst, wenn du eine genaue Übereinstimmung braucht, hatte ich dir ja bereits gezeigt.
Gruß Daniel

AW: Bitte beachten
14.05.2014 11:08:15
yummi
Hallo Daniel,
danke für den Hinweis, habe gerade so eien Zeile entdeckt und die fiormel noch einemal angepasst

=WENN(SVERWEIS("+"&$P2;[Export_mit_ESI.xlsx]Tabelle1!$A:$A;1;WAHR)="+"&$P2;"x";"-")
Es gibt aber eine Sache, die ich nocht nicht verstehe.
Erreichen wollte ich damit, dass wenn er die Zeile findet ein x erscheint und sonst ein -
ich erklär mal mein Verständnis bisher:
Was ich aber habe sind 3 Werte +, -, und #NV
"+" erscheint wenn er eine übereinstimmende Zeile gefunden hat (mit Hilfe des x kann ich mir dann gültig oder ungültig in einer weiteren Spalte angeben lassen)
"-" soll erscheinen, wenn die Zeile im Export nicht gefunden wurde, die Zeilen können also gelöscht werden)
"#NV" kommt normalerweise, wenn die Zeile in der SVerweis Matrix nicht definiert ist (kann also auch entfallen)
Ich hoffe, so weit ist mein Verständnis reichtig.
Was ist denn jetzt der Unterschied zwischen "-" und "#NV"
Kannst Du mir da mal Erklärungshilfe leisten?
Gruß
yummi

AW: Bitte beachten
14.05.2014 11:22:44
yummi
Hallo Daniel,
ich glaube wieder etwas weiter zu sein:
"+" wenn exakt der String gefunden wurde
"-" wenn ein ähnlicher String gefunden wurde
"#NV" wenn nicht definiert, also komplett unterschiedlich
Ist das so richtig?
Danke
yummi

AW: Bitte beachten
14.05.2014 11:57:54
Daniel
Hi
ich habe dir ja schon erklärt, dass der SVerweis mit 4. Parameter = WAHR den nächstkleineren Wert als Ergebnis verwendet, wenn der Suchbegriff in der Suchmatrix nicht vorkommt.
Wenn du jetzt aber einen Wert suchst, der kleiner ist als der kleinste Wert in der Suchmatrix, dann gibt es keinen "nächstkleinern" Wert und die Formel muss die Fehlermeldung anzeigen.
deswegen hatte ich ja auch irgendwo geschrieben, dass es sinnvoll ist, die Suchmatrix mit dem Dummywert 0 beginnen zu lassen, damit der genannte Fall nicht eintreten kann.
gruß Daniel

DANKE
14.05.2014 12:19:10
yummi
Hallo Daniel,
vielen Dank für die Geduld und die Mühe. Jetzt bekomme ich das hin und sogar viel schneller.
Den Rest schaff ich
Vielen, vielen Dank
yummi

76 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige