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
 
Beispiel-Aufruf
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
 
Weitere Links zum Thema
Dokumente konvertieren

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: [ 565 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Samstag, 30. Juli 2011