ich möchte eine Word-Datei, die ich aktuell bearbeite, alle X Minuten
in ein spezielles Verzeichnis kopieren.
Ich hab zu 50% erfolgrech ein Makro geschrieben, mit dem der aktuelle
Pfad und Dateiname die gerade geöffneten Datei ausgelesen, mittels
ActiveDocument.SaveAs mit einem Speziellen Namen neu abgespeichert
wird und anschließend nochmals mittels ActiveDocument.SaveAs mit den
ursprünglichen Parametern wieder "zurückgespeichert" wird.
Funktioniert, wie gesagt, zu 50%, da die erstellten Dateien als "in
Benutzung" erkannt werden, wenn ich die ursprüngliche Datei nach dem
zurückspeichern schließe und dann wieder öffnen will.
Deshalb:
Gibts eine Möglichkeit mittels eines Makros das aktuell geöffnete
Dokument, so zu sagen mittels der normalen Explorerfunktion, in einen
anderen Ordner zu kopieren?
Wenn ja, wie? Gibts irgendwo Codes/Codeteile, mit denen man da smachen
könnte?
Danke schonmal!
Grüße,
Andreas
> ich möchte eine Word-Datei, die ich aktuell bearbeite, alle X Minuten
> in ein spezielles Verzeichnis kopieren.
sieh Dir mal die Lösung von Christian an:
http://www.chf-online.de/vba/vbaspeichernunter.htm
Gruß
Lisa
_____
http://www.schreibbuero-richter.de/vba.html
> sieh Dir mal die Lösung von Christian an:
>
> http://www.chf-online.de/vba/vbaspeichernunter.htm
Danke für den Hinweis, die Seite werde ich mir in jedem Fall
Bookmarken. Ich hab zumindest die Datumsformatierung daraus entnommen.
Wenn ich Christians Lösung richtig verstanden habe, ist meine
ursprüngliche Lösung zumindest "ähnlich"...
----------------------------<SNIP>------------------------------------
Sub Save()
AktDateiPfadName = ActiveDocument.Path & "\" & ActiveDocument.Name
SicherungsPfad = "C:\Users\[User]\Desktop\AutoSpeichern\TestOrdner"
If ActiveDocument.Saved = False Then
ActiveDocument.Save
End If
strDocName = SicherungsPfad & "\Sicherungskopie_" _
& Format(Date, "yymmdd") & "_" _
& Format(Time, "hhmm") & "_" & ActiveDocument.Name
ActiveDocument.SaveAs FileName:=strDocName, _
FileFormat:=wdFormatDocument
Pausenlänge = 2 ' Dauer festlegen. Um Speichern abschließen
zu lassen
Start = Timer ' Anfangszeit setzen.
Do While Timer < Start + Pausenlänge
DoEvents
Loop
ActiveDocument.SaveAs FileName:=AktDateiPfadName, _
FileFormat:=wdFormatDocument
End If
End Sub
----------------------------<SNAP>-----------------------------------
Wenn ich diesen Code laufen lassen, dann bekomme ich einen
Laufzeitfehler "5353", mit dem Kommentar:
*********************
Die Datei kann nicht gespeichert werden, solange sie von einem anderen
Vorgang benutzt wird. Speichern Sie die Datei unter einem anderen
Namen. (C:\...\[Dateiname der gerade erstellten Sicherungskopie]
*********************
Und wenn ich den Fehler wegklicke, das gerade geöffnete Dokument
schließe (was ja in diesem Momen die Sicherungskopie ist), um das
ursprüngliche, zu sichernde Dokuemtn wieder zu öffnen, dann erhalte
ich die Fehlermeldung
###############
Fehler beim Öffnen der Datei in Word.
Versuchen Sie folgendes:
*Überprüfen Sie die Dateiberechtigungen für das Dokuement oder
Laufwerk.
*Stellen Sie sicher, dass genügend Arbeitsspeicher.....
*Öffnen Sie die Datei mit dem Wiederherstellen-Textkonverter.
(C:\...\[Name der zu öffnenden Original-Datei]
###############
Blöderweise bring noch nicht mal mehr ein Neustart des Rechners, daß
diese letzte Fehlermeldung nicht weiter erschient...
Weiß jemand Rat?
Ich freu mich auf Antworten!!!
Sonnige Grüße
(bei dem schönen Wetter kann man ja echt in kurzen Hosen vor dem
Rechner sitzen...! ;-) )
Andreas
Dein Code hat mehrere Knackpunkte:
> ----------------------------<SNIP>------------------------------------
> Sub Save()
>
> AktDateiPfadName = ActiveDocument.Path & "\" & ActiveDocument.Name
> SicherungsPfad = "C:\Users\[User]\Desktop\AutoSpeichern\TestOrdner"
>
> If ActiveDocument.Saved = False Then
> ActiveDocument.Save
> End If
>
> strDocName = SicherungsPfad & "\Sicherungskopie_" _
> & Format(Date, "yymmdd") & "_" _
> & Format(Time, "hhmm") & "_" & ActiveDocument.Name
>
>
> ActiveDocument.SaveAs FileName:=strDocName, _
> FileFormat:=wdFormatDocument
Bis hierher in Ordnung. Jedoch wird bei SaveAs ein neues Dokument erzeugt.
Das muss explizit geschlossen werden, sonst bleibt es offen (wie Du ja
bereits leidvoll festgestellt hast).
> Pausenlänge = 2 ' Dauer festlegen. Um Speichern abschließen
> zu lassen
> Start = Timer ' Anfangszeit setzen.
> Do While Timer < Start + Pausenlänge
> DoEvents
> Loop
Ist nicht nötig: DoEvents reicht aus.
> ActiveDocument.SaveAs FileName:=AktDateiPfadName, _
> FileFormat:=wdFormatDocument
Wenn Du mit dem ursprünglichen Dokument weitermachen willst, musst Du es
erst wieder öffnen! Es wurde bei SaveAs nämlich geschlossen! Du versuchst
folglich, das neue Dokument (das jetzt das active ist) unter dem Namen des
alten zu speichern. Dagegen wehrt sich Word, weil es die alte Datei nicht
überschreiben will.
Probier mal das hier, aber bitte in der Dokumentvorlage (!) speichern, nicht
im Dokument selbst:
Sub Save()
Dim docA As Word.Document
Dim docB As Word.Document
Dim strSicherungspfad As String
Dim strDocName As String
Dim strAktDatei As String
strSicherungspfad = "C:\Users\[User]\Desktop\AutoSpeichern\TestOrdner"
strAktDatei = ActiveDocument.FullName
Set docA = ActiveDocument
'aktuelles Dokument in die Variable
If docA.Saved = False Then
docA.Save
End If
strDocName = strSicherungspfad & _
Application.PathSeparator & _
"Sicherungskopie_" & _
Format(Date, "yymmdd") & _
"_" & Format(Time, "hhmm") & _
"_" & docA.Name
docA.SaveAs FileName:=strDocName, _
FileFormat:=wdFormatDocument
DoEvents
Set docB = ActiveDocument
'das neu entstandene Dokument (in dem neuen Pfad)
'ist jetzt das aktuelle, in die Variable nehmen
Set docA = Application.Documents.Open(strAktDatei)
'ursprüngliche Datei wieder öffnen
docB.Close wdSaveChanges
'Sicherungskopie schließen
docA.Activate
'ursprüngliche Datei vorsichtshalber aktivieren
End Sub
> Wenn ich diesen Code laufen lassen, dann bekomme ich einen
> Laufzeitfehler "5353", mit dem Kommentar:
>
>
> *********************
> Die Datei kann nicht gespeichert werden, solange sie von einem anderen
> Vorgang benutzt wird. Speichern Sie die Datei unter einem anderen
> Namen. (C:\...\[Dateiname der gerade erstellten Sicherungskopie]
Oben bereits erklärt, die Datei ist noch offen.
> Blöderweise bring noch nicht mal mehr ein Neustart des Rechners, daß
> diese letzte Fehlermeldung nicht weiter erschient...
Lösch am besten die entstandenen Temp-Dateien und "Leichen" (Dateien, die
mit $ oder ~ anfangen.
Darf ich auch noch was zum Code beitragen... ;-)
>> SicherungsPfad = "C:\Users\[User]\Desktop\AutoSpeichern\TestOrdner"
Machen wir doch mit einem API dynamischer, oder?
Mit den nachstehenden Zeilen kannst du alle Spezialordner bestimmen.
' --------- --------- --------- --------- ---------
Option Explicit
Const MAX_PATH As Integer = 260
Const NOERROR As Integer = 0
'API zum bestimmen der Adresse eines 'SpecialFolders'
Private Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" (ByVal
hwndOwner As Long, ByVal nFolder As Long, pidl As ITEMIDLIST) As Long
'Konstanten zum API definieren.
Public Const CSIDL_DESKTOP = &H0
Public Const CSIDL_PROGRAMS = &H2
Public Const CSIDL_CONTROLS = &H3
Public Const CSIDL_PRINTERS = &H4
Public Const CSIDL_PERSONAL = &H5
Public Const CSIDL_FAVORITES = &H6
Public Const CSIDL_STARTUP = &H7
Public Const CSIDL_RECENT = &H8
Public Const CSIDL_SENDTO = &H9
Public Const CSIDL_BITBUCKET = &HA
Public Const CSIDL_STARTMENU = &HB
Public Const CSIDL_DESKTOPDIRECTORY = &H10
Public Const CSIDL_DRIVES = &H11
Public Const CSIDL_NETWORK = &H12
Public Const CSIDL_NETHOOD = &H13
Public Const CSIDL_FONTS = &H14
Public Const CSIDL_TEMPLATES = &H15
'Typen zum API definieren.
Private Type SHITEMID
cb As Long
abID As Byte
End Type
Private Type ITEMIDLIST
mkid As SHITEMID
End Type
'API zum umwandeln der PIDL-Adresse in einen Pfad
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias
"SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Public Function funcGetSpecialfolder(CSIDL As Long) As String
Dim IDL As ITEMIDLIST
Dim lReturn As Long
Dim cPath As String
'Speicherplatz vorbelegen.
cPath = String$(MAX_PATH, Chr$(0))
'Adresse des SpecialFolders ermitteln
lReturn = SHGetSpecialFolderLocation(0, CSIDL, IDL)
'Pfad aus der IDList ermitteln
If lReturn = NOERROR Then
lReturn = SHGetPathFromIDList(ByVal IDL.mkid.cb, ByVal cPath)
End If
'Effektiven Pfad extrahieren
funcGetSpecialfolder = Left$(cPath, InStr(cPath, Chr$(0)) - 1)
End Function
Private Sub Demo()
Dim cText As String
cText = cText & "Start menu folder: " & vbTab &
funcGetSpecialfolder(CSIDL_STARTMENU) & vbCr
cText = cText & "Favorites folder: " & vbTab &
funcGetSpecialfolder(CSIDL_FAVORITES) & vbCr
cText = cText & "Programs folder: " & vbTab &
funcGetSpecialfolder(CSIDL_PROGRAMS) & vbCr
cText = cText & "Desktop folder: " & vbTab &
funcGetSpecialfolder(CSIDL_DESKTOP) & vbCr
MsgBox cText
End Sub
' --------- --------- --------- --------- ---------
>> strDocName = SicherungsPfad & "\Sicherungskopie_" _
>> & Format(Date, "yymmdd") & "_" _
>> & Format(Time, "hhmm") & "_" & ActiveDocument.Name
Machen wir doch gelich am Stück. Ist übersichtlicher
- Format$(Now, "yymmdd_hhnn")
> Ist nicht nötig: DoEvents reicht aus.
Und für was benötigst du den überhaupt? Habe ich noch nicht begriffen
--
Thomas Gahler
MVP für Word
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)
- Windows Vista (SP1), Office 2007 (SP?)
Klar doch. Word-VBA kann auch FileCopy ausführen.
Die Datei wird gesichert, geschlossen, kopiert und wieder geöffnet.
Beispiel siehe unten, wobei die Umbrüche wieder raus müssen.
Hang loose, Hartwig
'#############
'Speichert ein benanntes Dokument und legt eine zusätzliche Sicherungskopie an
Public Sub saveDocumentCopy()
On Error GoTo saveDocumentCopy
Dim sDokName As String, sDokExtender As String, sFullName As String
Dim posDot As Long
Dim sZielDatei As String
Dim sZielpfad As String 'oder mit übergeben lassen
'Dokument hat schon einen Namen?
sFullName = ActiveDocument.FullName
If InStr(1, sFullName, "\") < 1 Then
MsgBox "Für ein unbenanntes Dokument ist keine zusätzliche
Dokumentsicherung vorgesehen." & vbCrLf & "Bitte speichern Sie Ihr Dokument
zunächst auf die 'normale' Art.", vbInformation, "Zusätzliche Sicherung des
Word-Dokumentes nicht möglich"
Exit Sub
End If
'Teile des Dokumentnamens bestimmen
posDot = InStrRev(ActiveDocument.Name, ".")
'Word97 kennt noch kein InstrRev, dann statt dessen den Else-Zweig nehmen
If posDot > 0 Then
sDokName = Left(ActiveDocument.Name, posDot - 1)
sDokExtender = Mid(ActiveDocument.Name, posDot)
Else
sDokName = Left(ActiveDocument.Name, Len(ActiveDocument.Name) - 4)
'bei 3-Zeichen-Extendern
sDokExtender = Mid(ActiveDocument.Name, Len(sDokName) + 1)
End If
'Das Zielverzeichnis muss bekannt sein (hart verdrahtet)
'oder der Funktion mit übergeben werden
'oder via BrowseForFolder ermittelt werden
If Len(sZielpfad) < 3 Then
'Hier hart verdrahtet
sZielpfad = "C:\Temp"
End If
If Right(sZielpfad, 1) <> "\" Then sZielpfad = sZielpfad & "\"
'Es steht so jede Sekunde ein neuer Dateiname zur Verfügung.
'Es wird deshalb nicht geprüft, ob bereits eine gleichnamige Datei
vorhanden ist.
'Alternativ könnte man auf DatumUhrzeit im Dateinamen verzichten
'und statt dessen eine laufende Nummer hochzählen.
sZielDatei = sDokName & "_" & Format(Now, "yymmddhhmmss") & sDokExtender
'Dokument sichern und schließen, um FileCopy zu ermöglichen
ActiveDocument.Close wdSaveChanges
'Kopieren ausführen
FileCopy sFullName, sZielpfad & sZielDatei
'Dokument wieder öffnen
Documents.Open sFullName
Exit Sub
saveDocumentCopy:
'auf eine detaillierte Fehlerbehandlung wird hier verzichtet
MsgBox Err.Description, vbCritical, "Fehler in saveDocumentCopy"
Debug.Print Err.Description
End Sub
> Klar doch. Word-VBA kann auch FileCopy ausf�hren.
> Die Datei wird gesichert, geschlossen, kopiert und wieder ge�ffnet.
Ist das (schlie�en und wieder �ffnen) wirklich n�tig? Zumindest meinem
Word 2003 kann ich (wie dem Word 97 vorher) die ge�ffnete Datei unterm
Hintern wegkopieren. Es ist ja in manchen Situationen gar nicht h�bsch,
wenn unver�nderte Dateien durch so eine Aktion ein neueres Speicherdatum
kriegen ...
> Ist das (schließen und wieder öffnen) wirklich nötig?
Für die ursprüngliche Fragestellung auf jeden Fall.
> Zumindest meinem
> Word 2003 kann ich (wie dem Word 97 vorher) die geöffnete Datei unterm
> Hintern wegkopieren.
'Unterm Hintern' hast Du den Dokumentenzustand vor der letzten Öffnung bzw.
ggf. nach der letzten Zwischensicherung. Die letzten Bearbeitungen sind nicht
drin.
> Es ist ja in manchen Situationen gar nicht hübsch,
> wenn unveränderte Dateien durch so eine Aktion ein neueres Speicherdatum
> kriegen ...
Dann musst Du noch eine Anfangskopie machen, die Du bei Bedarf
zurückkopierst, wenn Du den alten Zustand doch behalten willst.
Hang loose, Hartwig