Discussion:
Datei löschen
(zu alt für eine Antwort)
Dietmar Feuerer
2005-11-16 08:56:03 UTC
Permalink
Hallo,

während eines Makroablaufes (arebitet mit einer Tabelle) speichere ich das
Dokument, damit der Rückgängig/Wiederherstellen-Speicher gelöscht wird. Ich
verwende dazu den Befehl
If Dir("C:\TEMP\tmp.doc") = "tmp.doc" Then
Kill "C:\TEMP\tmp.doc"
ActiveDocument.SaveAs FileName:="C:\TEMP\tmp.doc"
End If
Der Befhel soll überprüfen, ob die Datei tmp.doc existiert und ggf. löschen,
anschließend die aktuelle Datei als tmp.doc speichern.

Ich bekomme jetzt nach längerem Einsatz eine Fehlermeldung, obwohl der
Ordner temp sowie die Datei tmp.doc auf der C-Partition existieren.

Kann mir jemand helfen?
Danke und lg Dietmar
Ambasa Haile
2005-11-16 10:27:03 UTC
Permalink
Hallo Dietmar,
Ich verwende dazu den Befehl
If Dir("C:\TEMP\tmp.doc") = "tmp.doc" Then
Kill "C:\TEMP\tmp.doc"
ActiveDocument.SaveAs FileName:="C:\TEMP\tmp.doc"
End If
Der Befhel soll überprüfen, ob die Datei tmp.doc existiert und ggf. löschen,
anschließend die aktuelle Datei als tmp.doc speichern.
leider weiß ich nicht, welche Word-Version du verwendest – ich habe deinen
Code unter Word2002/SP2 laufen lassen.

Wie aus deiner Anfrage hervorgeht, möchtest du lediglich eine bereits
bestehende Datei ersetzen – dafür müsst du es aber vorher nicht löschen –
wirklich nicht!

Dein Code ist bis auf die Zeile "Kill …." ok. Schmeiß die Zeile raus und
dein Laufzeitfehler 70 ist weg.

Gruß | ambasa
Dietmar Feuerer
2005-11-17 15:31:02 UTC
Permalink
Hallo Ambasa,
Post by Ambasa Haile
Dein Code ist bis auf die Zeile "Kill …." ok. Schmeiß die Zeile raus und
dein Laufzeitfehler 70 ist weg.
danke für deine Hilfe. Ich habe es getestet. Es geht.

Lg Dietmar
Thomas Gahler
2005-11-16 14:27:20 UTC
Permalink
Hallo Dietmar
Post by Dietmar Feuerer
Ich bekomme jetzt nach längerem Einsatz eine Fehlermeldung, obwohl der
Ordner temp sowie die Datei tmp.doc auf der C-Partition existieren.
Na welche Fehlermeldung denn und bei welcher Zeile, tztztzzzz das solltest
du uns scon flüstern...
Post by Dietmar Feuerer
verwende dazu den Befehl
If Dir("C:\TEMP\tmp.doc") = "tmp.doc" Then
Kill "C:\TEMP\tmp.doc"
ActiveDocument.SaveAs FileName:="C:\TEMP\tmp.doc"
End If
Der Befhel soll überprüfen, ob die Datei tmp.doc existiert und ggf. löschen,
anschließend die aktuelle Datei als tmp.doc speichern.
Der text und der Code stimmen nicht ganz überein. Das Anschliessend stimmt
nicht, denn das SpeichernUnter steht innerhalb vom IF


If Dir("C:\TEMP\tmp.doc") = "tmp.doc" Then
Kill "C:\TEMP\tmp.doc"
End If
ActiveDocument.SaveAs FileName:="C:\TEMP\tmp.doc"

Kann die Datei überhaupt gelöscht werden, oder ist die noch offen?
- How to check if a file has already been opened by another user
http://word.mvps.org/faqs/macrosvba/CheckIfFileOpen.htm


Code würde ich so umbauen


If Not Len(Dir(Environ$("Temp") & "\tmp.doc") = 0 Then
Kill Environ$("Temp") & "\tmp.doc"
End If
ActiveDocument.SaveAs FileName:=Environ$("Temp") & "\tmp.doc"
Post by Dietmar Feuerer
damit der Rückgängig/Wiederherstellen-Speicher gelöscht wird
ActiveDocument.UndoClear



--
Thomas Gahler
MVP für WordVBA

- Windows XP (SP1), Office XP (SP3)
Dietmar Feuerer
2005-11-17 16:32:16 UTC
Permalink
Hallo Thomas,
Post by Thomas Gahler
Na welche Fehlermeldung denn und bei welcher Zeile, tztztzzzz das solltest
du uns scon flüstern...
sry, Laufzeitfehler 70... Zugriff verweigert
Post by Thomas Gahler
Kann die Datei überhaupt gelöscht werden, oder ist die noch offen?
Die Frage ist berechtigt; an die Möglichkeit dachte ich noch nicht... aber
man kann es wohl ausschließen; denn das Problem könnte nur dann auftreten,
wenn man das Makro unmittelbar wiederholt, ohne die vorübergehende tmp-Datei
unter ihrem richtigen Aktenzeichen zu speichern.
Post by Thomas Gahler
Code würde ich so umbauen
Sollte ich deshalb vor deinen Vorschlag noch abfragen, ob ...

If Not FileLocked(Len(Dir(Environ$("Temp") & "\tmp.doc"))) Then
If Not Len(Dir(Environ$("Temp") & "\tmp.doc")) = 0 Then
Kill Environ$("Temp") & "\tmp.doc"
End If
ActiveDocument.SaveAs FileName:=Environ$("Temp") & "\tmp.doc"
ActiveDocument.UndoClear
Else
MsgBox ("Das Makro wird abgebrochen, da die Zwischenspeicherung " & _
"nicht möglich ist. Tmp.doc-Datei schließen!")
Exit Sub
End If

Function FilieLocked habe ich von deinem Link übernommen. Jetzt klappt es
mit zwei tmp.doc-Dateien ohne dass eine Kopie geöffnet wird..oder wie soll
ich das verstehen?

Der Begriff "Environ$" ist für mich neu; im Internet fand ich, dass er dazu
dient um Umgebungsvariablen ermitteln.. heißt das, er bestimmt den Pfad zum
temporären Ordner?

Danke für die Hilfe und
lg Dietmar
Thomas Gahler
2005-11-18 09:57:09 UTC
Permalink
Hallo Dietmar
Post by Dietmar Feuerer
Post by Thomas Gahler
Na welche Fehlermeldung denn und bei welcher Zeile, tztztzzzz das solltest
du uns scon flüstern...
sry, Laufzeitfehler 70... Zugriff verweigert
Das ist doch schon mal was ;-))
Post by Dietmar Feuerer
Post by Thomas Gahler
Code würde ich so umbauen
Sollte ich deshalb vor deinen Vorschlag noch abfragen, ob ...
Fast...

Denn Len(Dir(Environ$("Temp") & "\tmp.doc")) gibt dir eine Zahl zurück, die
Anzahl der Zeichen die der Dateiname enthält.
Diesen Wert übergibst du an FileLocked, diese Funktion hat ein On Error
Resume Next drin, dies wird auch angesprochen, da du einen ungültigen
Dateinnamen (eine Zajl) übergibst. Also kommt immer False zurück.
Mit deinem Not FileLocked machst du aus dem immer False ein immer True was
ja nicht viel bringt....


Besser so: (ungetestet)

Dim cDateiName as String
cDateiName = Environ$("Temp") & "\tmp.doc"

If Not Len(Dir(cDateiName)) = 0 Then
If Not FileLocked(cDateiName) Then
Kill cDateiName
Else
MsgBox ("Das Makro wird abgebrochen, da die Zwischenspeicherung " & _
"nicht möglich ist. Tmp.doc-Datei schließen!")
Exit Sub
End If
ActiveDocument.SaveAs FileName:=cDateiName
ActiveDocument.UndoClear
End If
Post by Dietmar Feuerer
Der Begriff "Environ$" ist für mich neu; im Internet fand ich, dass er dazu
dient um Umgebungsvariablen ermitteln.. heißt das, er bestimmt den Pfad zum
temporären Ordner?
Jein, Envioron() gibt dir dern Wert der Umgebungsvariable zurück. Es gibt
auch eine Umgebungsvariable mit dem Namen TEMP und die enthält den Wert zum
im Betriebssystem definierten Temp-Verzeichnis

Anschauen unter Start -> Ausführen -> Cmd eingeben -> Set Enter auf der
Eingabeaufforderung eingeben, jetzt weisst du welche Umgebungsvariablen
vorhanden sind




--
Thomas Gahler
MVP für WordVBA

- Windows XP (SP1), Office XP (SP3)
Dietmar Feuerer
2005-11-22 08:24:01 UTC
Permalink
Hallo Thomas,

danke, das Makro bricht jetzt ab, wenn tmp.doc geöffnet ist.
Post by Thomas Gahler
Denn Len(Dir(Environ$("Temp") & "\tmp.doc")) gibt dir eine Zahl zurück, die
Anzahl der Zeichen die der Dateiname enthält.
Diesen Wert übergibst du an FileLocked, diese Funktion hat ein On Error
Resume Next drin, dies wird auch angesprochen, da du einen ungültigen
Dateinnamen (eine Zajl) übergibst. Also kommt immer False zurück.
Mit deinem Not FileLocked machst du aus dem immer False ein immer True was
ja nicht viel bringt....
Allerdings erzwingt das Makro den Aufruf von:
Function FileLocked(strFileName As String) As Boolean
On Error Resume Next
Open strFileName For Binary Access Read Lock Read As #1
Close #1
If Err.Number <> 0 Then
FileLocked = True
Err.Clear
End If
End Function

Das würde nach deinen Worten keinen Sinn machen. Brauche ich es dann trotzdem?

LG Dietmar
Thomas Gahler
2005-11-22 08:57:05 UTC
Permalink
Hallo Dietmar
Post by Dietmar Feuerer
danke, das Makro bricht jetzt ab, wenn tmp.doc geöffnet ist.
Was heisst 'das Makro bricht ab'? Funktioniert es so wie du willst oder
eben nicht?
Post by Dietmar Feuerer
Function FileLocked(strFileName As String) As Boolean
Das würde nach deinen Worten keinen Sinn machen. Brauche ich es dann trotzdem?
Kann deine Frage nicht ganz nachvollziehen. Aber du benötigst diese Funktion
um zuprüfen pb die Datei geöffnet ist.

Der Code wie ich ihn geliefert habe, prüft ob die Datei vorhanden ist.
Falls ja, wird noch geprüft ob die Datei nicht geöffnet ist.
Falls ja, dann wird gelöscht


--
Thomas Gahler
MVP für WordVBA

- Windows XP (SP1), Office XP (SP3)
Dietmar Feuerer
2005-11-24 08:29:08 UTC
Permalink
Hallo Thomas,
Post by Dietmar Feuerer
danke, das Makro bricht jetzt ab, wenn tmp.doc geöffnet ist.
Was heisst 'das Makro bricht ab'? Funktioniert es so wie du willst oder...
Sry, habe mich falsch ausgedrückt; das Makro läuft bestens; es ist mein
Wunsch,
dass es abbricht und ein Hinweis angezeigt wird, wenn die tmp.doc geöffnet
ist.
Post by Dietmar Feuerer
Function FileLocked(strFileName As String) As Boolean
Das würde nach deinen Worten keinen Sinn machen. Brauche ich es dann
trotzdem?
Kann deine Frage nicht ganz nachvollziehen. Aber du benötigst diese Funktion
um zuprüfen pb die Datei geöffnet ist.
Die Frage stellte ich, weil du in deiner zweiten Antwort moniert hast, dass
Post by Dietmar Feuerer
Diesen Wert übergibst du an FileLocked, diese Funktion hat ein On Error
Resume Next drin, dies wird auch angesprochen, da du einen ungültigen
Dateinnamen (eine Zajl) übergibst. Also kommt immer False zurück.
Mit deinem Not FileLocked machst du aus dem immer False ein immer True was
ja nicht viel bringt....
Der Code wie ich ihn geliefert habe, prüft ob die Datei vorhanden ist.
Falls ja, wird noch geprüft ob die Datei nicht geöffnet ist.
Falls ja, dann wird gelöscht
Eine Löschung erfolgt nicht. Dann müßte ich doch zuerst das Dok schließen und
dann löschen.

Danke und lG Dietmar
Christian Freßdorf
2005-11-22 09:16:53 UTC
Permalink
Hallo Dietmar,
Post by Dietmar Feuerer
Das würde nach deinen Worten keinen Sinn machen. Brauche ich es dann trotzdem?
ich würde es mit dieser Funktion machen, aber die Fehlernummer auswerten.

Public Function IsOpen(strFileName As String) As String
Dim FileNum As Long
IsOpen = "Datei nicht geöffnet"
On Error GoTo OpenError
FileNum = FreeFile
Open strFileName For Input Lock Read Write As FileNum
Close FileNum
Exit Function
OpenError:
IsOpen = Err.Description
End Function
--
Gruß Christian
~~~~~~~~~~~~
!Gebt Rückmeldung wenn Ihr weiterhin Antworten möchtet!
=> http://www.fruiture.de/perl/questions.html#intro
=> http://word.mvps.org
Dietmar Feuerer
2005-11-24 08:37:02 UTC
Permalink
Hallo Christian,

danke für deine Hilfe; ich werde deinen Vorschlag testen. Kannst du mir noch
den praktischen Unterschied verraten. Das Ergebnis ist doch dasselbe. Ist
dein Weg kürzer, einfacher, sicherer oder...einfach ein anderer Weg, aber
gleichwertig.

Ich muß gestehen, dass übersteigt mein Verständnis. Daher die Frage.

LG Dietmar
Christian Freßdorf
2005-11-24 08:44:41 UTC
Permalink
Hallo Dietmar,
Post by Dietmar Feuerer
danke für deine Hilfe; ich werde deinen Vorschlag testen. Kannst du mir noch
den praktischen Unterschied verraten. Das Ergebnis ist doch dasselbe. Ist
dein Weg kürzer, einfacher, sicherer oder...einfach ein anderer Weg, aber
gleichwertig.
Du meinst im Vergleich zu Deiner Funktion?

Ist prinzipiell gleichwertig. Da Du das Dok Öffnen/Lesen möchtest, würde
ich den normalen Open-Zugriff verwenden anstelle eines Binary Access
In Deiner Funktion wird die Datei als geöffnet bezeichnet, auch wenn dies
nicht stimmt, da z.B. mit Password versehen oder wenn ein anderer Fehler
auftritt (falscher Pfad oder Datei nicht vorhanden sind eine ganz böse
Falle).
Daher würde ich diese Funktion als etwas sicherer bezeichnen.

Aber viele Wege führen nach Rom.
--
Gruß Christian
~~~~~~~~~~~~
=> http://word.mvps.org
Dietmar Feuerer
2005-11-28 10:33:39 UTC
Permalink
Hallo Christian,

ich habe deine Lösung in den Voschlag von Thomas eingebaut.
If Not Len(Dir(cDateiName)) = 0 Then
If Not IsOpen(cDateiName) Then
Kill cDateiName
Else
MsgBox ("Das Makro wird abgebrochen, da die Zwischenspeicherung " & _
"nicht möglich ist. Tmp.doc-Datei schließen!")
End
End If
ActiveDocument.SaveAs FileName:=cDateiName
ActiveDocument.UndoClear
End If

Ich erhalte jetzt in der Zeile Exit Function die Fehlermeldung
Laufzeitfehler 13 - Typen unverträglich. Das Makro beginnt, wenn ich
auf Testen klicke, wieder bei
if not IsOpen(cDateiName) Then...

Welche Type is gemeint? Die Definitionen lauten:
Dim cDateiName As String
Public Function IsOpen(strFileName As String) As String
Dim FileNum As Long

Ich habe schon beide (cDateiName und FileNum) sowohl als String bzw. Long
ohne Erfolg deklariert.

Noch ein Gedanke: Wenn die doc-Datei geöffnet ist, wäre es ja möglich
zu der Datei zu springen (activeDocument("temp.doc").activate und zu löschen.
Nur wie springt man zurück, ohne dass ein Dateinamen vergeben werden muss.

Danke und LG Dietmar
Christian Freßdorf
2005-11-28 10:43:38 UTC
Permalink
Hallo Dietmar,
Post by Dietmar Feuerer
Ich erhalte jetzt in der Zeile Exit Function die Fehlermeldung
Laufzeitfehler 13 - Typen unverträglich. Das Makro beginnt, wenn ich
auf Testen klicke, wieder bei
if not IsOpen(cDateiName) Then...
eigentlich solltest Du inzwischen wissen, dass man keine Fehlermeldung ohne
relevanten Code posten soll.

Ansonsten: geh das mal im Einzelschritt durch und schau, an welcher Stelle
genau die Fehlermeldung kommt.
--
Gruß Christian
~~~~~~~~~~~~
!Gebt Rückmeldung wenn Ihr weiterhin Antworten möchtet!
=> http://www.fruiture.de/perl/questions.html#intro
=> http://word.mvps.org
Dietmar Feuerer
2005-11-28 11:55:03 UTC
Permalink
Hallo Christian,

sorry, die nachstehende Function wird abgearbeitet bis zur Zeile "Exit
Function", dann kommt die Fehlermeldung: Laufzeitfehler 13, - Typen
unverträglich

Public Function IsOpen(strFileName As String) As String
Dim FileNum As String
IsOpen = "Datei nicht geöffnet"
On Error GoTo OpenError
FileNum = FreeFile
Open strFileName For Input Lock Read Write As FileNum
Close FileNum
Exit Function
OpenError:
IsOpen = Err.Description
End Function

Das Makro springt wieder zurück zur Ausgangsposition in die Zeile
"If Not IsOpen(cDateiName) Then" (siehe unten) und startet von neuem.

Dim cDateiName As String
cDateiName = Environ$("Temp") & "\tmp.doc"
If Not Len(Dir(cDateiName)) = 0 Then
If Not IsOpen(cDateiName) Then
Kill cDateiName
Else
MsgBox ("Das Makro wird abgebrochen, da die Zwischenspeicherung " & _
"nicht möglich ist. Tmp.doc-Datei schließen!")
End
End If
ActiveDocument.SaveAs FileName:=cDateiName
ActiveDocument.UndoClear
End If

LG Dietmar
Christian Freßdorf
2005-11-28 12:04:32 UTC
Permalink
Hallo Dietmar,
Post by Dietmar Feuerer
If Not IsOpen(cDateiName) Then
hier wird ausgewertet, ob die Funktion den Rückgabewert "True" liefert.
Dies passt latürnich nicht zur Funktions-Deklaration "As String"

Also musst Du entweder die Abfrage oder die Funktion umformulieren:

Public Function IsOpen(strFileName As String) As Boolean
Dim FileNum As String
IsOpen = True
On Error GoTo OpenError
FileNum = FreeFile
Open strFileName For Input Lock Read Write As FileNum
Close FileNum
GoTo Exit_Function
OpenError:
IsOpen = False
Exit_Function:
End Function
--
Gruß Christian
~~~~~~~~~~~~
!Gebt Rückmeldung wenn Ihr weiterhin Antworten möchtet!
=> http://www.fruiture.de/perl/questions.html#intro
=> http://word.mvps.org
Thomas Gahler
2005-11-28 12:16:24 UTC
Permalink
Hallo Christian
Post by Christian Freßdorf
Public Function IsOpen(strFileName As String) As Boolean
Boolean - Jetzt sind wir wieder gleichweit wie am Anfang des Threads ;-))


--
Thomas Gahler
MVP für WordVBA

- Windows XP (SP1), Office XP (SP3)
Christian Freßdorf
2005-11-28 12:23:14 UTC
Permalink
Hallo Thomas,
Post by Thomas Gahler
Boolean - Jetzt sind wir wieder gleichweit wie am Anfang des Threads ;-))
womit sich zeigt, dass sich manchmal das Einfachere eben doch duchsetzt :-)

Aber Dieter sollte jetzt wissen, wo er ansetzen kann, wenn er doch "As
String" verwenden möchte.
--
Gruß Christian
Christian Freßdorf
2005-11-28 12:24:16 UTC
Permalink
Hallo Thomas,
Post by Thomas Gahler
Boolean - Jetzt sind wir wieder gleichweit wie am Anfang des Threads ;-))
womit sich zeigt, dass sich manchmal das Einfachere eben doch duchsetzt :-)

Aber Dietmar sollte jetzt wissen, wo er ansetzen kann, wenn er doch "As
String" verwenden möchte.
--
Gruß Christian
Dietmar Feuerer
2005-12-01 11:05:02 UTC
Permalink
Hallo Christian,

wenn ich es richtig verstanden habe, dann liegt doch das Problem darin, dass
aufgrund der Error-Anweisung Function FileLocked/IsOpen immer das Ergebnis
FileLocked = True bzw. IsOpen = False liefert. Bedeutet das, dass beim Fehlen
der Error-Anweisung dann je nachdem true oder false zurückgegeben würde.

Würde die jeweils andere Rückgabe "False/True" dann durch das Makro nicht
mit der If-Anweisung für If Not FileLocked oder If IsOpen abgefangen und zu
einem richtigen Ergebnis führen, da es doch noch die Else-Anweisung gibt.

Ich hoffe, die Frage war nicht zu dumm. Danke für die Hilfe und
lg Dietmar
Dietmar Feuerer
2005-12-01 11:06:02 UTC
Permalink
Hallo Thomas,

wenn ich es richtig verstanden habe, dann liegt doch das Problem darin, dass
aufgrund der Error-Anweisung Function FileLocked/IsOpen immer das Ergebnis
FileLocked = True bzw. IsOpen = False liefert. Bedeutet das, dass beim Fehlen
der Error-Anweisung dann je nachdem true oder false zurückgegeben würde.

Würde die jeweils andere Rückgabe "False/True" dann durch das Makro nicht
mit der If-Anweisung für If Not FileLocked oder If IsOpen abgefangen und zu
einem richtigen Ergebnis führen, da es doch noch die Else-Anweisung gibt.

Ich hoffe, die Frage war nicht zu dumm. Danke für die Hilfe und
lg Dietmar

Lesen Sie weiter auf narkive:
Loading...