Live-Forum - Die aktuellen Beiträge
Datum
Titel
23.04.2024 14:59:21
23.04.2024 14:47:39
23.04.2024 14:23:45
Anzeige
Archiv - Navigation
1684to1688
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Laufzeitfehler 1004

Laufzeitfehler 1004
15.04.2019 15:54:10
Giorgi
Guten Tag ans Forum,
ich kriege in meinem Makro immer die Fehlermeldung 1004 "Die Methode 'Range' für das Objekt'_Global' fehlgeschlagen.
Ich versuche etwas in einer Geöffneten Arbeitsmappe zu kopieren und dies in einer anderen zu einzufügen.

Dim aZeile As Long
ThisWorkbook.Activate
For aZeile = Range("A1").End(xlDown).Row To 1 Step -1
If IsNumeric(Cells(aZeile, 1)) Then Exit For
Next aZeile
End With
Range("A1:D" & aZeile).Copy
'Dannach wird die andere Mappe geöffnet und die kopierten Daten sollten dann eingefügt werden 

Range("A1:D" & aZeile).Copy
wird mir Gelb makiert.
Wenn ich ein .Range setze erhalte ich immer die Meldung "Fehler beim Kompilieren: Unzulässiger oder nicht ausreichend definierter Verweis"
Hat jemand von Euch einen Lösungsansatz?
Gruß Giorgi

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufzeitfehler 1004
15.04.2019 16:04:00
Daniel
Hi
die einfachste Erklärung dürfte sein, dass deine Tabelle keine Zahlen enthält.
wenn IsNumeric niemals wahr wird, dann läuft die Schleife bis zum Ende durch.
nach einem vollständigen Schleifendurchlauf ist der Schleifenzähler immer kleiner (bei negativen Step) oder größer (bei postivem Step) als der Schleifenendwert.
bei dir wäre dann aZeile = 0 und 0 ist keine zulässige Zeilennummer als Zelladresse für Range.
mögliche Ursache:
du hast in Spalte A keine Werte, die als Zahl erkannt werden.
oder du hast zwischen der Zelle A1 und der ersten Zelle mit Zahl noch irgenwo eine Leerzelle drin, bei der das End(xldown) dann stoppt und so der rest der Spalte nicht mehr berücksichtigt wird.
hier könntest du mal statt Range("A1").End(xlDown).Row den Sprung in die andere Richtung probieren: Cells(Rows.Count, 1).End(xlup).Row
Gruß Daniel
Anzeige
AW: Laufzeitfehler 1004
15.04.2019 16:19:10
Daniel
Hallo Giorgi,
du hast in deinem Code ein "End With" ohne "With" stehen. Ist der nur nicht mit kopiert worden? Ansonsten liegt hier eine Fehlerquelle.
Du schreibst auch, dass du .Range... setzt. Das funktioniert natürlich auch nur mit einem "With XXX" davor. Wie sieht dein kompletter Code aus?
Gruß
Daniel
AW: Laufzeitfehler 1004
15.04.2019 16:30:50
Giorgi
Hier einmal der komplette Code.
Sub Test()
Dim wbk As Workbook
Dim zd As String
Dim aZeile As Long
Dim lz As Long
zd = "*****"
Set wbk = Workbooks.Open(Filename:=zd)
ThisWorkbook.Activate
For Each ws In ThisWorkbook.Worksheets
With ws
For aZeile = Range("A11").End(xlDown).Row To 1 Step -1
If IsDate(Cells(aZeile, 1)) Then Exit For
'Sind zwei identische Codes einmal mit dem Datum und einmal mit ISNumeric
Next aZeile
End With
Range("A11:D" & aZeile).Copy
wbk.Activate
lz = wbk.Sheets(1).Cells(Rows.Count, 4).End(xlUp).Row
Range("D" & lz + 1).PasteSpecial xlPasteAll
Next ws
Application.CutCopyMode = False
End Sub
Gruß Giorgi
Anzeige
AW: Laufzeitfehler 1004
15.04.2019 16:41:34
Daniel
Es wird leider gar nicht so richtig klar, was wohin kopiert werden soll. Du musst die Zellbezüge eindeutig festsetzen, also vor allem immer das gewünschte Arbeitsblatt mit benennen. Das tust du nicht einmal oben in beim With … End With, nichts bezieht sich auf ws (dafür müsstest du ein "." vor die Bezüge setzen, zum Beispiel .Range...). Insofern vermute ich, dass du stets im gleichen Arbeitsblatt hantierst und es dabei knallt.
AW: Laufzeitfehler 1004
15.04.2019 16:43:45
Daniel
Hi
wenn du einen Zellbezug (Range, Cells, Columns Rows) ohne Tabellenblattangabe davor verwendest, geht VBA immer auf das gerade aktive Tabellenblatt!
wenn du mit der WITH-Klammer arbeitest, dann muss überall dort, wo das Objekt der WITH-Klammer verwendet werden soll, der PUNKT am anfang stehen!
For aZeile = .Range("A11").End(xlDown).Row To 1 Step -1
If IsDate(.Cells(aZeile, 1)) Then Exit For 
Gruß Daniel
Anzeige
AW: Laufzeitfehler 1004
15.04.2019 17:29:26
Giorgi
Leider arbeite ich mit dynamischen Arbeitsblätter, die sich ständig ändern.
ThisWorkbook.Activate
For Each ws In ThisWorkbook.Worksheets
With ws
For aZeile = ActiveSheet.Range("A11").End(xlDown).Row To 1 Step -1
If IsDate(ActiveSheet.Cells(aZeile, 1)) Then Exit For
Next iZeile
End With
With ActiveSheet.Range(("A11:D") & aZeile).Copy
'Bis hierhin wird alles aus dem ersten Sheet kopiert
End With
wbk.Activate 'Hier wechsel ich zur anderen geöffneten Arbeitsmappe ,wo die Daten rein sollen.
lz = wbk.Sheets(1).Cells(Rows.Count, 4).End(xlUp).Row
Range("D" & lz + 1).PasteSpecial xlPasteAll
ThisWorkbook.Activate 'Hier wechsel ich wieder auf die Makrodatei
Next ws
Application.CutCopyMode = False
End Sub
Wie von Daniel festgestellt, kopiert das Makro nur das erste Sheet und dann knallt es schon.
Mit

ActiveSheet.Range
kriege ich keine Fehlermeldung mehr. Dennoch kopiert das Makro immer nur das erste Sheet so oft wie ich Sheets habe ohne auf das nächste Sheet zu springen. Übersehe ich etwas?
Ich hab die Punkte eingesetzt.
Gruß Giorgi
Anzeige
AW: Laufzeitfehler 1004
16.04.2019 01:44:19
Werner
Hallo Giorgi,
teste mal:
Sub Test()
Dim wbk As Workbook, ws As Worksheet, zd As String
Dim loLetzteQ As Long, loLetzteZ As Long
zd = "*****"
Set wbk = Workbooks.Open(Filename:=zd)
For Each ws In ThisWorkbook.Worksheets
With ws
loLetzteQ = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = loLetzteQ To 1 Step -1
If IsDate(.Cells(i, 1)) Then Exit For
Next i
.Range("A11:D" & i).Copy
With wbk.Sheets(1)
loLetzteZ = .Cells(.Rows.Count, 4).End(xlUp).Offset(1)
.Cells(loLetzteZ, 4).PasteSpecial Paste:=xlPasteAll
Application.CutCopyMode = False
End With
End With
Next ws
End Sub
Gruß Werner
Anzeige
AW: Laufzeitfehler 1004
16.04.2019 11:36:16
Daniel
Hi
deine Datei enthält keine Datumswerte.
29.04 - 03.05.19 sieht nur für uns wie eine Datumangabe aus, für Excel ist das aber ein normaler Text.
Ein Datum erkennst du daran, dass es sich in eine 5-stellige Zahl verwandelt (zumindest für die akuellen Datumswerte), wenn du die Zellen mit dem Zahlenformat "Standard" formatierst.
Zellen, die mit dem Zahlenformat "Standard" immer noch wie ein Datum aussehen, sind für Excel und VBA kein Datum, sondern Text.
Gruß Daniel
Anzeige
AW: Laufzeitfehler 1004
16.04.2019 12:38:05
Giorgi
Danke für den Tipp, wobei die Zellen ja schon als Datum formatiert sind. Muss ich dementsprechend überall ein einheitliches Datumformat(5 Stelliger Bereich) haben?
Gruß Giorgi
AW: Laufzeitfehler 1004
16.04.2019 15:18:16
Giorgi
Ich hab jetzt nochmal etwas getestet
und folgendes ergänzt:

Sub Test()
Dim wbk As Workbook, ws As Worksheet, zd As String
Dim loLetzteQ As Long, loLetzteZ As Long
Dim sht As Worksheet
Dim Rng As Range
zd = "******"
Set sht = ActiveSheet
loLetzteQ = sht.Cells(sht.Rows.Count, 11).End(xlUp).Row
For i = loLetzteQ To 1 Step -1
If IsDate(sht.Cells(i, 1)) Then Exit For
Next i
Set Rng = sht.Range("A11:D" & i)
Rng.Select
Selection.Copy
Set wbk = Workbooks.Open(Filename:=zd)
wbk.Worksheets(1).Activate
loLetzteZ = Worksheets(1).Cells(Worksheets(1).Rows.Count, 4).End(xlUp).Offset(1)
ActiveCell.Cells(loLetzteZ, 4).PasteSpecial Paste:=xlPasteAll
Application.CutCopyMode = False
End Sub
Das Makro macht jetzt schon was es machen soll ohne Fehlermeldung,dennoch markiert es mir fast das ganze Dokument bis zur letzten Zeile, ich will es ja nur bis zur ersten freien Zeile.
Gibt es da vielleicht noch irgendwie Anregung? Ich hab jetzt bewusst Select genommen um es für mich zu visualisieren wie es Schritt für Schritt abläuft.
Gruß Giorgi
Anzeige
AW: Laufzeitfehler 1004
16.04.2019 15:19:54
Daniel
als was du die Zellen formatiert hast, ist egal, entscheidend ist was drin steht.
wobei bei deinem Tabellenaufbau der einfache Sprung mit End(xldown) ausgehend von der entsprechenden Überschriftenzelle die passende Methode wäre, da der Zellbereich nach unten durch eine Leerzelle abgegrenzt ist..
So die deine Tabelle aussieht, brauchst du dann die Schleife nach oben nicht mehr.
Gruß Daniel
AW: Laufzeitfehler 1004
16.04.2019 16:29:41
Giorgi
So,
Sub Test()
Dim lngNextFree As Long
Dim ws As Worksheet
Dim Rng As Range
Dim zd As String
Dim loLetzteZ As Long
Set ws = ActiveSheet
On Error Resume Next
lngNextFree = Range("A11").Resize(Rows.Count - 11, 1).SpecialCells(xlCellTypeBlanks).Cells(0,  _
1).Row
On Error GoTo 0
Set Rng = ws.Range("A11:D" & lngNextFree)
Rng.Select
Selection.Copy
zd = "*******"
Set wbk = Workbooks.Open(Filename:=zd)
With wbk.Sheets(1)
loLetzteZ = .Cells(.Rows.Count, 4).End(xlUp).Offset(1)
.Cells(loLetzteZ, 4).PasteSpecial Paste:=xlPasteAll
Application.CutCopyMode = False
End With
End Sub
Hab das mit dem Markieren hin bekommen, jetzt habe ich nur noch das Problem mit dem Kopieren. Die Fehlermeldung bleibt leider nicht aus.
Anzeige
AW: Laufzeitfehler 1004
16.04.2019 18:53:37
Daniel
Hi
probiers mal mit
loLetzteZ = .Cells(.Rows.Count, 4).End(xlUp).Offset(1).Row
oder mach das ganze Einfügen weniger umständlich, da reicht eine Zeile:
wbk.Sheets(1).Cells(Rows.Count, 4).End(xlup).Offset(1, 0).PasteSpecial
dann solltest du dir noch überlegen, was passiert, wenn in der Zeile nach dem On Error Resume Next tatsächlich mal der Fehler auftritt.
in dem Fall behält nämlich lngNextFree den Wert 0 und dein Code funktioniert nicht mehr.
Entweder bist du dir sicher, dass dieser Fall nicht vorkommen kann, dann brauchst du das On Error Resume Next nicht, oder du gehst davon aus, dass er vorkommen kann, dann solltest du Vorkehrungen treffen und zumindest mal abfragen, ob er nicht eingetreten ist. (if LngNextFree = 0 Then)
aber der Fehlerfall kann tatsächlich eintreten, denn die .SpecialCells-funktion hat die Eigenart, den angegebenen Zellbereich nicht vollständig zu durchsuchen, sondern immer bis zum Ende des tatsächlich genutzten Zellbereichs auf dem Blatt (die Usedrange). Dh wenn in der Spalte A keine Leerzellen zwischen drin vorhanden sind, gibt's nen Fehler.
Gruß Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige