Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1488to1492
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': Anwendungs-und ...

Laufzeitfehler '1004': Anwendungs-und ...
02.05.2016 16:39:41
Siggi
Hallo zusammen, das ist mein erster Beitrag. Würde mich über Info sehr freuen.
Habe folgenden Code geschrieben:
In einem Ordner sollen alle Excel Dateien nacheinander geöffnet werden, dann wird auf den Inhalt zugegriffen und anschließend wird die Datei wieder geschlossen.
Hier ist der Code:
Sub RiskAss()
Dim xlApp As Excel.Application
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Dim datein As Integer
Dim MD As Worksheet
Dim OV As Worksheet
Dim TR As Worksheet
Dim FD As Worksheet
Dim FSO As Object
Dim fo As Object
Dim myStr As String
Dim path As String
Dim folder As String
Dim i As Integer
i = 1
Dim h As Integer
folder = "path/"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set fo = FSO.getfolder("//Test")
datein = fo.Files.Count
For Each FSO In fo.Files
Set MD = ThisWorkbook.Sheets(1)
Set OV = ThisWorkbook.Sheets(2)
Set TR = ThisWorkbook.Worksheets("Tab. Risk")
i = i + 1
Set xlApp = CreateObject("Excel.Application")
If xlApp.Workbooks.CanCheckOut(folder & FSO.Name) = True Then
xlApp.Workbooks.Open (folder & FSO.Name)
'xlApp.Workbooks.checkout docCheckOut
Set wb = xlApp.ActiveWorkbook
Set ws = wb.Worksheets("Single R&O Record")
xlApp.Visible = True
'****************************Copy Data************************************
'1) No.
MD.Cells(i, 1).NumberFormat = "@"
MD.Cells(i, 1) = ws.Cells(1, 29)
OV.Cells(i, 1).NumberFormat = "@"
OV.Cells(i, 1) = MD.Cells(i, 1)
TR.Cells(i, 1).NumberFormat = "@"
TR.Cells(i, 1) = MD.Cells(i, 1)
... hier ca. 20 dieser Blöcke
'dann das workbook schließen...
wb.Close savechanges:=False
xlApp.Quit
Set xlApp = Nothing
Set wb = Nothing
Set ws = Nothing
Set MD = Nothing
Set OV = Nothing
Set TR = Nothing
End If
Next
End Sub

Bei einer oder wenigen Dateien funktioniert der Code. Wenn ich jedoch versuche, viele Dateien durchlaufen zu lassen, hängt sich das Programm auf.
Woran kann es liegen. Habe bereits zu viel Zeit hiermit verbracht.
Würde mich sehr über Hilfe freuen.
Vielen Grüße und herzlichen Dank schonmal

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufzeitfehler '1004': Anwendungs-und ...
02.05.2016 16:43:23
Rudi
Hallo,
warum erzeugst du für jede Datei eine neue Excel-Instanz?
Gruß
Rudi

AW: Laufzeitfehler '1004': Anwendungs-und ...
02.05.2016 17:40:12
Siggi
Hallo Rudi,
vielen dank für die sehr schnelle Antwort!!! Es geht jetzt, weil die Datein irgendwie schadhaft waren...
ABER: dein Einwand macht total sinn. Ich werd morgen versuchen das mal schlanker zu machen.
Vielen Dank für die Hilfe.
Würde wohl bedeuten xlApp... aus der schleife rauszunehmen oder?
Viele Grüße
Niels

AW: Laufzeitfehler '1004': Anwendungs-und ...
02.05.2016 18:29:48
Michael
Hi zusammen,
nachfolgend noch einige Anmerkungen:
a) die drei sets

Set MD = ThisWorkbook.Sheets(1)
Set OV = ThisWorkbook.Sheets(2)
Set TR = ThisWorkbook.Worksheets("Tab. Risk")
müssen nicht bei jedem Schleifendurchlauf ausgeführt werden, die kannst Du direkt vor das For setzen.
b) der Block

MD.Cells(i, 1).NumberFormat = "@"
MD.Cells(i, 1) = ws.Cells(1, 29)
OV.Cells(i, 1).NumberFormat = "@"
OV.Cells(i, 1) = MD.Cells(i, 1)
TR.Cells(i, 1).NumberFormat = "@"
TR.Cells(i, 1) = MD.Cells(i, 1)
ist deutlich optimierbar:
1. Das Numberformat kannst Du NACH der Schleife auf die komplette Spalte anwenden, etwa so:
MD.Range("A1:A" & i).NumberFormat = "@"
, wobei der Vorschlag davon ausgeht, daß das Format ab Zeile 1 angepaßt wird und das i die Nr. der untersten Zeile ist: mußt halt anpassen.
2. Im Prinzip liest Du ja nur EINMAL den Wert der geöffneten Datei ein, die restlichen Aktionen finden innerhalb Deiner Tabelle statt.
Das bedeutet, daß sich das ganze Ding auf die erste Zeile reduzieren läßt:

MD.Cells(i, 1) = ws.Cells(1, 29)
und Du alle weiteren Zuweisungen SPALTENweise NACH der Schleife vornehmen kannst.
Also in der Reihenfolge:
Schleifenbeginn
1. Werte aus der fremden Tabelle einlesen,
Schleifenende
2. komplette Spalten in MD formatieren
3. komplette Spalten aus MD nach OV und TR kopieren.
Du wirst Dich wundern, wie sehr das Dein Makro beschleunigt.
Darüberhinaus kann sich ein Blick in das Tutorial über Arrays lohnen:
http://www.online-excel.de/excel/singsel_vba.php?f=152
Schöne Grüße,
Michael
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige