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

Laufzeitfehler 13

Forumthread: Laufzeitfehler 13

Laufzeitfehler 13
Lars
Grüß Gott miteinander
Ich versuche grad ein Makro zu schreiben, das in eine Datei geht und dort eine Spalte in in die Original Datei kopieren soll. Aber nun bekomme ich immer Laufzeitfehler 13. Kann mir jemand sagen, woran das liegt?
Mein Makro sieht zur Zeit so aus:
Sub Level()
Application.DisplayAlerts = False
Dim Pfad As String, Dateiname As String, iRow As Long
Application.ScreenUpdating = False
Pfad = "Q:\Objekt\"
Dateiname = Dir(Pfad & "*.xls")
Do While Dateiname  ""
Workbooks.Open Filename:=Pfad & Dateiname
iRow = ThisWorkbook.Sheets("Tabelle2").Range("G65536").End(xlUp).Offset(1, 0).Row
Workbooks(Dateiname).Sheets(Tabelle1).Range("AA2:AA1000").Copy
ThisWorkbook.Sheets("Tabelle2").Cells(iRow, 1).PasteSpecial
Application.CutCopyMode = False
Workbooks(Dateiname).Close
Dateiname = Dir()
Loop
Application.DisplayAlerts = True
End Sub

Hoffe, ihr wisst da Rat.
Vielen Dank.
Grüße aus München
Anzeige
AW: Laufzeitfehler 13
21.07.2010 13:55:01
JogyB
Hi.
Und wo genau kommt der Fehler?
Gruß, Jogy
AW: Laufzeitfehler 13
21.07.2010 13:57:53
Lars
Danke für deine schnelle Reaktion
Der Fehler kommt in Zeile:
Workbooks(Dateiname).Sheets(Tabelle1).Range("AA2:AA1000").Copy
Gruß
Lars
AW: Laufzeitfehler 13
21.07.2010 13:59:05
JogyB
Workbooks(Dateiname).Sheets("Tabelle1").Range("AA2:AA1000").Copy
Gruß, Jogy
Anzeige
AW: Laufzeitfehler 13
21.07.2010 14:33:08
Lars
Danke Jogy, das war der Fehler.
Ich habe noch eine Frage zu dem Makro.
Hab es jetzt mal laufen lassen und nun kopiert er aus 6 Dateien die Werte aus der entsprechenden Zeile. Aber anscheinend kopiert er jetzt alle wieder über und am Ende sind nur die Werte aus einem da.
Woran kann das liegen?
Anzeige
AW: Laufzeitfehler 13
21.07.2010 15:08:49
JogyB
Hi.
Du kopierst in die erste Spalte, prüfst aber in Spalte G auf den letzten Wert.
Gruß, Jogy
AW: Laufzeitfehler 13
21.07.2010 15:17:08
Lars
Danke Jogy
Mit dem Tipp klappt auch das super. Bin begeistert.
Hätte noch mehr Fragen, weiß aber nicht, ob das langsam unverschämt wird.
z.B. was man ändern muss, damit nicht die komplette Spalte, sondern nur die ganze Zeile in der ein vorher zugewiesener Wert aus Zeile H165 auftaucht. Ist das so machbar?
Anzeige
AW: Laufzeitfehler 13
21.07.2010 20:04:18
JogyB
Hi Lars,
ist nicht unverschämt, keine Angst.
Ich verstehe aber leider nicht so richtig, was Du jetzt meinst. Versuch es bitte ein wenig detaillierter zu erklären. Machbar ist mit VBA sehr sehr viel, da wird eine so einfache Geschichte kaum scheitern.
Gruß, Jogy
AW: Laufzeitfehler 13
22.07.2010 06:59:22
Lars
Guten Morgen Jogy
Danke, für deine Hilfe.
Das Makro ist ja nun:
Sub Level()
Application.DisplayAlerts = False
Dim Pfad As String, Dateiname As String, iRow As Long
Application.ScreenUpdating = False
Pfad = "Q:\Objekt\\"
Dateiname = Dir(Pfad & "*.xls")
Do While Dateiname  ""
Workbooks.Open Filename:=Pfad & Dateiname
iRow = ThisWorkbook.Sheets("Tabelle2").Range("A65536").End(xlUp).Offset(1, 0).Row
Workbooks(Dateiname).Sheets("Tabelle1").Range("AA2:AA10000").Copy
ThisWorkbook.Sheets("Tabelle2").Cells(iRow, 1).PasteSpecial
Application.CutCopyMode = False
Workbooks(Dateiname).Close
Dateiname = Dir()
Loop
Application.DisplayAlerts = True
End Sub
Die Frage ist nun, was müsste ich ändern, damit er aus einer Tabelle wie dieser hier, die in Spalte B bei mir das Datum wiedergibt.
29.6.10 7:28
29.6.10 10:06
29.6.10 10:32
7.7.10 10:31
8.7.10 19:27
9.7.10 16:56
10.7.10 8:16
12.7.10 9:19
Wie ist es nun möglich nicht die ganzen Werte auszulesen, sondern nur die zu diesen Werten passenden Gegenstücke. Also nach dem Motto, er findet in einer Datei das erste Datum und kopiert dann die entsprechende komplette Zeile( beschrieben sind die Zeilen A bis AE) in das File und dann das nächste Datum suchen und die Zeile kopieren, usw...
Das Datum steht bei den zu durchsuchenden Dateien immer in der Zeile AE.
Da bin ich echt völlig aufgeschmissen, was die Lösung des Problems angeht.
Hoffe, ihr wisst da vielleicht Rat.
Gruß aus München
Claas
Anzeige
AW: Laufzeitfehler 13
22.07.2010 08:36:39
JogyB
Ok, dazu einige Fragen:
1. Wie erkennt das Makro, in welcher Datei das Datum zu suchen ist? Du öffnest hier ja zig Dateien. D.h. gibt es ein System oder sind die zufällig verteilt. Wenn es ein System gibt, woran erkenne ich das (z.B. am Dateinamen?)?
2. Wohin soll die Zeile kopiert werden? In die gleiche Zeile wie das Datum? Wenn ja, wohin in der Zeile? Neben die bisherigen Daten oder ab Spalte A (also einfach überschreiben).
3. Das Datum in AE ist dann auch mit Uhrzeit?
Gruß, Jogy
Anzeige
AW: Laufzeitfehler 13
22.07.2010 08:48:34
Lars
zu 1. Die Dateien sind im Prinzip Log Dateien. Alle 2 bis 3 Tage kommt eine Datei hinzu. Ich denke aber, die Höchstgrenze wird bei 10 sein, dann werde ich wieder die alten aussortieren. Die Dateien gehen also chronologisch vor. Aber nicht in jeder Datei wird ein Datum zum Auslesen sein. Es wird wohl nur so alle 2 - 3 Dateien ein Wert vorkommen.
zu 2. Am besten wird die Zeile einfach in eine neue Mappe kopiert
3. Ja, das Datum ist auch mit der Uhrzeit
Gruß
Claas
Anzeige
AW: Laufzeitfehler 13
22.07.2010 08:59:25
JogyB
Noch als letzte Frage: Wie sieht der Dateiname der Log-Dateien aus? Wenn man aus diesem die chronologische Reihenfolge herauslesen kann, dann muss das Makro nicht bei jedem Datum alle Dateien durchschauen.
Gruß, Jogy
AW: Laufzeitfehler 13
22.07.2010 09:05:03
Lars
Es ist schwierig, bisher benenne ich sie immer nach dem Schema z.B. 12.7. bis 13.7., weil es von Mitte des 12. bis Mitte 13. geht.
Ich muss halt Start- und Endzeit dort hineinbringen. Kann die aber innerhalb des Schemas variieren, falls es dadurch irgendwie einfacher gehen könnte.
Gruß
Claas
Anzeige
AW: Laufzeitfehler 13
22.07.2010 09:37:27
JogyB
Wenn Du die z.B. nach dem Schema xxxx_100712_100713.xls benennen würdest, dann würde das Makro schneller arbeiten. Ich kann es aber auch so machen, dass der Dateiname vollkommen egal ist, das Makro arbeitet dann halt länger - was das ausmacht hängt von der Anzahl der auszulesenden Zeilen ab. Bei 20 dürfte es relativ egal sein, bei 2000 macht es aber einiges aus.
Was ist Dir lieber?
Gruß, Jogy
Anzeige
AW: Laufzeitfehler 13
22.07.2010 09:44:34
Lars
Die xxxx sind dann frei wählbar?
Wenn dies der Fall ist und dies hier ein Wunschkonzert ist, dann würde ich den ersten Fall nehmen und sie umbenennen.
Gruß
Claas
AW: Laufzeitfehler 13
22.07.2010 10:57:52
JogyB
Die xxxx sind frei wählbar. Und in gewissem Rahmen ist das hier natürlich ein Wunschkonzert, die Lösung soll ja zu Deinem Problem passen.
Ich bastle dann mal was.
Gruß, Jogy
Anzeige
AW: Laufzeitfehler 13
22.07.2010 11:43:16
Lars
Vielen Vielen Dank Jogy
Ich warte dann mal gespannt.
AW: Laufzeitfehler 13
22.07.2010 13:14:43
JogyB
So, probier das mal aus:
Ich habe es kurz getestet und es funktioniert bei mir. Beim Dateinamen der Log-Files bist Du übrigens relativ frei, es muss nur sichergestellt sein, das eine Sortierung nach Dateinamen die chronologische Reihenfolge ergibt.
Sub daTenKopieren()
Const paTh = "c:\temp\test\" ' hier Deinen Pfad eintragen
Const datNameStart = "xxxx_" ' hier den Anfang Deiner Dateinamen eintragen
Const logDatSp = 31 ' Spalte, in der das Datum in der Logdatei steht
Const suchDatSp = 2 ' Spalte, in der das zu suchende Datum steht
Const firstLogRow = 2 ' erste Zeile in der Log-Datei, in der Werte stehen
Dim daTei As String
Dim zielWsh As Worksheet
Dim quellWsh As Worksheet
Dim dateNr As Long
Dim rowToCopy As Long
Dim i As Long
'1: Wert gefunden
'0: normal suchen
'-1: kann nicht gefunden werden, weil zu alt
'-2: letzte Datei geschlossen, keine Suche mehr
Dim staTe As Integer
On Error GoTo errorHandler
daTei = Dir(paTh & datNameStart & "*")
' wenn es keine Logdateien gibt, dann gleich raus
If daTei = "" Then
MsgBox ("Keine Logdateien vorhanden!")
Exit Sub
' wenn es welche gibt, dann ScreenUpdating aus
' (dann flimmert der Bildschirm nicht)
' sowie die Zielarbeitsmappe und die erste
' Quellarbeitsmappe öffnen
Else
Application.ScreenUpdating = False
Set zielWsh = Workbooks.Add.Sheets(1)
' Überschüssige Sheets löschen
' könnte auch die SheetsInNewWorkbook Eigenschaft ändern,
' aber an solchen Einstellung pfuscht man nur herum,
' wenn es nicht anders geht
With zielWsh.Parent
For i = .Sheets.Count To 2 Step -1
Application.DisplayAlerts = False
.Sheets(i).Delete
Application.DisplayAlerts = True
Next
End With
' Wird schreibgeschützt geöffnet, zur Problemvermeidung
Set quellWsh = Workbooks.Open(paTh & daTei, , True).Sheets(1)
End If
' Läuft über die von Dir eingetragenen Datumswerte
' ich habe mal angenommen, dass die in Zeile 2 starten
' und im ersten Sheet dieser Arbeitsmappe liegen
' ACHTUNG: Diese müssen chronologisch geordnet sein!
With ThisWorkbook.Sheets(1)
For dateNr = 2 To .Cells(Rows.Count, suchDatSp).End(xlUp).Row
If IsDate(.Cells(dateNr, suchDatSp)) Then
' Solange Quelldaten da und im vorigen Durchlauf kein Fehler
While staTe = 0
On Error Resume Next
rowToCopy = _
quellWsh.Columns(logDatSp).Find(.Cells(dateNr, suchDatSp)).Row
' wenn etwas gefunden, dann gibt es keinen Fehler
' also Zeile kopieren
If Err.Number = 0 Then
On Error GoTo errorHandler
quellWsh.Rows(rowToCopy).Copy zielWsh.Rows(dateNr)
staTe = 1
' Bei Fehler schauen, ob das Datum nach dem letzten Datum in der
' aktuell geöffneten Datei
Else
On Error GoTo errorHandler
' falls ja, nächste Datei öffnen, sofern vorhanden
If quellWsh.Cells(Rows.Count, logDatSp).End(xlUp).Value  "" Then
Set quellWsh = Workbooks.Open(paTh & daTei, , True).Sheets(1)
Else
Set quellWsh = Nothing
staTe = -2
' Hier braucht kein Fehler eingetragen werden
' passiert weiter unten automatisch
End If
' falls nein, wurde der Wert nicht gefunden
Else
staTe = -1
End If
End If
Wend
' Wenn Fehler oder letzte Datei erreicht, dann Fehlereintrag
If staTe  -2 Then staTe = 0
' Wenn es kein Datum war, dann Fehlermeldung in Zieldatei
Else
zielWsh.Cells(dateNr, 1) = _
"''" & .Cells(dateNr, suchDatSp).Text & "' ist kein Datum!"
End If
Next
End With
' Wenn noch eine Quelldatei offen ist (state > -2), dann diese jetzt zu
If staTe > -2 Then quellWsh.Parent.Close False
' ScreenUpdating wieder ein
Application.ScreenUpdating = True
Exit Sub
endOnError:
On Error Resume Next
' Quelldatei zu
quellWsh.Parent.Close False
' Alles was an Applikationseinstellungen geändert wurde wieder zurück
Application.ScreenUpdating = True
Application.DisplayAlerts = True
' Fehlermeldung - ist jetzt nicht sonderlich schön gemacht,
' aber das richtig zu machen ist ein großer Aufwand
MsgBox ("Fehler aufgetreten bei Zeile " & dateNr & " und Datei '" & daTei & "'!" &  _
vbNewLine & _
"Fehlermeldung: " & Err.Number & " - " & Err.Description)
Exit Sub
' Muss ich so machen, damit das On Error Resume Next bei endOnError funktioniert
errorHandler:
Resume endOnError
End Sub
Gruß, Jogy
Anzeige
AW: Laufzeitfehler 13
22.07.2010 13:42:14
Lars
Vielen Dank Jogy für die tolle Arbeit.
Habe aber nun eine Fehlermeldung bekommen: Fehler aufgetreten bei Zeile 0 und Datei Auswertung 100712_100713! Fehlermeldung 91 -Objektvariable oder with Block Variable nicht festgelegt.
Und noch eine Frage, kreiert er nun eine völlig neue Excel Datei? Eigentlich hätte es mir auch gereicht, wenn er in der Ausgangsdatei einfach unten einen neuen Reiter unten macht. Wie Tabelle 3 oder so. Weiss aber nicht, was für dich praktischer ist.
Anzeige
AW: Laufzeitfehler 13
22.07.2010 13:55:33
JogyB
Hallo Lars,
Du kannst das "On Error GoTo ErrorHandler" am Anfang mal auskommentieren, dann kommt die Fehlermeldung direkt von Excel und Du siehst auch die Zeile, in der der Fehler auftritt. Ich vermute aber mal, dass die Datei oder eine Datei gleichen Namens schon geöffnet ist.
Wenn Du einfach eine neue Tabelle in der Arbeitsmappe willst, dann ändere das:
    Else
Application.ScreenUpdating = False
Set zielWsh = Workbooks.Add.Sheets(1)
' Überschüssige Sheets löschen
' könnte auch die SheetsInNewWorkbook Eigenschaft ändern,
' aber an solchen Einstellung pfuscht man nur herum,
' wenn es nicht anders geht
With zielWsh.Parent
For i = .Sheets.Count To 2 Step -1
Application.DisplayAlerts = False
.Sheets(i).Delete
Application.DisplayAlerts = True
Next
End With
' Wird schreibgeschützt geöffnet, zur Problemvermeidung
Set quellWsh = Workbooks.Open(paTh & daTei, , True).Sheets(1)
End If

zu
    Else
Application.ScreenUpdating = False
With ThisWorkbook
Set zielWsh = Sheets.Add(, .Sheets(.Sheets.Count))
End With
' Wird schreibgeschützt geöffnet, zur Problemvermeidung
Set quellWsh = Workbooks.Open(paTh & daTei, , True).Sheets(1)
End If

Gruß, Jogy
Anzeige
AW: Laufzeitfehler 13
22.07.2010 14:04:29
Lars
Damit schliesst sich ja der Kreis hin zur Überschrift ;)
Also es kommt Laufzeitfehlr 13; Typen unverträglich
In Zeile
Set quellWsh = Workbooks.Open(paTh & daTei, , True).Sheets(1)
Gruß
Claas
AW: Laufzeitfehler 13
22.07.2010 14:28:52
JogyB
Hi Lars,
kommt das gleich beim ersten Aufruf (also noch vor der While-Schleife) oder in der While-Schleife? Sind da noch Diagramme in den Log-Dateien? Falls ja, dann ersetze im kompletten Code "Sheets" durch "Worksheets", nur in der Zeile Set zielWsh = Sheets.Add(, .Sheets(.Sheets.Count)) ist es besser es so zu lassen.
Gruß, Jogy
Anzeige
AW: und noch ein kleiner Fehler
22.07.2010 14:31:38
JogyB
Gerade noch aufgefallen: Das Sheets.Add(...) muss .Sheets.Add(...) lauten.
Gruß, Jogy
AW: Laufzeitfehler 13
22.07.2010 14:43:04
Lars
Servus Jogy
Ja, es sind 2 Diagramme und eine Tabelleseite.
Hab alle geändert.
Er macht immer jetzt die erste Datei auf und macht den Reiter Tabelle 2.
Dann kommt jetzt der Fehler:
Laufzeitfehler 1004: Die Methode Rows für das Objekt Global ist fehlgeschlagen
in Zeile: For dateNr = 2 To .Cells(Rows.Count, suchDatSp).End(xlUp).Row
Anzeige
AW: Laufzeitfehler 13
22.07.2010 14:52:34
JogyB
Hi Lars,
Ok, dann wäre das eine mal gelöst, da war ich mal wieder mit "Sheets" zu nachlässig.
Zum jetzigen Problem: mach mal .Rows.Count daraus und dann aus
If quellWsh.Cells(Rows.Count, logDatSp).End(xlUp).Value ...
noch
If quellWsh.Cells(quellWsh.Rows.Count, logDatSp).End(xlUp).Value
Gruß, Jogy
Anzeige
AW: Laufzeitfehler 13
22.07.2010 15:15:03
Lars
Grüß Gott Jogy
es ist grad problemlos durchgelaufen.
Antworte erst jetzt, weil ich vor Freude erstmal schreiend um das Haus gerannt bin.
Wie kann ich dir denn jemals dafür danken. Hast mir echt riesig geholfen.
Gruß
AW: Laufzeitfehler 13
22.07.2010 15:20:40
JogyB
Hallo Lars,
freut mich, dass es geklappt hat. Die "On Error Goto ErrorHandler" kannst Du jetzt wieder reinnehmen, wenn Du willst.
Noch als guter Ratschlag: Versuche mal nachzuvollziehen, was der Code im einzelnen macht. Das ist für einen Anfänger zwar nicht ganz leicht, entsetzlich kompliziert ist das Beispiel jetzt aber auch nicht. Wenn Du den Code nur einigermaßen verstanden hast, dann kannst Du zumindest kleine Änderungen daran selbst durchführen (nicht dass Dir niemand hier helfen würde, nur ist es für einen selbst auch besser, nicht wegen jeder Kleinigkeit fragen zu müssen).
Gruß, Jogy
Anzeige
AW: Laufzeitfehler 13
22.07.2010 15:55:03
Lars
Danke Jogy
Das werde ich auf jeden Fall tun. Habe in den letzten Tagen einiges schon dazu gelernt. Wenn man bei null beginnt, dann ist besonders der Anfang schwer, warum man irgendetwas überhaupt macht, finde ich. Aber das Thema interessiert mich sehr und ich werde auf jeden Fall am Ball bleiben. Aber ich werde bestimmt hier wieder Fragen stellen müssen.
Also wirklich vielen Dank.
Gruß
Lars
Anzeige
;

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