Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1412to1416
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

Laufzeit 1004 WS.copy

Laufzeit 1004 WS.copy
18.03.2015 13:59:29
Robert
Hallo Zusammen,
ich habe ein Makro zusammengebaut welches eine Datei öffnet und die einzelnen Tabellenblätter im gleichen Pfad als einzelne Dateien abspeichert.
Diese Dateien werden anschließend mit Betreff und Text in eine E-Mail gepackt und werden verschickt.
Dies funktioniert allerdings nur mit von mir erstellten Basisdateien im .xlsx oder .xlsm Format.
Leider handelt es sich bei der Basisdatei um eine .xls 97-03.
Meine Idee war es zuerst die Basisdatei zu öffnen, als xlsm oder xlsx abzulegen um diese _ anschließend wieder zu öffnen um das Makro ausführen zu können. Dies funktioniert leider auch nicht ... auf keine Weise lässt sich die Basis verarbeiten.

Sub GesundheitsgesprächeImportundEmail()
Dim Datei As String
Dim Datei2 As String
Dim oWs As Worksheet
Dim outObj As Object
Dim Mail As Object
Dim Pfad As String
On Error GoTo Fehler
Datei = Application.GetOpenFilename("alle Excel-Dateien(*),*xls")
If Datei = "Falsch" Then
MsgBox "keine Datei ausgewählt", , "Abbruch"
Exit Sub
End If
MsgBox "Ausgewählte Datei: " & Datei, , ""
Application.DisplayAlerts = False
Workbooks.Open Filename:=Datei, Local:=True
'ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & ActiveWorkbook.Name & ".xlsx",  _
FileFormat:=xlOpenXMLWorkbookApplication 'xlOpenXMLWorkbookMacroEnabled
'ActiveWorkbook.Close
'On Error GoTo Fehler
'Datei2 = Application.GetOpenFilename("alle Excel-Dateien(*),*xls")
'If Datei2 = "Falsch" Then
' MsgBox "keine Datei ausgewählt", , "Abbruch"
'  Exit Sub
'End If
'Workbooks.Open Filename:=Datei2, Local:=True
Call Blätter_einzeln_speichern
Pfad = ThisWorkbook.Worksheets(1).Cells(39, 4).Value
Dateiname1 = ThisWorkbook.Worksheets(1).Range("F8")
Application.DisplayAlerts = True
Set outObj = CreateObject("Outlook.Application")
Set Mail = outObj.CreateItem(0)
With Mail
.Subject = "XXX"
.Body = "XXX"
.To = ThisWorkbook.Worksheets("A").Range("D8")
.Attachments.Add Pfad1
.send
End With
'Mail.Display
Set Mail = Nothing
Set outObj = Nothing
Exit Sub
Fehler:
Set Quelle = Nothing
Set Ziel = Nothing
MsgBox "FehlerNr.: " & Err.Number & vbNewLine & vbNewLine _
& "Beschreibung: " & Err.Description _
, vbCritical, "Fehler"
End Sub
Sub Blätter_einzeln_speichern()
Dim ws As Worksheet
For Each ws In Sheets
ws.Copy
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & ActiveSheet.Name & ".xls"
ActiveWorkbook.Close True
Next ws
End Sub
Gibt es überhaupt eine Möglichkeit auf Grundlage der alten Excel Datei?
Ich habe keine Chance diese neu aufzusetzen oder Ähnliches, da es sich um exteren Informationen handelt.
Ich hoffe ihr könnt mir weiterhelfen und danke vielmals im voraus!
LG
Robert

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufzeit 1004 WS.copy
18.03.2015 15:58:55
Robert
Hallo,
mein Makro funktioniert, wenn ich manuell alle Tabellenblätter aus der .xls 97 Basisdatei markiere und in eine leere Exceldatei einfüge um diese dann als neue Basis zu verwenden.
Daher habe ich als nächstes Versucht dies so in VBA umzusetzen.
Sub CopySheets()
Dim lngCounter As Long
Dim wbOrig As Workbook
Dim wbTarg As Workbook
Dim Datei As String
Dim Anzahl As Integer
Call Test
On Error GoTo Fehler
Datei = Application.GetOpenFilename("alle Excel-Dateien(*),*xls")
If Datei = "Falsch" Then
MsgBox "keine Datei ausgewählt", , "Abbruch"
Exit Sub
End If
MsgBox "Ausgewählte Datei: " & Datei, , ""
Application.DisplayAlerts = False
Workbooks.Open Filename:=Datei, Local:=True
Set wbOrig = Workbooks(Datei)
Set wbTarg = Workbooks("Zwischenspeicher.xls")
Anzahl = wbOrig.Sheets.Count
For lngCounter = 1 To Anzahl
wbOrig.Sheets(lngCounter).Copy After:=wbTarg.Sheets(lngCounter)
Next lngCounter
Set wbTarg = Nothing
Set wbOrig = Nothing
Fehler:
MsgBox "FehlerNr.: " & Err.Number & vbNewLine & vbNewLine _
& "Beschreibung: " & Err.Description _
, vbCritical, "Fehler"
End Sub
Sub Test()
Dim wkbMappe As Workbook
Set wkbMappe = Workbooks.Add
wkbMappe.SaveAs "C:\Temp\Zwischenspeicher.xls"
MsgBox wkbMappe.Name & " " & wkbMappe.FullName
'wkbMappe.Close False
End Sub
Dieses Makro erstellt eine neue Datei mit dem Namen "Zwischenspeicher.xls", kopiert die Tabellenblätter in der Basisdatei anhand der Anzahl der Tabellenblätter und fügt soll diese in die Zieldatei ein. Auch hierbei erhalte ich eine Fehlermeldung
Fehler: 9
subscript out of range
Habt ihr einen Anhaltspunkt für mich?
LG
Robert

Anzeige
AW: Laufzeit 1004 WS.copy
18.03.2015 16:11:42
Daniel
Hi
wenn ein Fehler auftritt, solltest du als erstes deine Fehlerbehandlungsroutine deaktivieren (dh das On Error Goto Fehler auskommentieren und ein Hochkomma davorsetzen)
das hat dann den Effekt, dass das Makro direkt bei der Fehlerverursachenden Zeile anhält, dir diese Zeile anzeigt und du beispielswiese die Variablenwert und betroffenen Zellen direkt überprüfen kannst.
Das sind wichtige Informationen die du für eine schnelle Ursachenfindung brauchst, die aber durch eine Fehlerbehandlungsroutine vernichtet werden.
die Fehlerbehandlungsroutine sollte man erst einbauen, wenn die Testphase abgeschlossen ist (bis auf den Test der Fehlerbehandlungsroutine) und fehlerfrei läuft.
In Makros, die ich für meinen "Eigenbedarf" erstelle, baue ich sowas erst gar nicht ein.
Gruß Daniel

Anzeige
AW: Laufzeit 1004 WS.copy
18.03.2015 16:13:33
Rudi
Hallo,
wie soll das funktionieren?
.Attachments.Add Pfad1
Pfad1 wird nirgends definiert.
Du erzeugst mehrere Workbooks. Die willst du doch alle versenden, oder?
Auch davon sehe ich nichts.
Dim ws As Worksheet
For Each ws In Sheets

Auch nicht sauber. In Sheets kann auch ein Chart sein.
Was funktioniert denn nicht?
Gruß
Rudi

AW: Laufzeit 1004 WS.copy
20.03.2015 08:16:48
Robert
Hallo Rudi,
ich habe nicht den ganzen Code gepostet.
Dieser Teil

Pfad = ThisWorkbook.Worksheets(1).Cells(39, 4).Value
Dateiname1 = ThisWorkbook.Worksheets(1).Range("F8")
ist von Pfad -29 und Dateiname 1-30 durchnummeriert, da ich nicht weiß wie ich dies auf andere weise lösen kann.
Ich setze also auch 30 Emails nacheinander auf diese Weise auf
Pfad = ThisWorkbook.Worksheets(1).Cells(39, 4).Value
Dateiname1 = ThisWorkbook.Worksheets(1).Range("F8")
Application.DisplayAlerts = True
Set outObj = CreateObject("Outlook.Application")
Set Mail = outObj.CreateItem(0)
With Mail
.Subject = "XXX"
.Body = "XXX"
.To = ThisWorkbook.Worksheets("A").Range("D8")
.Attachments.Add Pfad1
.send
End With
'Mail.Display
Set Mail = Nothing
Set outObj = Nothing
Ich definiere also alle Dateipfade nacheinander und setze auch alle E-Mails nacheinander auf.
Das Problem besteht darin, dass ich es nicht schaffe die Tabellenblätter rauszukopieren und als eigene Dateien zu Speichern. Dies klappt ausschließlich mit von mir nachgebauten Basisdateien.
Die Basisdatei ist eine im 97-03 Format gespeicherte Datei.
Sie besteht aus 30 Tabellenblättern aufgeteilt nach Abteilungen.
In jedem Tabellenblatt stehen in Spalte 1 und 2 Mitarbeiter Vor- und Nachname.
In den restlichen Spalten stehen die einzelnen Monate. Je nach Mitarbeiter werden diese dann mit Daten gefüllt (Anzahl Tage).
Der Fehler wird angezeigt bei

ws.Copy
run time error '1004' Method Copy of object _Worksheet failed.
Schon mal vielen Dank für deine Hilfe !
Gruß Robert
Hallo Daniel,
vielen Dank für diesen Hinweis.
Das war mir so nicht bewusst, du hast mir auf jeden Fall einige Arbeit in Zukunft erspart, danke !
Gruß Robert

Anzeige
AW: Laufzeit 1004 WS.copy
20.03.2015 09:34:46
Robert
Edit : Jede E-Mail beschreibt eine Abteilung und geht auch nur an einen bestimmten Abteilungsleiter, das habe ich nicht klar formuliert, tut mir leid.

noch was
18.03.2015 16:16:51
Rudi
Hallo,
mit On Error am Anfang eines Codes wirst du den Fehler nie finden.
Gruß
Rudi

AW: Laufzeit 1004 WS.copy
18.03.2015 17:06:32
Rudi
Hallo,
teste mal:
Option Explicit
Sub GesundheitsgesprächeImportundEmail()
Dim Datei As String
Dim wkb As Workbook
Dim objOL As Object, objMail As Object
Dim i As Integer
Dim strAtt As String
Dim arrAtt
'On Error GoTo Fehler
Datei = Application.GetOpenFilename("alle Excel-Dateien(*),*xls")
If Datei = "Falsch" Then
MsgBox "keine Datei ausgewählt", , "Abbruch"
Exit Sub
End If
'MsgBox "Ausgewählte Datei: " & Datei, , ""
Application.DisplayAlerts = False
Set wkb = Workbooks.Open(Filename:=Datei, Local:=True)
Call Blätter_einzeln_speichern(ActiveWorkbook, strAtt)
wkb.Close False
Application.DisplayAlerts = True
arrAtt = Split(strAtt, ";")
Set objOL = CreateObject("Outlook.Application")
Set objMail = objOL.CreateItem(0)
With objMail
.Subject = "XXX"
.Body = "XXX"
.To = ThisWorkbook.Worksheets("A").Range("D8")
For i = 0 To UBound(arrAtt)
.Attachments.Add arrAtt(i)
Next
'    .send
.display
End With
Set objMail = Nothing
Set objOL = Nothing
Exit Sub
Fehler:
MsgBox "FehlerNr.: " & Err.Number & vbNewLine & vbNewLine _
& "Beschreibung: " & Err.Description _
, vbCritical, "Fehler"
End Sub
Sub Blätter_einzeln_speichern(wkb As Workbook, strAtt As String)
Dim ws As Worksheet, strName As String
For Each ws In wkb.Worksheets
strName = ThisWorkbook.Path & "\" & ws.Name & ".xls"
ws.Copy
ActiveWorkbook.SaveAs Filename:=strName
strAtt = strAtt & ";" & strName
ActiveWorkbook.Close True
Next ws
strAtt = Mid(strAtt, 2)
End Sub

Gruß
Rudi

Anzeige
AW: Laufzeit 1004 WS.copy
20.03.2015 08:23:36
Robert
Hallo Rudi,
auch hier bekomme ich leider die Fehlermeldung "Run time Error 1004:
Method "Copy" of object '_Worksheet' failed
LG
Robert

AW: Laufzeit 1004 WS.copy
20.03.2015 12:22:34
Rudi
Hallo,
Mappenschutz?
Außerdem besser
Call Blätter_einzeln_speichern(wkb, strAtt)
Gruß
Rudi

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige