Clever-Excel-Forum

Normale Version: VBA-Code mit Fehler
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo liebe Gemeinde,

vielleicht könnt Ihr mir bei der Fehlersuche helfen. Tabelle ist im Anhang.
Eigentlich soll diese Tabelle ganz simpel Daten sortieren. Auf dem Worksheet "PZ_Erfassung" in der Tabelle "Data_Input" werden Projekteinsatzzeiten erfasst und dem jeweiligen Projekt zugeordnet. Das passiert hintereinander für das ganze Jahr. Da ich eine monatliche Meldung abgeben muss, möchte ich automatisch auf 12 Worksheets (Januar-Dezember) die Daten aus "Data_Input" nach Monaten aufgeteilt in die jeweiligen Tabellen (T_Januar, T_Februar usw), welche sich auf den Sheets mit Monatsnamen befinden, umsortieren.

Habt Ihr eine Idee? Vielen Dank schon einmal...

[attachment=50489]

Beim Debuggen stoße ich immer auf diese Zeile, welche anscheinend nicht funktioniert:
Code:
Set wsZiel = ThisWorkbook.ListObjects("T_" & monat)

Hier der gesamte VBA-Code:

Code:
Option Explicit

Sub DatenAufteilen()
    Dim wsQuelle As ListObject
    Dim wsZiel As ListObject
    Dim letzteZeileQuelle As Long
    Dim letzteZeileZiel As Long
    Dim monat As String
    Dim i As Long
    Dim userResponse As VbMsgBoxResult
   
    ' Setze die Quelltabelle (ListObject)
    Set wsQuelle = ThisWorkbook.Sheets("PZ_Erfassung").ListObjects("Data_Input")
   
    ' Finde die letzte Zeile in der Quelltabelle
    letzteZeileQuelle = wsQuelle.ListRows.Count
   
    ' Durchlaufe die Quelltabelle ab Zeile 1 (Annahme, dass die Daten in der ersten Zeile beginnen)
    For i = 2 To letzteZeileQuelle
        ' Ermittle den Monat aus dem Datum in Spalte A
        monat = Format(wsQuelle.ListColumns("Datum").DataBodyRange.Cells(i, 1), "mmmm")
       
        ' Versuche, die Zieltabelle auf dem entsprechenden Arbeitsblatt zu finden
        On Error Resume Next
        Set wsZiel = ThisWorkbook.ListObjects("T_" & monat)
        On Error GoTo 0
       
        ' Überprüfe, ob die Zieltabelle gefunden wurde
        If Not wsZiel Is Nothing Then
            ' Finde die letzte Zeile in der Zieltabelle
            letzteZeileZiel = wsZiel.ListRows.Count + 1
           
            ' Kopiere die Daten von der Quelltabelle zur Zieltabelle
            wsQuelle.ListRows(i).Range.Copy wsZiel.ListRows.Add.Range
        Else
            ' Frage den Benutzer nach Aktion (OK für Weiter, Abbrechen zum Beenden)
            userResponse = MsgBox("Tabelle für " & monat & " nicht gefunden!", vbExclamation + vbOKCancel, "Fehler")
           
            ' Überprüfe die Benutzerantwort
            If userResponse = vbCancel Then Exit For
        End If
    Next i
End Sub
Code:
falsch: ThisWorkbook.ListObjects("T_" & monat)

richtig: ThisWorkbook.Worksheets("T_" & monat).ListObjects(1)

Das Listobject ist ein Objekt des Arbeitsblattes und nicht der Mappe.
Stammt der Code von ChatGPT oder dergleichen? Der Code ist nicht wirklich für intelligente Tabellen geschrieben.
Die intelligenten Tabellen haben schon leere Zeilen. Das passt nicht mit den hinzufügen von neuen Zeilen zusammen.
Hallo,

Code:
falsch: ThisWorkbook.ListObjects("T_" & monat)

fast richtig: ThisWorkbook.Worksheets("T_" & monat).ListObjects(1)

richtig: ThisWorkbook.Worksheets(monat).ListObjects(1)

Gruß, Uwe
Hallo,

oder


Code:
ThisWorkbook.Worksheets(monat).ListObjects("T_"&monat)
Hallo Candalfo,

mit dem richtigen Excel-Tool ist diese Aufgabenstellung easy-peasy: Power-Query
- kein Vba
- keine Excel-Formeln
- nur ein bißchen 'New Technology'

Gruß von Luschi
aus klein-Paris
@Ralph, Kuwer, Ego

Listobject ist ein Workbook Object (schau mal den Name Manager).

Code:
Sub M_snb()
    [Data_Input[#All]].Select
End Sub

Nur ein Bißchen 'Old' technology reicht aus.
PZ_Erfassung. Zelle P3
Hi,

zunächst einmal sind leere Zeilen in einer intelligenten Tabelle nicht sinnvoll. Denn eine solche Tabelle erweitert sich automatisch und man braucht keine Zeilen auf Vorrat. Dadurch vereinfachen sich auch die Formeln in der Tabelle, da man nicht prüfen muss, ob Werte vorhanden sind.

Dann braucht man keine 12 Monatsblätter, sondern nur ein einziges, auf dem man den Monat auswählt und das sich die Daten dann per Formel aus dem Blatt PZ_Erfassung holt. Damit braucht man auch keine Makros mehr.

Ich habe dir das mal eingebaut...
Hallo alle zusammen,

zuerst einmal vielen Dank für Eure ausführlichen Hilfestellungen. Mit dem VBA-Code klappt es jetzt, jedoch kommen die Daten bei mehreren Durchläufen des Scriptes doppelt und mehrfach. Auch werden die Formeln aus DataInput mit kopiert. Ich sehe, da ist noch einiges für mich zu tun.
Ich bin jedoch stark begeistert von Helmuts Idee über den Filter, da ich VBA nach Möglichkeit vermeiden möchte. Diese Funktion werde ich mir noch etwas genauer ansehen.
Vielen Dank noch einmal und Euch allen einen erfolgreichen Tag Smile
Candalfo
Hallo Helmut,

ich habe noch eine Nachfrage. Ich habe Deinen Vorschlag nachgebaut, jedoch ohne Dropdown. Es soll bei den 12 Tabellenblättern bleiben, den Filter setze ich statisch auf jedem Tabellenblatt. Aus meiner Sicht ändert sich an Deiner Formel nichts, trotzdem zeigt er mir einen Überlauf an. Was mache ich falsch?

[attachment=50493]

Viele Grüße
Candalfo
Hi,

rechts und unterhalb von A4 darf keine weitere Zelle irgendeinen Inhalt haben.
FILTER() ist eine dynamische Array-Formel und braucht daher genügen Platz um ihre Ergebnisse anzuzeigen.

Wenn du unbedingt für jeden Monat ein eigenes Blatt haben willst: nur zu. Aber komm dann bitte nicht mir "Ich möchte ein Inhaltsverzeichnis um die vielen Blätter übersichtlich zu haben" oder "wie kann ich in 12 Blättern gleichzeitig eine bedingte Formatierung einfügen" oder "Wie summiere ich wahlweise B3, B4 oder C9 aus den Blättern Januar, bis Dezember". Oder anders ausgedrückt: es ist wesentlich einfacher nur 1 Blatt zu pflegen anstatt 12 Blätter.
Wie gesagt: deine Entscheidung, aber sei gewarnt, dass du auch damit leben musst.

Ich persönlich würde noch weiter gehen und auf jegliche Monatsblätter verzichten. Statt essen würde ich einfach nur den Autofilter in PZ_Erfassung verwenden.
Seiten: 1 2