Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Laufzeitfehler '424': Objekt erforderlich

Laufzeitfehler '424': Objekt erforderlich
24.08.2016 11:35:07
Leonida
Liebes Forum,
ich habe eine Excel-Tabelle mit Daten im ersten Tabellenblatt (die Datei hat mehrere Blätter) von A1:V507, die ich gerne durch einen Autofilter in Spalte F nach den Werten, die sich dort befinden, in einzelne Dateien splitten würde.
Das Tabellenblatt "Gesamtübersicht" besteht aus Datensätzen von Mitarbeitern und in Spalte F befindet sich die Führungskraft. Diese sollen den einzelnen Führungskräften geschickt werden.
Das an sich ist erstmal nicht so kompliziert, allerdings gibt es noch einige Schwierigkeiten in dieser Datei. Die Datensätze befinden sich in A1:V480 und von A481:V507 befindet sich eine zusätzliche Tabelle mit Formeln, die in jeder gesplitteten Datei vorhanden sein muss.
1. Die Spalten Q:V sollen komplett ausgeblendet werden, sich aber noch in den neuen Dateien befinden, da dort nicht sichtbare Formeln hinterlegt sein sollen. Dasselbe gilt für die Zeilen 482:494 und 496:507.
2. Die Liste wird nach den Führungskräften, also Werten in Spalte F, aufgeteilt, wobei sich zusätzlich der Bereich A481:V507 in jeder Datei befinden muss.
3. Alle Zellen außer K4:N(Zähle die Zeilen) sollen mit einem Passwort gesperrt sein.
4. Die Dateien sollen unter dem gleichen Pfad & "/" & "FK Tools" unter dem Namen der jeweiligen Führungskraft gespeichert werden.
Für mich als VBA-Anfänger war es gerade so möglich einen so speziellen Code zu schreiben, allerdings bin ich nicht sicher, ob er mich zum Ziel bringt.
Sub LB_Liste_splitten2()
Dim D As Object
Dim lz As Long
Dim v As Object
Dim wb As Workbook
Dim lng As Long
Dim line As Long
Application.ScreenUpdating = False
Set D = CreateObject("scripting.dictionary")
With Tabelle1
With .Range("A1:V507").CurrentRegion
lz = Cells(Rows.Count, 6).End(xlUp).Row
For Each v In Range("A4:V" & lz).Offset(1).Value
If v  "" Then D(v) = 0
Next
For Each v In D.Keys
Set wb = Workbooks.Add(xlWBATWorksheet)
lng = Cells(Rows.Count, 10).End(xlUp).Row
Sheets("Gesamtübersicht").Range("A1:P" & lng).Copy
wb.Worksheets(1).Cells(1).PasteSpecial Paste:=xlPasteAll
wb.Worksheets(1).Cells(1).PasteSpecial Paste:=xlPasteColumnWidths
wb.Worksheets(1).Cells(1).PasteSpecial Paste:=xlPasteFormulas
With wb.Sheets(1)
line = Cells(Rows.Count, 1).End(xlUp).Row
.Range("A4:V" & line).AutoFilter 6, v
If .Range("F4:F" & lz).Cells.Value  v Then _
EntireRow.Delete
.Range("K2:N" & line).Locked = False
.Protect "Era"
.AutoFilter
End With
wb.SaveAs ActiveWorksheet.Parent.Parent.Path & "\FK Tools" & "\" & v & ".xlsx",  _
xlOpenXMLWorkbook
wb.Close False
Next
End With
End With
MsgBox "Finished!"
End Sub

Ich kann es leider auch nicht ausprobieren, da in folgender Zeile der "Laufzeitfehler '424': Objekt erforderlich" angezeigt wird:
For Each v In Range("A4:V" & lz).Offset(1).Value

Komischerweise habe ich einen ähnlichen Code für ein anderes Projekt, in dem die Zeilen bis zum Laufzeitfehler aber komplett identisch sind und der Code läuft einwandfrei. Warum dieser es nicht tut, bleibt mir ein Rätsel.
Ich habe mein Problem zwar schon in einer Antwort auf einen anderen Beitrag geschildert, habe darauf aber leider keine Antwort bekommen. Deshalb hoffe ich, dass mir jetzt eventuell jemand helfen kann.
Gruß Leonida
P.S.: Hier ist eine Beispiel-Datei, wie meine Datei aussieht.
https://www.herber.de/bbs/user/107774.xlsx
Anzeige

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufzeitfehler '424': Objekt erforderlich
24.08.2016 12:08:35
Nepumuk
Hallo,
so:
For Each v In Range("A4:V" & lz).Offset(1)
Warum eigentlich OffSet(1) fang doch einfach in Zeile 5 an.
Gruß
Nepumuk
AW: Laufzeitfehler '424': Objekt erforderlich
24.08.2016 12:12:52
Rudi
Hallo,
lass .Value weg.
Gruß
Rudi
AW: Laufzeitfehler '424': Objekt erforderlich
24.08.2016 12:22:23
Leonida
Hallo Rudi, hallo Nepumuk,
vielen Dank für die schnellen Antworten!
Ich habe eure Tipps ausprobiert, allerdings läuft der Code immer noch nicht und folgende Zeile wird mit der gleichen Fehlermeldung angezeigt:
For Each v In D.Keys
Wenn ihr mir dabei noch einmal helfen könntet, würde ich mich sehr freuen.
Gruß
Leonida
Anzeige
AW: Laufzeitfehler '424': Objekt erforderlich
24.08.2016 12:30:19
Rudi
Hallo,
dann ist D wohl leer.
Kleine Ergänzung:
      For Each v In Range("A4:V" & lz).Offset(1)
If v  "" Then D(v.Value) = 0
Next
Gruß
Rudi
AW: Laufzeitfehler '424': Objekt erforderlich
24.08.2016 12:55:45
Leonida
Hallo,
ich hab den Code jetzt entsprechend geändert, allerdings liegt immer noch der Fehler in der genannten Zeile. Wenn ich die Zeile anklicke, wird mir angezeigt "v = Nothing".
Bedeutet das, dass v leer ist? Dann weiß ich nämlich überhaupt nicht mehr, was ich tun muss :D
Gruß
Leonida
Anzeige
AW: Laufzeitfehler '424': Objekt erforderlich
24.08.2016 12:56:21
Leonida
Hallo,
ich hab den Code jetzt entsprechend geändert, allerdings liegt immer noch der Fehler in der genannten Zeile. Wenn ich die Zeile anklicke, wird mir angezeigt "v = Nothing".
Bedeutet das, dass v leer ist? Dann weiß ich nämlich überhaupt nicht mehr, was ich tun muss :D
Gruß
Leonida
Anzeige
AW: Laufzeitfehler '424': Objekt erforderlich
24.08.2016 13:57:10
Nepumuk
Hallo,
du hast die Variable v als Object deklariert um die Keys des Dictionarys zu durchlaufen benötigst du eine Variable die als Variant deklariert ist.
Gruß
Nepumuk
AW: Laufzeitfehler '424': Objekt erforderlich
24.08.2016 14:37:54
Leonida
Vielen Dank für die Hilfe, allerdings laufe ich von einem Fehler zum nächsten. Sobald ich einen Fehler korrigiert habe, taucht ein neuer auf und ich bin mir nicht sicher, ob dieser Code überhaupt am Ende das tut, was ich will...
Ich habe jetzt in der Zeile
If .Cells("F4:F" & lz).Value  v Then _

einen Laufzeitfehler '1004': Anwendungs- oder objektdefinierter Fehler.
Nachdem ich eure Ratschläge befolgt habe, sieht der aktuelle Code so aus:
Sub LB_Liste_splitten2()
Dim D As Object
Dim lz As Long
Dim v As Variant
Dim wb As Workbook
Dim lng As Long
Dim line As Long
Application.ScreenUpdating = False
Set D = CreateObject("scripting.dictionary")
With Tabelle1
With .Range("A1:V507").CurrentRegion
lz = Cells(Rows.Count, 6).End(xlUp).Row
For Each v In Range("A4:V" & lz)
If v  "" Then D(v.Value) = 0
Next
For Each v In D.Keys
Set wb = Workbooks.Add(xlWBATWorksheet)
lng = Cells(Rows.Count, 10).End(xlUp).Row
.Range("A1:P" & lng).Copy
wb.Worksheets(1).Cells(1).PasteSpecial Paste:=xlPasteAll
wb.Worksheets(1).Cells(1).PasteSpecial Paste:=xlPasteColumnWidths
wb.Worksheets(1).Cells(1).PasteSpecial Paste:=xlPasteFormulas
With wb.Sheets(1)
line = Cells(Rows.Count, 1).End(xlUp).Row
.Range("A4:V" & line).AutoFilter 6, v
If .Cells("F4:F" & lz).Value  v Then _
EntireRow.Delete
.Range("K2:N" & line).Locked = False
.Protect "Era"
.AutoFilter
End With
wb.SaveAs ActiveWorksheet.Parent.Parent.Path & "\FK Tools" & "\" & v & ".xlsx",  _
xlOpenXMLWorkbook
wb.Close False
Next
End With
End With
MsgBox "Finished!"
End Sub
Falls ihr noch Lust und Geduld habt, euch mit meinem Problem auseinander zu setzen, freue ich mich sehr. Ich könnte es allerdings verstehen, wenn dieses Projekt mittlerweile keinen Spaß mehr macht...
Gruß
Leonida
Anzeige
AW: Laufzeitfehler '424': Objekt erforderlich
24.08.2016 14:42:02
Nepumuk
Hallo,
Cells("F4:F" & lz) ist Unsinn denn das Cells-Objekt kann nur eine einzelne Zelle umfassen. Zudem kannst du einen Bereich nicht mit einem einzelnen Wert vergleichen.
Wenn ich wüsste was du genau vor hast, wäre es einfacher zu helfen. Deine leere Tabelle die du hochgeladen hast ist nicht wirklich hilfreich.
Gruß
Nepmuk
Anzeige
AW: Laufzeitfehler '424': Objekt erforderlich
24.08.2016 14:56:35
Leonida
Hallo Nepumuk,
ich kann leider aus Datenschutzgründen nicht mehr aus der Tabelle preisgeben, als du dort siehst. Die Personendaten stehen zwischen Zeile 3 und Zeile 481 mit ca. 80 verschiedenen Führungskräften.
Zum Ablauf: Ich habe überlegt, wie ich es hinbekomme, dass ich die Masterdatei mit allen Mitarbeitern splitten kann und als Tools an die einzelnen Führungskräfte schicken kann, wobei eben die Überschriften in Zeile 1-3 komplett übernommen werden sollen, aber auch die Zellen und Formeln ab Zeile 481. Die Spalten Q bis T müssten auch überall enthalten sein, allerdings ausgeblendet. Also soll quasi nur der Bereich A1:T480 gefiltert werden und für jedes Filterergebnis eine Datei erstellt werden. Das Problem ist, dass immer wieder neue Führungskräfte dazukommen können oder welche wegfallen. Deshalb kann ich den Vorgang nicht per Makro aufnehmen, weil die Prozedur sonst abhängig von den Namen der Führungskräfte wäre.
Ich hoffe das ist jetzt verständlich formuliert...
Gruß
Leonida
Anzeige
AW: Laufzeitfehler '424': Objekt erforderlich
24.08.2016 16:59:08
Nepumuk
Hallo,
teste mal:
Option Explicit

Public Sub LB_Liste_splitten2()
    
    Dim objCell As Range
    Dim objWorkbook As Workbook
    Dim objDictionary As Object
    Dim avntValues As Variant, vntKey As Variant
    
    With Application
        .Calculation = xlCalculationManual
        .EnableEvents = False
        .ScreenUpdating = False
    End With
    
    Set objDictionary = CreateObject("Scripting.Dictionary")
    
    With Tabelle1
        
        avntValues = .Range(.Cells(4, 6), .Cells(.Rows.Count, 6).End(xlUp)).Value2
        
        For Each vntKey In avntValues
            
            objDictionary(vntKey) = vbNullString
            
        Next
        
        For Each vntKey In objDictionary.Keys
            
            If Trim$(vntKey) <> vbNullString Then
                
                Set objWorkbook = Workbooks.Add(xlWBATWorksheet)
                
                Call .Rows(3).AutoFilter(Field:=6, Criteria1:=vntKey)
                
                Call .Range(.Cells(1, 1), .Cells(600, 16)).Copy
                
                With objWorkbook.Worksheets(1)
                    
                    Call .Cells(1).PasteSpecial(Paste:=xlPasteColumnWidths)
                    Call .Cells(1).PasteSpecial(Paste:=xlPasteAll)
                    
                    .Range(.Cells(4, 11), .Cells(.Cells( _
                        .Rows.Count, 6).End(xlUp).Row, 14)).Locked = False
                    
                    .Cells(3, 1).Select
                    
                    Call .Protect(Password:="Era")
                    
                End With
                
                Call objWorkbook.SaveAs(Filename:=ThisWorkbook.Path & "\FK Tools\" & _
                    vntKey, FileFormat:=xlOpenXMLWorkbook)
                Call objWorkbook.Close
                
                Set objWorkbook = Nothing
                
            End If
        Next
        
        Call .ShowAllData
        
    End With
    
    Set objDictionary = Nothing
    
    With Application
        .CutCopyMode = False
        .Calculation = xlCalculationAutomatic
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub

Gruß
Nepumuk
Anzeige
AW: Laufzeitfehler '424': Objekt erforderlich
25.08.2016 08:42:29
Leonida
Vielen Dank Nepumuk, dass du dir die Mühe gemacht hast!
Allerdings habe ich in der Zeile
Call .Rows(3).AutoFilter(Field:=6, Criteria1:=vntKey)
wieder einen Anwendungs- oder objektdefinierten Fehler...
Gruß Leonida
AW: Laufzeitfehler '424': Objekt erforderlich
25.08.2016 08:52:59
Leonida
Bzw. wenn ich den Code mehrmals durchlaufen lasse, wird manchmal auch angezeigt "Die Autofiltermethode des Rangeobjekts konnte nicht ausgeführt werden".
Anzeige
AW: Laufzeitfehler '424': Objekt erforderlich
25.08.2016 09:03:34
Leonida
Bzw. wenn ich den Code mehrmals durchlaufen lasse, wird manchmal auch in der selben Zeile angezeigt "Die Autofiltermethode des Rangeobjekts konnte nicht ausgeführt werden".
AW: Laufzeitfehler '424': Objekt erforderlich
25.08.2016 10:34:30
Nepumuk
Hallo,
ich hab es mit deiner Mustermappe getestet, da gab es keine Fehlermeldung, aber ich hab nur Excel 2013. Was nun?
Gruß
Nepumuk
Anzeige
AW: Laufzeitfehler '424': Objekt erforderlich
25.08.2016 10:47:20
Leonida
Hallo Nepumuk,
ich danke dir wirklich für deine Mühe, aber ich denke, dass wir aufgrund der Beachtung des Datenschutzes so leider nicht weiterkommen. Dann muss mein Chef ggf. jemanden mit der Programmierung beauftragen :D
Trotzdem vielen Dank für deine Arbeit!
LG Leonida
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Laufzeitfehler '424': Objekt erforderlich in Excel VBA beheben


Schritt-für-Schritt-Anleitung

  1. Überprüfe die Range-Definition: In deinem Code steht:

    For Each v In Range("A4:V" & lz).Offset(1).Value

    Ändere dies in:

    For Each v In Range("A4:V" & lz).Offset(1)

    Dadurch wird der Offset korrekt angewendet, ohne die .Value-Eigenschaft, was den Laufzeitfehler '424' vermeiden sollte.

  2. Deklariere die Variablen korrekt: Stelle sicher, dass die Variable v als Variant deklariert ist, um den Datentyp flexibel zu halten:

    Dim v As Variant
  3. Überprüfe das Dictionary: Wenn der Fehler in der Zeile For Each v In D.Keys auftritt, könnte das bedeuten, dass D leer ist. Stelle sicher, dass die Werte korrekt in das Dictionary eingefügt werden. Verwende:

    If v <> "" Then D(v.Value) = 0
  4. Korrekte Zelladressierung: Stelle sicher, dass du die richtige Adressierung der Zellen verwendest. Cells("F4:F" & lz) ist ungültig. Stattdessen solltest du folgendes verwenden:

    If .Cells(line, 6).Value <> v Then _
  5. Testen: Führe den Code Schritt für Schritt im Debugger aus, um den genauen Punkt des Fehlers zu identifizieren.


Häufige Fehler und Lösungen

  • Laufzeitfehler '424': Objekt erforderlich:

    • Ursache: Eine nicht definierte oder nicht zugewiesene Variable.
    • Lösung: Überprüfe, ob alle Objekte und Variablen ordnungsgemäß deklariert und initialisiert sind.
  • Laufzeitfehler '1004': Anwendungs- oder objektdefinierter Fehler:

    • Ursache: Fehlerhafte Referenzierung von Zellen oder Bereichen.
    • Lösung: Stelle sicher, dass du die richtige Syntax verwendest, wie oben beschrieben.

Alternative Methoden

  • Verwendung von Arrays: Anstatt ein Dictionary zu verwenden, kannst du auch ein Array verwenden, um die einzigartigen Werte in Spalte F zu speichern. Dies kann in manchen Fällen einfacher sein.

  • Autofilter direkt anwenden: Du kannst den Autofilter direkt auf die gesamte Tabelle anwenden und dann die Sichtbarkeit der Zeilen steuern, anstatt sie zu löschen.

.Range("A1:V" & lz).AutoFilter Field:=6, Criteria1:=v

Praktische Beispiele

Hier ist ein Beispiel, wie du ein einfaches VBA-Skript zur Filterung und zum Speichern von Daten verwenden kannst:

Sub BeispielFilter()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Gesamtübersicht")

    ws.Range("A1:V507").AutoFilter Field:=6, Criteria1:="Führungskraft"
    ' Weitere Aktionen hier
End Sub

Tipps für Profis

  • Fehlerbehandlung einfügen: Verwende On Error Resume Next und On Error GoTo 0, um potenzielle Fehler abzufangen und zu behandeln.

  • Verwende Option Explicit: Füge Option Explicit am Anfang deines Codes hinzu, um sicherzustellen, dass alle Variablen deklariert sind. Dies hilft, viele Fehler zu vermeiden.

  • Dokumentiere den Code: Kommentiere deinen Code ausführlich, um die Funktionsweise zu erklären. Dies ist besonders hilfreich, wenn du später Änderungen vornehmen musst.


FAQ: Häufige Fragen

1. Was bedeutet der Laufzeitfehler '424'? Der Fehler tritt auf, wenn ein Objekt benötigt wird, aber nicht vorhanden ist. Dies kann durch falsch definierte Variablen oder Objekte verursacht werden.

2. Wie kann ich sicherstellen, dass mein VBA-Code korrekt funktioniert? Verwende den Debugger in der VBA-Umgebung, um den Code Schritt für Schritt auszuführen und Fehlerquellen zu identifizieren.

3. Kann ich den Code für verschiedene Excel-Versionen verwenden? Die meisten VBA-Codes funktionieren in den neueren Versionen von Excel, aber einige spezifische Funktionen können je nach Version variieren. Überprüfe die Kompatibilität, wenn du auf ältere Versionen zielst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige