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

Forumthread: Objekt erforderlich

Objekt erforderlich
19.06.2017 10:57:14
Catha1996
Hallo liebe Forumsmitglieder,
ich habe folgenden Code, der eine Masterdatei nach Werten in Spalte F splitten soll, sodass mehrere kleine Excel-Dateien entstehen:
Sub LB_splitten()
Dim v As Object
Dim D As Object
Dim i As Long
Dim vFileToOpen As Variant
Dim Tool As Workbook
Dim GesÜbersicht As Worksheet
Dim ActBook As Workbook
Dim CurrentFile As String
Dim NewFileType As String
Dim NewFile As String
Application.ScreenUpdating = False
vFileToOpen = Application.GetOpenFilename("Excel Files (*.xls*), *.xls*", , , , True)
If Not IsArray(vFileToOpen) Then Exit Sub
Set Tool = ActiveWorkbook
Set GesÜbersicht = ActiveWorkbook.Worksheets.Item(1)
CurrentFile = ActiveWorkbook.FullName
NewFileType = "Excel Files 1997-2016 (*.xls), *.xls," & _
"Excel Files 2007 (*.xlsx), *.xlsx," & _
"All files (*.*), *.*"
Set D = CreateObject("scripting.dictionary")
With GesÜbersicht
With .Range(Cells(1, 1), Cells(Rows.Count, 17)).CurrentRegion
For Each v In .Columns(6).Offset(1).Value
If v  "" Then D(v) = 0
Next
For Each v In D.Keys
For i = Cells(Rows.Count, 6).End(xlUp).Row To 1 Step -1
If Cells(i, 6)  v Then Rows(i).Delete
Next i
NewFile = Application.GetSaveAsFilename( _
InitialFileName:=v, _
fileFilter:=NewFileType)
ActiveWorkbook.SaveAs Filename:=NewFile, _
FileFormat:=xlNormal, _
Password:="", _
WriteResPassword:="", _
ReadOnlyRecommended:=False, _
CreateBackup:=False
Set ActBook = ActiveWorkbook
Workbooks.Open CurrentFile
ActBook.Close
Next v
End With
End With
End Sub

In der Zeile
For Each v In .Columns(6).Offset(1).Value

wird mir allerdings angezeigt "Laufzeitfehler '424': Objekt erforderlich" und der Debugger zeigt an, dass v = 0 ist. Komischerweise habe ich diesen kompletten Absatz und auch die Deklarierung aus einem anderen Code übernommen, der ohne Probleme durchläuft.
Weiß jemand Rat?
Liebe Grüße
Catha
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Objekt erforderlich
19.06.2017 11:35:05
Luschi
Hallo Catha,
For Each-Schleifen durchlaufen Excel-Objekte (hier Zellen), .Columns(6).Offset(1).Value liefert aber nur
die Werte des zu durchlaufenden Zellbereiches zurücvk und kann so überhapt nicht funktionieren.
Sicher ist das andere Projekt mit On Error-Anweisungen zugepflastert und der auch dort auftretende Fehler wird stillschweigend ignoriert.
Gruß von Luschi
aus klein-Paris
Anzeige
Leider immer noch fehlerbehaftet
20.06.2017 12:40:02
Catha1996
Danke an euch beide!
Allerdings beinhaltet mein anderer Code keine On Error-Anweisungen...
Sub WB_Planung_splitten()
' Tastenkombination: Strg+w
Dim v, D As Object, wb As Workbook
Application.ScreenUpdating = False
Set D = CreateObject("scripting.dictionary")
With Tabelle1
With .Range("A1:R1200").CurrentRegion
For Each v In .Columns(5).Offset(1).Value
If v  "" Then D(v) = 0
Next
For Each v In D.Keys
.AutoFilter 5, v
If .Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then
Set wb = Workbooks.Add(xlWBATWorksheet)
.SpecialCells(xlCellTypeVisible).Copy
wb.Worksheets(1).Cells(1).PasteSpecial Paste:=xlPasteAll
wb.Worksheets(1).Cells(1).PasteSpecial Paste:=xlPasteColumnWidths
wb.Worksheets(1).Cells(1).PasteSpecial Paste:=xlPasteValues
wb.Worksheets(1).Cells(1).PasteSpecial Paste:=xlPasteFormulas
With wb.Sheets(1)
.Name = v
.Cells.Font.Name = "Arial"
.Cells.Font.Size = 8
.Range("K2:O50").Locked = False
.Range("Q:Q").Locked = False
.Protect "wb"
End With
wb.SaveAs .Parent.Parent.Path & "\FK Tools" & "\" & v & ".xlsx", xlOpenXMLWorkbook
wb.Close False
End If
Next
.AutoFilter
End With
End With
MsgBox "Finished!"
End Sub
Und .Value weglassen bringt mich leider auch nicht wirklich weiter, da dann der gleiche Fehler zwei Zeilen weiter unten im Code auftritt.
Habt ihr noch andere Ideen woran es liegen könnte?
Gruß Catha
Anzeige
AW: Leider immer noch fehlerbehaftet
20.06.2017 16:30:04
mmat
Hallo
.value einfach weglassen hilft nicht weiter, due willst ja verarbeiten, was da drinne steht.
Das .value muß in die nächste Zeile wandern:
If v.value "" Then D(v.value) = 0
Das gilt nätürlich überall. V ist ein Objekt, aber arbeiten tutst du mit der .value Eigenschaft desselbigen.
vg, MM
Anzeige
Das hatte ich nach Luschis Erläuterung ...
20.06.2017 19:37:15
Luc:-?
…vorausgesetzt, denn v referenziert ja nun auf das Objekt, das diese Eigenschaft hat!
Luc :-?
Danke!
21.06.2017 08:34:00
Catha1996
Vielen Dank, jetzt bin ich schon mal einen Schritt weiter :)
VG Catha
Danke!
21.06.2017 10:04:50
Catha1996
Vielen Dank, jetzt bin ich schon mal einen Schritt weiter :)
VG Catha
Anzeige
AW: Objekt erforderlich
21.06.2017 12:11:44
Catha1996
Hallo nochmal,
ich muss leider weiter nerven...
Ich habe den Code jetzt entsprechend geändert:
Sub LB_splitten()
Dim v As Object
Dim D As Object
Dim i As Long
Dim GesÜbersicht As Worksheet
Dim ActBook As Workbook
Dim CurrentFile As String
Dim NewFileType As String
Dim NewFile As String
Application.ScreenUpdating = False
Set GesÜbersicht = ThisWorkbook.Worksheets.Item(1)
CurrentFile = ThisWorkbook.FullName
NewFileType = "Excel Files 1997-2016 (*.xls), *.xls," & _
"Excel Files 2007 (*.xlsx), *.xlsx," & _
"All files (*.*), *.*"
Set D = CreateObject("scripting.dictionary")
With GesÜbersicht
With .Range(Cells(1, 1), Cells(Rows.Count, 17)).CurrentRegion
For Each v In .Columns(6).Offset(1)
If v.Value  "" Then D(v.Value) = 0
Next v
For Each v In D.Keys
For i = Cells(Rows.Count, 6).End(xlUp).Row To 1 Step -1
If Cells(i, 6)  v Then Rows(i).Delete
Next i
NewFile = Application.GetSaveAsFilename( _
InitialFileName:=v, _
fileFilter:=NewFileType)
ActiveWorkbook.SaveAs Filename:=NewFile, _
FileFormat:=xlNormal, _
Password:="Era", _
WriteResPassword:="", _
ReadOnlyRecommended:=False, _
CreateBackup:=False
Set ActBook = ActiveWorkbook
Workbooks.Open CurrentFile
ActBook.Close
Next v
End With
End With
End Sub
Jetzt wird mir in der Zeile
 For Each v In D.Keys
wieder angezeigt "Objekt erforderlich" und wenn ich mit dem Cursor auf das v gehe, egal in welcher Zeile, steht überall "v = Nothing". Ich kann mir das nicht erklären, da die Tabelle gefüllt ist.
Ich hoffe jemand von euch kann mir nochmal helfen.
Gruß Catha
Anzeige
AW: Objekt erforderlich
21.06.2017 17:54:17
Luschi
Hallo Catha,
schau mal hier: https://excelmacromastery.com/vba-dictionary/

Dim key As Variant
For Each key In dict.Keys
Debug.Print key, dict(key)
Next key

Gruß von Luschi
aus klein-Paris
AW: Objekt erforderlich
22.06.2017 11:31:15
Catha1996
Hallo Luschi,
vielen Dank! Den Fehler hab ich jetzt auch ausgebügelt. Allerdings passiert jetzt gar nichts, wenn ich den Code ausführe :D
Sub LB_splitten()
Dim v As Variant
Dim D As Object
Dim i As Long
Dim GesÜbersicht As Worksheet
Dim ActBook As Workbook
Dim CurrentFile As String
Dim NewFileType As String
Dim NewFile As String
Application.ScreenUpdating = False
Set GesÜbersicht = ThisWorkbook.Worksheets.Item(1)
CurrentFile = ThisWorkbook.FullName
NewFileType = "Excel Files 1997-2016 (*.xls), *.xls," & _
"Excel Files 2007 (*.xlsx), *.xlsx," & _
"All files (*.*), *.*"
Set D = CreateObject("scripting.dictionary")
With GesÜbersicht
With .Range(Cells(1, 1), Cells(Rows.Count, 17)).CurrentRegion
For Each v In .Columns(6).Offset(1)
If v.Value  "" Then D(v.Value) = 0
Next v
For Each v In D.Keys
Debug.Print v, D(v)
For i = Cells(Rows.Count, 6).End(xlUp).Row To 1 Step -1
If Cells(i, 6)  v Then Rows(i).Delete
Next i
NewFile = Application.GetSaveAsFilename( _
InitialFileName:=v, _
fileFilter:=NewFileType)
ActiveWorkbook.SaveAs Filename:=NewFile, _
FileFormat:=xlNormal, _
Password:="Era", _
WriteResPassword:="", _
ReadOnlyRecommended:=False, _
CreateBackup:=False
Set ActBook = ActiveWorkbook
Workbooks.Open CurrentFile
ActBook.Close
Next v
End With
End With
End Sub
Hab ich den Code überhaupt richtig geändert?
LG Catha
Anzeige
;
Anzeige

Infobox / Tutorial

Objekt erforderlich – Fehlerbehebung in VBA


Schritt-für-Schritt-Anleitung

Um den Laufzeitfehler "Objekt erforderlich" in Deinem VBA-Code zu beheben, folge dieser Schritt-für-Schritt-Anleitung:

  1. Code anpassen: Stelle sicher, dass die Zuweisung für die Variable v korrekt ist. In der Zeile, die den Fehler verursacht, sollte For Each v In .Columns(6).Offset(1) verwendet werden, ohne .Value.

    Ändere dies zu:

    For Each v In .Columns(6).Offset(1)
  2. Wertüberprüfung: Überprüfe den Inhalt von v mit der .Value-Eigenschaft:

    If v.Value <> "" Then D(v.Value) = 0
  3. Dictionary benutzen: Verwende ein Dictionary, um die Werte zu speichern. Achte darauf, dass die Keys im Dictionary korrekt gesetzt sind.

  4. Speichern der neuen Arbeitsmappe: Stelle sicher, dass der Code zum Speichern der neuen Datei korrekt ist, und übergebe den richtigen Dateinamen:

    NewFile = Application.GetSaveAsFilename(InitialFileName:=v, fileFilter:=NewFileType)
  5. Debugging: Nutze Debug.Print, um den Wert von v und den Status des Dictionaries während der Ausführung zu überprüfen:

    Debug.Print v, D(v)

Häufige Fehler und Lösungen

  • Laufzeitfehler '424': Objekt erforderlich: Dies geschieht häufig, wenn Du versuchst, auf eine Eigenschaft eines Objekts zuzugreifen, das nicht existiert oder nicht korrekt referenziert ist. Achte darauf, dass die Objektvariablen korrekt gesetzt sind.

  • Variable v bleibt auf Nothing: Wenn v nicht korrekt gesetzt wird, kann es sein, dass die Zellen in Spalte F leer sind oder die Range nicht richtig definiert ist. Überprüfe, ob die Zellen tatsächlich Werte enthalten.

  • Fehler beim Speichern: Wenn beim Speichern der Datei ein Fehler auftritt, stelle sicher, dass der Dateiname gültig ist und Du Schreibrechte im entsprechenden Verzeichnis hast.


Alternative Methoden

Falls die oben genannten Schritte nicht helfen, kannst Du folgende alternative Methoden ausprobieren:

  1. Verwendung von Arrays: Statt ein Dictionary zu verwenden, kannst Du die Werte in ein Array laden und dann iterieren. Dies kann die Performance verbessern und die Fehleranfälligkeit reduzieren.

  2. Filtermethode: Nutze die AutoFilter-Methode, um die Daten vor dem Exportieren zu filtern. Dies kann die Notwendigkeit verringern, mit .Delete-Operationen zu arbeiten.

  3. Debugging-Tools: Verwende die integrierte Debugging-Funktion in VBA, um Schritt für Schritt durch den Code zu gehen und die Werte der Variablen zu überprüfen.


Praktische Beispiele

Hier ist ein Beispiel, wie der Code aussehen könnte, nachdem die Änderungen vorgenommen wurden:

Sub LB_splitten()
    Dim v As Variant
    Dim D As Object
    Dim i As Long
    Dim GesÜbersicht As Worksheet
    Dim ActBook As Workbook
    Dim CurrentFile As String
    Dim NewFileType As String
    Dim NewFile As String
    Application.ScreenUpdating = False

    Set GesÜbersicht = ThisWorkbook.Worksheets.Item(1)
    CurrentFile = ThisWorkbook.FullName
    NewFileType = "Excel Files 1997-2016 (*.xls), *.xls," & _
                  "Excel Files 2007 (*.xlsx), *.xlsx," & _
                  "All files (*.*), *.*"
    Set D = CreateObject("scripting.dictionary")

    With GesÜbersicht
        With .Range(Cells(1, 1), Cells(Rows.Count, 17)).CurrentRegion
            For Each v In .Columns(6).Offset(1)
                If v.Value <> "" Then D(v.Value) = 0
            Next v
            For Each v In D.Keys
                Debug.Print v, D(v)
                For i = Cells(Rows.Count, 6).End(xlUp).Row To 1 Step -1
                    If Cells(i, 6) <> v Then Rows(i).Delete
                Next i
                NewFile = Application.GetSaveAsFilename(InitialFileName:=v, fileFilter:=NewFileType)
                ActiveWorkbook.SaveAs Filename:=NewFile, FileFormat:=xlNormal
                Set ActBook = ActiveWorkbook
                Workbooks.Open CurrentFile
                ActBook.Close
            Next v
        End With
    End With
End Sub

Tipps für Profis

  • On Error-Anweisungen: Füge On Error Resume Next ein, um Fehler zu ignorieren, die nicht kritisch sind. Dies kann Dir helfen, den Code robuster zu machen.

  • Code modularisieren: Teile den Code in kleinere, wiederverwendbare Funktionen auf. Dies erleichtert das Testen und die Fehlersuche.

  • Verwendung von Named Ranges: Statt direkter Zellreferenzen zu verwenden, nutze benannte Bereiche, um die Lesbarkeit des Codes zu verbessern.


FAQ: Häufige Fragen

1. Warum erhalte ich "Objekt erforderlich"? Dies bedeutet, dass Du versuchst, auf eine Eigenschaft eines Objekts zuzugreifen, das nicht existiert. Überprüfe, ob die Variable korrekt initialisiert wurde.

2. Wie kann ich den Code debuggen? Verwende Debug.Print um den Wert von Variablen während der Ausführung zu überprüfen. Du kannst auch Haltepunkte setzen, um den Code schrittweise auszuführen.

3. Was kann ich tun, wenn der Code nicht funktioniert? Stelle sicher, dass alle Referenzen korrekt sind und die Daten in den Zellen vorhanden sind. Überprüfe die Logik des Codes und führe Debugging durch.

4. Wie kann ich meine Excel-Dateien sicher speichern? Verwende die SaveAs-Methode, um sicherzustellen, dass die Dateien im gewünschten Format und Verzeichnis gespeichert werden. Achte darauf, dass der Dateiname gültig ist.

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