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

VBA-Makro mit AutoFilter

VBA-Makro mit AutoFilter
Sebastian
Hallo an alle,
nachdem ich mich nun seit einigen Wochen in VBA einarbeite und bisher bei allen Problemen mit der Forensuche und der MSDN Library gut zurecht gekommen war, bin ich heute leider auf ein Problem gestoßen, das ich so alleine nicht zu lösen vermag. Ich hoffe ihr könnt mir dabei helfen!
Folgendes sind die Umstände in denen ich mich befinde:
Ich bin dabei ein Makro zu programmieren, welches aus einer Excel-Tabelle, welche in insgesamt 12 Spalten zahlreiche Daten (Messwerte) enthält letztendlich ein Diagramm erstellt. Die Erstellung des Diagramms als solches funktioniert problemlos. Allerdings gibt es hierbei eine Ausnahme: Die Daten übersteigen die Zahl von 32000 Werten. Excel kann mir also nur bis zum 32000sten Wert ein Diagramm erstellen und schneidet mir die restlichen Werte ab.
Da die Überschreitung der 32000 Werte variiert und ich nicht einfach fix jeden x-ten Wert löschen möchte (dann gehen in manchen Fällen [z.B. 33000 Werte] einfach zu viele Daten verloren), habe ich mir nun eine Funktion geschrieben, welche zuerst die Anzahl der überschüssigen Messwerte ermittelt und mir daraus eine Zahl genieriert, jeder wievielte Wert aus meinem Datensatz gelöscht werden soll und diese zurückliefert.
Nun hatte ich mir zwei Mögliche Lösungen überlegt weiter mit diesem berechneten Wert umzugehen.
Möglichkeit 1:
.Clear jeder x-ten Zeile und anschließendes .Copy und .PasteSpecial Paste:=xlPasteValues, SkipBlanks:=True in eine andere Spalte (die ursprünglichen Werte müssen an der Stelle stehen bleiben, da es keine reinen Werte sondern Berechnungsergebnisse aus den Daten von mehreren Spalten weiter vorne sind)
Möglichkeit 2:
in einer Spalte jede x-te Zelle mit einem Kommentar versehen und anschließend einen Autofilter darauf anwenden. Die kommentierten Zeilen ausblenden, die Datei schließen, neu öffnen und die sichtbaren Zellen markieren und in einen Range-Zwischenspeicher kopieren, den Filter auf "(Alle)" stellen und den Zwischenspeicher in eine andere Spalte weiter rechts einfügen.
Jetzt ist es leider so, dass keine der beiden Möglichkeiten per Makro funktionieren mag.
Möglichkeit 2 funktioniert komischerweise wenn ich sie manuell durchführe hervorragend. Wenn ich diese Prozedur aufzeichne und erneut abspiele funktioniert sie nicht.
Möglichkeit 1 erscheint mir deutlich einfacher. Die Zellen werden auch wie gewünscht gesäubert, nur das .PasteSpecial scheint nicht zu funktionieren, denn die Leerzeilen werden trotzdem eingefügt. Wenigstens xlPasteValues funktioniert ...
Nachdem ich nun heute den ganzen Tag versucht habe zum Ergebnis zu kommen, hier ca. 20 Tabs mit MSDN, herber, u.ä. geöffnet habe und nicht mehr weiter weiß,
hoffe ich, dass ihr mir helfen könnt und ich so doch noch zum gewünschten Diagramm gelange.
Wenn ihr weitere Informationen braucht, kann ich euch die gerne nachliefern. Den VB-Code habe ich nur erst einmal nicht gepostet, da ich erstens nicht weiß, wie man dies hier richtig macht (lese gleich mal in der FAQ) und zweitens ist er durch mein heutiges Herumexperimentieren sehr unübersichtlich geworden (viel auskommentiert).
Schönen Abend noch!
Sebastian

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

Betreff
Benutzer
Anzeige
AW: VBA-Makro mit AutoFilter
07.03.2010 00:54:30
Gerd
Hallo Sebastian,
zu deiner 2. Variante.
Sub gefilterte_kopieren()
ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy Destination:=Cells(1, 6)
End Sub
Gruß Gerd
AW: VBA-Makro mit AutoFilter
07.03.2010 01:10:12
Sebastian
Hallo Gerd,
danke schon einmal für deine Antwort zu so später Stunde.
Genau damit habe ich Möglichkeit2 umsetzen wollen.
Allerdings bekomme ich in genau dieser Zeile folgende Fehlermeldung.
Ich habe allerdings alles, was mit dem Erstellen des Diagramms zu tun hat bereits auskommentiert...
und beim Debuggen wird die von dir genannte Zeile markiert.
Fehlermeldung:
Userbild
Viele Grüße,
Sebastian
Anzeige
AW: VBA-Makro mit AutoFilter
07.03.2010 01:19:05
Gerd
Hallo Sebastian,
mal langsam. Dieser Code erstellt kein Diagramm, sondern kopiert (nur) den Filterbereich nach Spalte F.
Wobei mir noch einfällt, dass es günstiger wäre, in ein zweites Blatt zu kopieren, wenn der Filterbereich
anschließend auf "alle" zurückgesezt wird.
Für die Filterung selbst solltest ggf. den relevanten Codeteil zeigen u. beschreiben, welche Sorte Daten gefiltert werden sollen.
Gruß Gerd
AW: VBA-Makro mit AutoFilter
07.03.2010 01:37:56
Sebastian
Hallo Gerd,
dass dieser Code kein Diagramm erstellt ist mir doch bewusst. Die Fehlermeldung enthält nur die Information, dass es am Diagramm-Erstellen scheitert.
Mein Code sieht folgendermaßen aus:
Sub Datenreduktion()
Dim Daten_Reduziert As Worksheet
Set Daten_Reduziert = Worksheets.Add
With Daten_Reduziert
.Name = "Daten reduziert"
.Move after:=Sheets(Sheets.Count)
End With
Sheets("Daten bearbeitet").Activate
Range("M3:Q3").Select                                                       'Kopfzeile der  _
Datenspalten
Selection.AutoFilter
Selection.AutoFilter Field:=1, Criteria1:="="                       'nur, wenn Spalte M  _
leer ist anzeigen
ActiveWorkbook.Close SaveChanges:=True
Workbooks.Open Filename:="D:\...\Auswertung.xls"          'anonymisiert
If Sheets("Daten bearbeitet").FilterMode Then
ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy
Sheets("Daten reduziert").Range("A1").PasteSpecial Paste:=xlPasteValues
End If
End Sub

In Spalte M wurde zuvor ein jede x-te Zeile der Wert "filtern!" eingetragen. Die Daten sind Messwerte (Reibung, Temperatur) über die Zeit.
Gruß,
Sebastian
Anzeige
AW: VBA-Makro mit AutoFilter
07.03.2010 02:12:51
Gerd
In Spalte M wurde zuvor ein jede x-te Zeile der Wert "filtern!" eingetragen. Die Daten sind Messwerte (Reibung, Temperatur) über die Zeit.
Hallo Sebastian!
Sheets("Daten bearbeitet").Activate
Range("M:Q").AutoFilter 'Kopfzeile der Datenspalten
Range("M:Q"). AutoFilter Field:=1, Criteria1:~f~="=" ~f~& "filtern"
.... oder ~f~="<>"~f~ & "filtern" ...... ? ~f~
Warum die Datei dann erst geschlossen werden muss, verstehe ich nicht.
Ist sichergestellt, dass die maximale Anzahl an (sichtbaren) Zellen fürs Diagramm ~f~< 32000 nicht überschritten wird ?
Gruß Gerd
Anzeige
AW: VBA-Makro mit AutoFilter
07.03.2010 02:30:10
Sebastian
Hallo Gerd,
Ist sichergestellt, dass die maximale Anzahl an (sichtbaren) Zellen fürs Diagramm ~f~
Deswegen ja die ganze Prozedur mit dem reduzieren der Werteanzahl. Ich habe über 32000 Werte und möchte diese auf unter 32000 bringen.
Deinen Vorschlag bei Range("M3:Q3").Select und den Folgezeilen werde ich einbauen. Das Select ist unnötig. Aber funktionieren tut es leider immer noch nicht.:(
Ich muss das Workbook erst schließen und wieder öffnen, da sonst beim Kopieren im gefilterten Bereich auch die ausgeblendeten Zellen mitkopiert werden. So ist das zumindest, wenn man manuell kopiert. Wie ich leider herausfinden musste ist es beim Abarbeiten des Makros egal, ob die Datei geschlossen und neu geöffnet wurde oder nicht, es werden so oder so alle Zellen (auch die ausgeblendeten) angewählt :(
Gruß,
Sebastian
Anzeige
AW: VBA-Makro mit AutoFilter
07.03.2010 10:16:38
Sebastian
Hallo Gerd, hallo alle Mitleser.
Habe heute morgen (endlich) die Lösung für mein Problem gefunden.
Um allen, die vielleicht auf das selbe Problem stoßen sollten eine Anleitung zu liefern beschreibe ich kurz, wie ich vorgegangen bin.
Zuerst wird meine gesamter Wertebereich, aus dem später das Diagramm erstellt werden soll inklusive der überschüssigen (~f~>32000) Werte in die daneben liegenden Spalten kopiert.
Jede x-te Zeile (x wurde vorher aus der überschüssigen Werteanzahl ermittelt) wird anschließend mit .Clear gesäubert.
Auf den gesamten Bereich inkl. der Leerzellen wende ich dann folgende Prozedur an:
Sub LeereLöschen(Zeilenanzahl As Long)
Dim arr As Variant, rng As Range,  arrDelete() As Variant
Dim i As Long
Set rng = Range("A4:D" & Zeilenanzahl)
arr = rng
ReDim arrDelete(1 To UBound(arr), 1 To 1)
' die ersten 3 Zeilen enthalten Überschriften daher Beginn bei  Zeile 4
For i = 4 To UBound(arr)
If IsEmpty(arr(i, 1)) = True And _
IsEmpty(arr(i, 2)) = True And _
IsEmpty(arr(i, 3)) = True And _
IsEmpty(arr(i, 4)) = True Then
arrDelete(i, 1) = i
End If
Next
If WorksheetFunction.CountA(arrDelete) > 0 Then
With rng.Parent
.Range("A:A").Insert
.Range("A1").Resize(UBound(arrDel)) = arrDelete
.Range("A4:E" & Zeilenanzahl).Sort .Range("A1"), xlAscending, , , , , , xlYes
.Range("A:A").Delete
End With
End If
End Sub
Ich durchlaufe also alle Zeilen meines Datenbereiches, trage in alle Leerzeilen in der ersten Spalte einen Laufparameter ein und sortiere anschließend den gesamten Datenbereich nach dieser Spalte. Die Spalte mit dem Laufparameter wird anschließend wieder gelöscht.
Ich habe das ganze mit Arrays umgesetzt, da ich das Löschen zuvor durch das Durchlaufen der Zeilen selbst versucht habe und dies EWIG (für 48000 Zeilen habe ich nach 10min Excel per Taskmanager abgeschossen). Dass dieser Weg schneller sein soll habe ich über die Suchmaschine gefunden. Nun geht es in unter 1sec.
Gerd, dir nochmal vielen Dank für deine Hilfe.
Beste Grüße,
Sebastian
Anzeige
AW: VBA-Makro mit AutoFilter
07.03.2010 11:59:37
Gerd
Hallo Sebastian,
kleine Datenmengen sind eben nicht große Datenmengen. Kurz, meine Testbasis war zu klein um diese
irreführende Fehlermeldung zu erzeugen.
Da haben wir eine Limitation erwischt u. es hilft wohl nur die Datenfeldschaufel.
Deine Selectionsbedingung könntest Du natürlich auch für das Datenfeld y direkt setzen.
Im Groben:
Sub Füllen()
Dim col As Long
For col = 13 To 17
Cells(1, col) = Columns(col).Address(0, 0, xlA1)
Next
With Range(Cells(2, 14), Cells(40000, 17))
.Cells.Formula = "=COLUMN()/ROW()"
End With
End Sub

Sub Krit()
Dim row As Long
Range(Cells(2, 13), Cells(40000, 13)).Value = "filtern"
For row = 2 To 40000 Step 4
Cells(row, 13).ClearContents
Next
End Sub

Sub Kopieren()
Dim x, y()
Dim i As Long, j As Long, z As Long
x = Intersect(ActiveSheet.UsedRange, ActiveSheet.Columns("M:Q")).Value2
ReDim y(UBound(x, 1), 1 To 4)
For i = 2 To UBound(x, 1)
If x(i, 1) = "filtern" Then
For j = 1 To 4
y(z, j) = x(i, j + 1)
Next
z = z + 1
End If
Next
Tabelle2.Cells(1, 1).Resize(UBound(x, 1), 4) = y
End Sub
Gruß Gerd
Anzeige

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige