Filtern, Sortieren und in Spalte ersten 10 Zeilen ändern
#1
Hallo zusammen...

"Gelöst" habe ich (dank Makro-aufzeichnen), dass ich die Spalten L, M und G nach einem bestimmten Kriterium filtern und dann die ganze Tabelle unter Berücksichtigung der Spalte H sortieren kann. Nun fehlt mir noch eine Funktion und zwar möchte ich, dass diese nur in den ersten 10 Zeilen der gefilterten Datensätze in Spalte G einen immer gleichen Wert einsetzt (z.B. "AAAAAA") und nur die ersten 10 Zeilen in Tabellenblatt 2 kopiert werden. Beim kopieren hab ich, dachte ich, den Bereich auf 10 Zeilen begrenzt, kommen aber dennoch mehr im Tabellenblatt 2 an.

Vielen Dank und Grüße
Sandor


Angehängte Dateien
.xlsm   Mappe1.xlsm (Größe: 27,82 KB / Downloads: 4)
Top
#2
Hier mal der Code, wie ich ihn im Moment habe und zum Testen verwende...
Code:
Private Sub CommandButton1_Click()

'+--------------------------------------------------------------------------------------------------+
'|  Filtern über die Autifilter-Option.                                                             |
'+--------------------------------------------------------------------------------------------------+
'|  ErsteZelle      = 1. Zelle der zu filternden Datenbank.                                         |
'|  Spalte          = Spaltennummer der Datenbank, in welchem sich das Filterkriterium befindet.    |
'|  FilterKriterium = Filterkriterium nach welcher in der angegebenen Spalte gefiltert werden soll  |
'+--------------------------------------------------------------------------------------------------+
   Range("A3").AutoFilter Field:=12, Criteria1:="<>"
   Range("A3").AutoFilter Field:=13, Criteria1:="="
   Range("A3").AutoFilter Field:=7, Criteria1:="="
   
'+---------------------------------------------------------------------------------------------+
'|  Sortiert Spalte H                                                                          |
'+---------------------------------------------------------------------------------------------+
   Columns("H:H").Select
   ActiveWorkbook.Worksheets("Tabelle1").AutoFilter.Sort.SortFields.Clear
   ActiveWorkbook.Worksheets("Tabelle1").AutoFilter.Sort.SortFields.Add Key:= _
       Range("H2:H10000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
       xlSortNormal
   With ActiveWorkbook.Worksheets("Tabelle1").AutoFilter.Sort
       .Header = xlYes
       .MatchCase = False
       .Orientation = xlTopToBottom
       .SortMethod = xlPinYin
       .Apply
   End With
       
Range("G2:G31").SpecialCells(xlCellTypeVisible).Select
Selection.Value = "R1"

End Sub

Klar, mit dem kann das noch nicht funktionieren wie gewünscht...
Top
#3
Hallo,

(06.08.2015, 14:23)sandormiles schrieb: Nun fehlt mir noch eine Funktion und zwar möchte ich, dass diese nur in den ersten 10 Zeilen der gefilterten Datensätze in Spalte G einen immer gleichen Wert einsetzt (z.B. "AAAAAA") und nur die ersten 10 Zeilen in Tabellenblatt 2 kopiert werden. Beim kopieren hab ich, dachte ich, den Bereich auf 10 Zeilen begrenzt, kommen aber dennoch mehr im Tabellenblatt 2 an.

Der Felhler liegt in diesem Codebereich

Code:
   ActiveSheet.Range("A2:D11" & ActiveSheet.UsedRange.Rows.Count). _
   SpecialCells(xlCellTypeVisible).Copy

wenn ich das im Direktfenster ein wenig abändere, kommt das

?activesheet.range("D2:D11" & activesheet.usedrange.rows.count).SpecialCells(xlCellTypeVisible).address
$D$2:$D$1131

heraus.
Gruß Stefan
Win 10 / Office 2016
Top
#4
Hallo Stefan,

ich muss gestehen, dass ich die Antwort gerade nicht verstehe.

Falls mein Code zu vermurkst ist, um das gerade zu biegen, vielleicht kann jemand mal anhand einer Musterdatei einen kurzen Code schreiben, damit ich die Systematik verstehe.

Grüße
Sandor
Top
#5
Hallo!
Ohne mir die Datei bereits angesehen zu haben (bin momentan mit Modem-Geschwindigkeit unterwegs ... :20: ):
Du solltest erst nach den drei Kriterien sortieren und dann den Autofilter benutzen.
Dies wird dazu führen, dass Dein Filtrat keine ausgeblendeten Zeilen enthält.
(Statt Zeile 2, 15, 30, 68 hast Du dann einen Block: 115:118)
Hier kannst Du dann die ersten x Zeilen ermitteln.

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#6
Hallo Ralf,

die Idee klingt nicht schlecht, aber sehe im Moment nicht so ganz, dass das funktionieren könnte.

Das Problem ist nämlich folgendes. Wenn in Spalte H Werte stehen, sollen die alle ab Zeile 2 gelistet werden. Dies funktioniert. Es Funktioniert auch, wenn ich dann die Spalte K sortiere nach Datum "Alter absteigend". In der Spalte K müssen zwingend Daten stehen. Nun kommen dann aber die beiden "Problemspalten". In Spalte L (Datumsangaben) können Werte stehen, müssen es aber nicht. Interessant für mich sind aber nur die Zeilen, in denen in Spalte L ein Wert steht und in Spalte M (Datumsangaben) nicht. Und hier scheitere ich dann bei dem Versuch.

Vielleicht sollte ich aber auch anders rangehen an das Problem und es nicht über eine "Ein-Knopf-drücken-Methode" versuchen zu lösen und mal die von meinem Vorgänger eingeführte Aktenverteilung grundsätzlich überdenken. Bisher ist das so geregelt, dass alle Akten in einem "Aktenpool" landen und wenn eine Akte bearbeitet wurde die nächste zugewiesen wird. Jetzt wäre ja mal die Gelegenheit, das umzustellen und die Akten direkt nach Anlage zuzuweisen... Klingt irgendwie schöner :19:

PS: Nicht wundern, da wo ich arbeite (Behörde) gibt es schon Programme zur Aktenverwaltung. Das Tool ist aber für Mitarbeiter vorgesehen, die Widersprüche bearbeiten und die sind im Programm nicht vorgesehen und sollen auch nicht mit berücksichtigt werden. Versteht kein Mensch, ist so und soll auch so bleiben Dodgy
Top
#7
Hallo!
Ich habe in der Zwischenzeit mal erarbeitet, wie man die sichtbaren Zeilen im Autofilter ermittelt.
(Weil es mich auch interessiert und man auch nach Recherche nicht wirklich fündig wird)
Bei mir ist die gefüllte Spalte die erste, also A.
Folgender Code schreibt alle Zeilennummern des sichtbaren (gefilterten) Bereichs in ein Array, mit dem man natürlich weiterarbeiten kann.
Willst Du die ersten 10 Datensätze manipulieren, dann betrifft dies arrTemp(1) bis arrTemp(10):

Code:
Sub test()
Dim Zelle As Range, arrTemp(), tmpCounter As Long
For Each Zelle In Intersect(Tabelle1.UsedRange.SpecialCells(xlCellTypeVisible), Tabelle1.Columns(1))
  ReDim Preserve arrTemp(tmpCounter)
  arrTemp(tmpCounter) = Zelle.Row
  tmpCounter = tmpCounter + 1
Next
MsgBox "Der Filter enthält " & UBound(arrTemp) & " von " & Tabelle1.UsedRange.Rows.Count - 1 & " Datensätzen!"
MsgBox "erster Datensatz in Zeile: " & arrTemp(1) & vbLf & _
  "letzer Datensatz in Zeile: " & arrTemp(UBound(arrTemp))
End Sub

Vielleicht kannst Du ja bereits damit etwas anfangen?

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • sandormiles
Top
#8
Danke Ralf... Greife ich doch auf die Idee und schau mal weiter...
Top
#9
Hallo Ralf, mit den "10 Datensätzen" und einem Button will ich so nicht weiterverfolgen. Dein Lösungsansatz hilft und ermöglich eine andere Option. Kannst du mir vielleicht zeigen, wie ich die Daten aus dem Array in eine Listbox bekomme? Mit
Code:
ListBox1.List = arrTemp()
zeigt mir die Listbox schon die Zeilennummern der sortierten und gefilterten Datensätze an, wobei auch die erste Zeile angezeigt wird. Hier stehen aber die Zeilenüberschriften. In der Listbox müssen dann aber nicht alle Spalten angezeigt werden. Eine Beispielspalte würde erstmal reichen, damit ich dann was zum probieren habe...

Vielen Dank und Grüße
Sandor


Angehängte Dateien
.xlsm   Mappe2.xlsm (Größe: 38,81 KB / Downloads: 4)
Top
#10
Hi!
Du kannst natürlich auch statt der Zeilennummer die Werte ins Array einlesen:
Code:
arrTemp(tmpCounter) = Zelle.Value

Das Füllen der ListBox dann nicht über .List sondern mittels Schleife und .AddItem:
Code:
For tmpCounter = 1 To UBound(arrTemp)
  Tabelle1.ListBox1.AddItem arrTemp(tmpCounter)
Next

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • sandormiles
Top


Gehe zu:


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