Tipp 0457
|
Dokumente bearbeiten
|
 |
|
Autor/Einsender: Datum: |
|
Angie 30.07.2005 |
|
Entwicklungsumgebung: |
|
Word 2000 |
|
|
Sollen mehrere Dokumente in einer Schleife geöffnet, bearbeitet, und gespeichert/überschrieben werden,
dann handelt es sich meistens um eine einmalige Aktion. Aber auch bei einer einmaligen Aktion wäre es
sehr störend, wenn bei jedem eventuell aufgetretenen "Fehler" eine Mitteilung (MsgBox) oder Dialog
angezeigt werden würde. Das heißt, dass es auf jeden Fall sinnvoll ist, eine möglichst umfangreiche
Fehlerbehandlung zu programmieren und wenn alle Dokumente abgearbeitet sind, ggf. eine
Log-Datei zu schreiben, in der die Dateinamen und die aufgetretenen "Fehler" protokolliert
werden.
|
|
Prozedur zum Bearbeiten der Dokumente |
|
Der Prozedur zum Bearbeiten der Word-Dokumente wird
|
- ein Datenfeld mit den Dateinamen der Word-Dokumente
(inkl. Pfad)
|
- und optional das Lese-/ und Schreibkennwort für Dokumente, die ggf. kennwortgeschützt sind,
|
übergeben.
|
Die Dokumente werden in einer neu erstellten Word-Instanz nacheinander bearbeitet, in diesem
Fall wird mit der Find-Methode Text ersetzt. In der Statusleiste der sichtbaren
aktiven Word-Instanz wird der aktuelle Status der Bearbeitung angezeigt.
|
Um eine reibungslose Ausführung der Prozedur für die Bearbeitung der Dokumente zu ermöglichen,
also ohne "störende" Dialoge oder Fehlermeldungen usw., wurden die folgenden Punkte berücksichtigt:
|
Auto-Makros
|
Dokumente und/oder Dokumentvorlagen können sogenannte
Auto-Makros,
Ereignisse des Application-Objekts
und/oder
Ereignisse des Document-Objekts
beinhalten, die beispielsweise beim Öffnen und/oder Schließen der Dokumente automatisch ausgeführt werden.
Mit der WordBasic-Funktion DisableAutoMacros wird die Ausführung von Auto-Makros verhindert.
|
Schreibschutz / Zugriff verweigert
|
Das Dokument ist im Explorer mit dem Attribut 'Schreibgeschützt' versehen.
Hier würde nach der Bearbeitung der Dialog 'Speichern unter ...' angezeigt werden.
|
Das Dokument ist in Bearbeitung von User X.
Da in diesem Beispiel die Dokumente zur Bearbeitung in einer neu erstellten Word-Instanz geöffnet
werden, würde hier der Word-Dialog angezeigt werden, in dem man auswählen kann, ob eine
schreibgeschützte Kopie geöffnet oder ob man benachrichtigt werden soll, wenn das
Dokument bearbeitet werden kann.
|
Für die Prüfung, ob das Dokument zur Bearbeitung (Schreibzugriff) geöffnet werden kann, wurde
die Funktion IsFileReadyOnly() aus unserem Tipp
Dokument schreibgeschützt? verwendet.
Der Code der Funktion ist hier nicht abgebildet, jedoch im Download-Beispiel enthalten.
|
Lese-/Schreibkennwort
|
Das Dokument ist mit einem Lese- und/oder Schreibkennwort versehen.
Um zu verhindern, dass der Word-Dialog für die Kennwort-Eingabe angezeigt wird, kann hier entweder
ein gültiges Lese-/ und Schreibkennwort angegeben werden, oder aber auch ein "Dummy"-Kennwort.
Werden gültige Kennwörter angegeben, wird das Dokument zur Bearbeitung geöffnet, andernfalls nicht.
|
Dokumentschutz
|
Das Dokument ist mit einem Dokumentschutz versehen.
Mit der ProtectionType-Eigenschaft lässt sich prüfen, ob das zur Bearbeitung geöffnete
Dokument mit einem Dokumentschutz für Kommentare oder verfolgten Änderungen oder einem Formularschutz
versehen ist. In diesem Beispiel wird eine Fehlermeldung ausgegeben, wenn das Dokument mit einem
Dokumentschutz versehen ist.
|
|
|
Private Const mc_MsgTitle As String = _
"VB-fun-Demo - Dokumente bearbeiten"
Private Const mc_ErrLogFile As String = "Error.log"
Public Sub EditWordDocs(ByRef astrWDFiles() As String, Optional _
strDocPWD As Variant, Optional strDocWritePWD As Variant)
Dim objWDApp As Word.Application
Dim objWDDoc As Word.Document
Dim objWDRng As Object
Dim FN As Integer
Dim nFilesCnt As Long
Dim nFile As Long
Dim strFileName As String
Dim nFilesChanged As Long
Dim blnSaveChanges As Boolean
Dim strErrTmp As String
Dim strErrLog As String
Dim strMsg As String
nFilesCnt = -1
On Error Resume Next
Set objWDApp = CreateObject("Word.Application")
If Err.Number = 0 Then
objWDApp.WordBasic.DisableAutoMacros 1
If IsMissing(strDocPWD) Or Len(strDocPWD) = 0 Then
strDocPWD = "PWD"
End If
If IsMissing(strDocWritePWD) Or Len(strDocWritePWD) = 0 Then
strDocWritePWD = "PWD"
End If
nFilesCnt = UBound(astrWDFiles)
For nFile = 0 To nFilesCnt
blnSaveChanges = False
strErrTmp = ""
strFileName = astrWDFiles(nFile)
ThisDocument.Application.StatusBar = "Bitte warten... " & _
"Dokument " & CStr(nFile + 1) & " von " & _
CStr(nFilesCnt + 1) & " wird bearbeitet - " & strFileName
DoEvents
If Not IsFileReadyOnly(strFileName, strErrTmp) Then
Set objWDDoc = objWDApp.Documents.Open( _
FileName:=strFileName, ConfirmConversions:=False, _
ReadOnly:=False, AddToRecentFiles:=False, _
PasswordDocument:=strDocPWD, _
WritePasswordDocument:=strDocWritePWD)
If Err.Number = 0 Then
If objWDDoc.ProtectionType = wdNoProtection Then
Set objWDRng = objWDDoc.Content
With objWDRng.Find
.Text = "VB-fun"
.Replacement.Text = "VB-fun-Demo"
.Execute Replace:=wdReplaceAll
End With
Set objWDRng = Nothing
If Err.Number = 0 Then
nFilesChanged = nFilesChanged + 1
blnSaveChanges = True
Else
strErrTmp = Err.Description
End If
Else
strErrTmp = "Dokumentschutz ist aktiviert."
End If
objWDDoc.Close blnSaveChanges
Set objWDDoc = Nothing
Else
strErrTmp = "Dokument konnte nicht geöffnet werden. " & _
"Kennwortgeschützt!?"
End If
End If
If Len(strErrTmp) > 0 Then
strErrLog = strErrLog & vbCrLf & vbCrLf & _
strFileName & vbCrLf & strErrTmp
End If
Next nFile
objWDApp.WordBasic.DisableAutoMacros 0
objWDApp.Quit
Set objWDApp = Nothing
Else
MsgBox "Es konnte keine neue Word-Instanz erstellt werden!", _
vbOKOnly + vbCritical, mc_MsgTitle
End If
exit_Sub:
On Error Resume Next
If nFilesCnt > -1 Then
nFilesCnt = nFilesCnt + 1
If nFilesChanged < nFilesCnt Then
If nFilesChanged = 0 Then
strMsg = "Es ist bei allen Dokumenten ein Fehler" & _
" aufgetreten!"
Else
strMsg = nFilesChanged & " Dokument(e) von " & _
nFilesCnt & " konnte(n) bearbeitet werden!"
End If
Else
strMsg = "Alle Dokumente wurde erfolgreich bearbeitet!"
End If
Else
strMsg = "Es wurden keine Dokumente bearbeitet!"
End If
If Len(strErrLog) > 0 Then
strErrLog = "*** " & mc_MsgTitle & vbCrLf & "*** " & _
Format$(Now(), "yyyy-mm-dd hh:mm:ss") & vbCrLf & _
vbCrLf & "In den folgenden Dokumenten sind " & _
"Fehler aufgetreten:" & vbCrLf & strErrLog
Dim strErrLogPath As String
strErrLogPath = ThisDocument.Path
If WriteErrLogFile(strErrLogPath, strErrLog) Then
strMsg = strMsg & vbCrLf & vbCrLf & _
"Die aufgetretenen Fehler können der Log-Datei '" & _
mc_ErrLogFile & "' im Verzeichnis '" & strErrLogPath & _
"' entnommen werden!"
End If
End If
If Len(strMsg) > 0 Then
MsgBox strMsg, vbOKOnly + vbInformation, mc_MsgTitle
End If
On Error GoTo 0
End Sub
Private Function WriteErrLogFile(ByVal strPath As String, _
ByVal strErrMsg As String) As Boolean
Dim strFileName As String
Dim FN As Integer
If Right$(strPath, 1) <> "\" Then strPath = strPath & "\"
strFileName = strPath & mc_ErrLogFile
FN = FreeFile()
On Error Resume Next
Open strFileName For Output As #FN
If Err.Number = 0 Then
Print #FN, strErrMsg
Close #FN
WriteErrLogFile = True
End If
On Error GoTo 0
End Function
|
|
|
|
In folgendem Beispiel-Aufruf wurde für die Ermittlung der Word-Dokumente im vorgegebenen Verzeichnis
die Funktion GetWDFiles() aus unserem Tipp
Dateien in vorgegebenen Verzeichnis ermitteln verwendet.
Der Code der Funktion ist hier nicht abgebildet, jedoch im Download-Beispiel enthalten.
|
|
|
Public Sub Start_EditWordDocs()
Dim strPathDocs As String
Dim astrWDFiles() As String
Dim strDocPWD As String
Dim strDocWritePWD As String
Dim blnStatusBar As Boolean
strPathDocs = ThisDocument.Path & "\TestDateien\"
strDocPWD = "lesen"
strDocWritePWD = "schreiben"
If Len(Dir$(strPathDocs, vbDirectory)) > 0 Then
If GetWDFiles(astrWDFiles(), strPathDocs, False) Then
With ThisDocument.Application
blnStatusBar = .DisplayStatusBar
.DisplayStatusBar = True
End With
Call EditWordDocs(astrWDFiles(), strDocPWD, strDocWritePWD)
With ThisDocument.Application
.StatusBar = mc_MsgTitle & " - Fertig !"
.DisplayStatusBar = blnStatusBar
End With
Application.ScreenRefresh
Erase astrWDFiles
Else
MsgBox "Keine Word-Dokumente im Verzeichnis " & vbCrLf & _
strPathDocs & " gefunden!", vbInformation, _
mc_MsgTitle
End If
Else
MsgBox "Das Verzeichnis " & vbCrLf & strPathDocs & vbCrLf & _
"existiert nicht!", vbInformation, mc_MsgTitle
End If
End Sub
|
|
|
|
|
Windows-Version |
95 |
 |
|
98 |
 |
|
ME |
 |
|
NT |
 |
|
2000 |
 |
|
XP |
 |
|
Vista |
 |
|
Win
7 |
 |
|
|
Word-Version |
95 |
 |
|
97 |
 |
|
2000 |
 |
|
2002
(XP) |
 |
|
2003 |
 |
|
2007 |
 |
|
2010 |
 |
|
|
|
Download (37,4 kB)
|
Downloads bisher: [ 632 ]
|
|
|