Hilfe bei Makro für Excel Tabellen Filterung

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von alex4591.

    Hilfe bei Makro für Excel Tabellen Filterung

    Hallo Leute,

    ich bin absoluter Neuling bei VB :D Allerdings muss ich privat relativ lange Excel Listen führen und wüsste gerne wie man diese mit einem Makro filtert. Und zwar würde ich gerne ein Programm haben, in das ich eine beliebige Excel Tabelle laden kann und dann sondieren kann. Zum Beispiel: Bei einer Tabelle mit 1000 Zeilen nur jede 10. oder 100. zeigen oder Löschen. Dass am Ende nur die 1. die 201. 301. 401. usw. stehen bleibt. Meine Frage ist, wäre das überhaupt mit VB machbar und wie groß ist der Aufwand ein solches Makro zu schreiben? Die bestehende Excel Tabelle soll dabei erhalten bleiben und es soll eine separate "gefilterte" Version abzuspeichern sein.

    Liebe Grüße
    Alex

    * Topic verschoben *

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()

    @alex4591 Willkommen im Forum. :thumbup:
    Du bist hier in diesem Unterforum etwas deplaziert, deswegen sollten wir zunächst ermitteln, wo Du eigentlich hingehörst.
    VB und Makro ist reichlich disjunkt, deswegen beschreib zunächst mal, womit Du programmieren willst: [Allgemein] VB.NET, VB6, VBA, VBS — Mit welcher Sprache programmiere ich eigentlich?
    Wenn das klar ist, lassen wir diesen Deinen Thread in das richtige Unterforum verschieben.
    Und:
    Gib diesem Deinen Thead bitte einen aussagekräftigen Titel.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Türlich machbar. Das ist eine einfache Schleife, die in selber festgelegten Sprüngen die Zeilen in eine neue Tabelle schreibt, also z.B.

    Sprunggröße = 100 =>
    aus Tabelle 1 wird Zeile 1 in Tabelle 2, Zeile 1 geschrieben
    aus Tabelle 1 wird Zeile 101 in Tabelle 2, Zeile 2 geschrieben
    aus Tabelle 1 wird Zeile 201 in Tabelle 2, Zeile 3 geschrieben
    aus Tabelle 1 wird Zeile 301 in Tabelle 2, Zeile 4 geschrieben


    Jetzt zwei entscheidene Fragen:
    1. Sind die Sprünge wirklich fix, oder ist es manchmal auch so: gebraucht werden die Zeilen#1, #101, #202, #299, #403, …
    2. Viel wichtiger: Wieviel Programmiererfahrung hast Du bisher?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Schwierig ist relativ. Wenn Du mit den Grundlagen jedoch noch nicht vertraut bist, such Dir erstmal ein passendes Einstiegstutorial. Bücher wie »Visual Basic 2010 - Das Entwicklerhandbuch« von Klaus Löffelmann fallen da trotz der Empfehlung von einigen im Forum raus. Das ist schon ne Stufe zu hoch. Solange Du Dich nur in Office bewegst, probier's z.B. mal mit dem Tut der FernUni Hagen. Ist zwar fast 20 Jahre alt, behandelt aber VB6. Da bist Du relativ nahe an VBA dran. Solltest Du irgendwann auf VB.Net wechseln wollen, reicht m.E. für den Anfang auch das Material von Rheinwerk, obwohl es bei den komplexeren Themen wohl unsauber wird. Aber bis dahin hast Du eh noch einiges vor Dir.

    Für den Anfang:
    Spoiler anzeigen

    Ich bau mal 2 Kandidaten zusammen, 1x leicht, aber starr, 1x etwas umfangreicher, da flexibler. Ich gehe davon aus, dass das Programm dann aufhören sollte, wenn die Daten zuende sind. Das heißt aber auch, dass immer nur eine Spalte ausgewertet und übertragen wird und dass es keine Leerzeilen in den Daten gibt.

    Visual Basic-Quellcode

    1. 'einfach und starr:
    2. Private Sub PutSpecificCellValuesToTab2()
    3. Dim CurrentOriginRow As Integer, CurrentDestinationRow As Integer 'Variablen bekannt geben; Namen sollten aussagekräftig sein
    4. CurrentOriginRow = 1 'Startwerte festlegen
    5. CurrentDestinationRow = 1
    6. Do Until Sheets(1).Cells(CurrentOriginRow, 1).Value = "" 'die folgende Schleife wird solange wiederholt, bis in der ausgesuchten Zelle nichts steht
    7. Sheets(2).Cells(CurrentDestinationRow, 1).Value = Sheets(1).Cells(CurrentOriginRow, 1).Value 'Datenübertragung von Tab1 zu Tab2
    8. CurrentOriginRow = CurrentOriginRow + 10 'Variablenwert erhöhen, der in Zeile#6 und #7 die Zeile für die ausgesuchte Zeile darstellt
    9. CurrentDestinationRow = CurrentDestinationRow + 1 'Variablenwert erhöhen, der in Zeile#7 den Wert für die Zielzeile in Tab2 darstellt
    10. Loop 'Schleifenende
    11. End Sub
    12. 'komplexer und flexibler
    13. 'viel mehr Code ist es nicht, sondern es werden Funktionsparameter genutzt, die die fixen Werte beseitigen; der Sinn jedes Parameters sollte aufgrund der von mir gewählten Namen klar sein, oder?
    14. Private Sub PutSpecificCellValuesToAnotherTab(Step As Integer, StartRow As Integer, ColumnToUse As Integer, OriginSheetIndex As Integer, DestinationSheetIndex As Integer)
    15. ' Fehlerüberprüfung (immer wichtig!)
    16. If Sheets.Count < OriginSheetIndex Then MsgBox ("Es gibt keine " & OriginSheetIndex & ". Tabelle, aus der die Daten gelesen werden können."): Exit Sub
    17. If Sheets.Count < DestinationSheetIndex Then MsgBox ("Es gibt keine " & DestinationSheetIndex & ". Tabelle, in die die Zieldaten reingeschrieben werden können."): Exit Sub
    18. Dim CurrentOriginRow As Integer, CurrentDestinationRow As Integer
    19. CurrentOriginRow = StartRow 'Parameter aus dem Funktionskopf wird übernommen -> man kann die Schrittweite selber festlegen
    20. CurrentDestinationRow = 1
    21. Do Until Sheets(OriginSheetIndex).Cells(CurrentOriginRow, ColumnToUse).Value = ""
    22. Sheets(DestinationSheetIndex).Cells(CurrentDestinationRow, ColumnToUse).Value = Sheets(OriginSheetIndex).Cells(CurrentOriginRow, ColumnToUse).Value
    23. CurrentOriginRow = CurrentOriginRow + Step
    24. CurrentDestinationRow = CurrentDestinationRow + 1
    25. Loop
    26. End Sub
    27. 'eigentlicher Aufruf der o.g. Prozeduren
    28. Sub Makro1
    29. Call PutSpecificCellValuesToTab2
    30. Call PutSpecificCellValuesToAnotherTab(3, 1, 1, 1, 3)
    31. End Sub

    Das ist zwar fast eine Komplettlösung, sollte Dich jedoch nicht dazu animieren, weitere Probleme derart im Forum zu lösen. Hilfe zur Selbsthilfe steht hier ganz oben. Wer echte Komplettlösungen will, sollte sich auf dem Marktplatz melden. Aber ich bin mir sicher, dass Du das schon weißt.
    btw: Eine nette Möglichkeit für Anfänger ist in Office, den Makrorecorder zu benutzen: Anwerfen, etwas einfaches machen, Recorder stoppen und schauen, welcher Code generiert wurde. Den kann man dann anschauen, versuchen zu verstehen, nachbauen, modifizieren. Da kann man auf die Schnelle auch ein paar komplexere Sachen lösen. Gut, das mit der o.g. Schleife klappt nicht, aber n bisken muss man ja auch selber wissen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Vorschlag:

    Visual Basic-Quellcode

    1. ​Sub CopySelectedRows(ByVal StepRange As Long)
    2. Dim r As Long
    3. Tabelle2.Cells.ClearContents
    4. For r = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    5. If r Mod StepRange = 0 Then
    6. Cells(r, 1).EntireRow.Copy Tabelle2.Cells(Rows.Count, 1).End(xlUp).Offset(1)
    7. End If
    8. Next
    9. End Sub
    10. 'Aufruf:
    11. Sub Select100()
    12. CopySelectedRows 100
    13. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --