Tabellenblätter filtern die Durcheinandern sind

  • Excel

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von urs_a_schmid.

    Tabellenblätter filtern die Durcheinandern sind

    Hallo und guten morgen zusammen,

    ich habe da ein kleines Problem mit einer Excel Tabelle.
    Da ich noch ein Frischling in Sache VBA bin frag ich euch mal.

    Ich möchte gerne dass im ersten Tabellenblatte alle Daten aus den restlichen Blättern
    in den Spalten B1 bis B47, C1 bis C47, D1 bis D47 usw. eingetragen werden ( es sind ca. 500 Tabellenblätter).


    Bei jeden Tabellenblatt sind:
    Spalte A1 – A 47 sind Die Bezeichnungen
    Spalte B1 – B47 sind die Daten

    Mein Problem ist, das die Bezeichnung in der Spalte A1 – A47 durcheinander sind.
    Die Daten sollen auf ein Tabellenblatte zusammengefügt werden soll.

    Danke für euere Hilfe vorab :)

    Gruß,
    DOC
    Danke für die Antwort,

    das mit den SVerweis ist schon gut aber er müste über 500 Tabellenblätter gehen
    und die Daten im ersten Tabellenblatt nebeneinander eintragen soll.

    Das ist auch mein Problem da ich nciht weiss wie es geht :(

    Gruß,
    DOC
    Wie viel Code hast du den schon?
    Ich würde in etwa diesen Ansatz versuchen:

    Visual Basic-Quellcode

    1. Set Summary=ThisWorkbook.Sheet("Summary")
    2. Col=2
    3. For Each ws in ThisWorkbook.Worksheets
    4. If ws.Name <> "Summary" Then
    5. Summary.Cells(1,Col).Formula = ws.Name
    6. For Row = 2 To Summary.Cells(Rows.Count,1).End(xlUp).Row
    7. Summary.Cells(Row,Col).FormulaR1C1 = "=VLOOKUP(RC[1]," & ws.Name & "!C[2],1,FALSE)"
    8. Next
    9. End If
    10. Col=Col+1
    11. Next
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo Petaod,

    Danke erstmal :)

    Hier mein Code:

    Sub Filter()
    For Each blatt In ThisWorkbook.Worksheets
    If blatt.Name <> "Tabelle" Then
    zeile = Worksheets("Tabelle").Range("A1").CurrentRegion.Rows.Count + 1
    Worksheets("Tabelle").Range("b" & zeile).Value = blatt.Range("B2")
    Worksheets("Tabelle").Range("C" & zeile).Value = blatt.Range("B3")
    .
    .
    .
    Worksheets("Tabelle").Range("AU" & zeile).Value = blatt.Range("B47")
    End If
    Next

    Jetzt weis ich aber nicht wo ich genau den Code plazieren muß,
    das der Filter richtig funktioniert.

    Kannst Du mir dabei bitte Helfen? :)

    Danke und Gruß,
    DOC

    Vielleicht geht es so

    Hallo Doc

    ich habe gerade solch einen Code gebaut. Vielleicht hilft er weiter. Er kopiert die Daten der einzelnen Blätter untereinander ins erste Tabellenblatt. Das kann sicher abgeändert werden auf eine seitliche Verschiebung. Weiter müsste bei jedem For Step ein Sortieren der eingefügten Daten durchgeführt werden. Dann könnte auch das Durcheinander gelöst werden.

    Sub Tabellenblaetter_zusammenfuehren()

    Dim iZeile As Integer
    Dim i As Integer
    Dim s As Integer
    Dim z As Integer

    Range("A1").Select
    Cells.Select

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    ' Anzahl Schritte für die "For" Schleife zählen (Anzahl Tabellenblätter minus 1)

    For Each Sheet In Sheets
    s = s + 1
    Next
    s = s - 1

    ' Tabellenblätter an erstes Tabellenblatt anhängen

    z = 1

    For i = 1 To s

    Sheets(Worksheets(ActiveWorkbook.ActiveSheet.Index + z).Name).Select
    Range("A1:B47").Select
    Selection.Copy
    Sheets(Worksheets(ActiveWorkbook.ActiveSheet.Index - z).Name).Select
    Range("A1").Select
    iZeile = Selection.End(xlDown).Row + 1
    Cells(iZeile, 2).Select
    ActiveSheet.Paste

    z = z + 1

    Next

    Range("A1").Select

    ' Warnmeldungen wieder einschalten

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

    End Sub

    Freundlichen Gruss

    Urs Schmid

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „urs_a_schmid“ () aus folgendem Grund: Falscher Ansprechpartner

    urs_a_schmid schrieb:

    Sheets(Worksheets(ActiveWorkbook.ActiveSheet.Index + z).Name).Select
    Range("A1:B47").Select
    Selection.Copy
    Sheets(Worksheets(ActiveWorkbook.ActiveSheet.Index - z).Name).Select
    Range("A1").Select
    iZeile = Selection.End(xlDown).Row + 1
    Cells(iZeile, 2).Select
    ActiveSheet.Paste
    Aua.
    Das tut richtig weh.
    Da sind so ziemlich alle Faux-Pas in wenigen Zeilen vereinigt.
    .Select / Selection.
    .Copy / .Paste
    ActiveWorkbook / ActiveSheet
    sind alles Objekte und Methoden, die in einem gesunden Code nichts zu suchen haben.
    So sieht nur Code aus, der aus dem Macro-Recorder blind kopiert wird.


    @Docviper:
    Der Code ist so gut wie fertig und muss nur noch kopiert werden.
    Lege ein Sheet Summary an und kopiere in Spalte 1 alle Bezeichnungen die in den anderen Sheets in Spalte 1 vorkommen.
    Den Code kannst du an fast beliebiger Stelle platzieren. Leg ihn am besten auch in Summary.
    Einen Rahmen mit Sub / End Sub drum herum wirst du ja wohl noch selbst schreiben können.
    Einmal ausführen. Fertig.

    Wenn du es noch etwas dynamischer haben willst kannst du auch die erste Spalte zur Laufzeit erzeugen.
    Der Tipp wäre hier .Find
    aber am besten kriegst du erst mal diesen Code zum Laufen.
    In den 11 Zeilen ist alles enthalten, was du brauchst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Super Code, wirklich.

    Hallo Petaod

    Dein Code ist natürlich das gelbe vom Ei und ich bin meilenweit davon entfernt solchen Code zu schreiben.

    Aber es ist so wie ein mir bekannter Chinese mal gesagt hat, es spielt keine Rolle wie man die Stäbchen hält. Das einzige Ziel ist es das Essen vom Teller in den Mund zu bekommen 8-) .

    So verhält es sich auch bei einem Code. Er kann noch so schlecht aussehen oder so miserabel programmiert sein, Hauptsache er tut seinen Dienst und macht das was man machen möchte.

    Freundliche Grüsse

    Urs Schmid
    Dein Code ist natürlich das gelbe vom Ei
    Aber nein doch.
    Das ist nur eine Code-Skizze, die nicht mal getestet ist.
    Der Code soll nur einen Weg aufzeigen, wie es gehen könnte.


    So verhält es sich auch bei einem Code. Er kann noch so schlecht aussehen oder so miserabel programmiert sein, Hauptsache er tut seinen Dienst und macht das was man machen möchte.
    Die Optik ist auch einigermassen egal, solange es sich um Code handelt, den kein anderer in die Hand nehmen muss.

    Meist hat es seinen Grund, wenn man von schlechtem Code spricht:
    Er läuft nicht in allen Fällen fehlerfrei.

    Vielleicht stört dich die schlechte Performance durch die ewige Arbeitsblattumschalterei nicht.
    Du solltest dennoch wissen, was du Excel dabei zumutest.

    Aber das Copy/Paste ist ein echtes KO-Kriterium.
    Lass das Script mal im Hintergrund laufen und mache in einer anderen Anwendung manuelle Copy/Paste-Vorgänge, dann siehst du, wie sie sich ins Gehege kommen.

    Oder, noch besser, lass zwei solcher Macros parallel laufen.
    Die werfen sich gegenseitig ihre Daten zu, dass kein Stein auf dem anderen bleibt.

    Wenn du auf chinesische Sprichwörter stehst, hätte ich auch noch eines:
    Wer einen Fehler gemacht hat und ihn nicht korrigiert, begeht einen zweiten.
    (Konfuzius)
    ;)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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