1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

vb Makro in Word: Word stürtzt nach einer Weile ab

Discussion in 'Programmieren' started by scullhead, May 20, 2009.

Thread Status:
Not open for further replies.
  1. scullhead

    scullhead Byte

    Hallo alle zusammen,

    ich habe mich diesmal an einem Makro in MS Word versucht. Hier eine kurze Beschreibung was das Makro macht:

    - ein Ordner mit enthaltenen Dateien wird in einem Textfeld angegeben
    - über einen Button wird die Dateiliste eingelesen und die Dateinamen an eine ListBox übergeben

    Das funktioniert soweit auch problemlos - die Dateinamen erscheinen in der List Box

    => Später soll man dann eine (Text)Datei in der Listbox anwählen und den enthaltenen Text in Das Word Dokument einfügen können
    (noch nicht realisiert)

    Das Makro funktioniert wie gesagt an sich einwandfrei - die Dateinamen erscheinen in der Listbox, es kann gescrollt und einzelne Einträge markiert werden. Nach ca. 1 Minute nachdem die Dateien eingelesen wurden kommt die standard Windows Fehlermeldung "Microsoft Office Word hat ein Problem festgestellt und muss beendet werden..."
    und Word stürzt ab.

    Ich finde leider keine Ursache dafür. Nachfolgend mal der komplette Quellcode des Makros:

    Code:
    Option Base 1
    
    Private Sub btnAuflisten_Click()
      Dim ablagepfad As String
      Dim dateiliste()
      Dim index, anzahl As Long
      Dim fs
      
      listMails.Clear
      
      'Prüfen ob Ordnerangabe leer ist
      ablagepfad = txtAblagepfad.Text
      If ablagepfad = "" Then
        MsgBox "Es wurde kein Pfad angegeben!", vbCritical
        Exit Sub
      End If
      
      'Prüfen ob angegebener Ordner existiert
      If (Dir(ablagepfad, vbDirectory) = "") Then
        MsgBox "Der Ordner" & vbNewLine & ablagepfad & vbNewLine & "existiert nicht!", vbCritical
        Exit Sub
      End If
      
      dateiliste = readfolder(ablagepfad, "*.*")
      anzahl = UBound(dateiliste)
      
      For index = 1 To anzahl
       listMails.AddItem index & ": " & dateiliste(index)
      Next
      
      
      
    End Sub
    
    'Dateipfad browsen
    Private Sub btnBrowsen_Click()
      Dim AppShell As Object
      Dim BrowseDir As Variant
      Dim Pfad As String
      
      Set AppShell = CreateObject("Shell.Application")
      Set BrowseDir = AppShell.BrowseForFolder(0, "Ordner auswählen", &H1000, 17)
      
      On Error Resume Next
      Pfad = BrowseDir.items().Item().path
      If Pfad = "" Then Exit Sub
      
      txtAblagepfad.Text = Pfad & "\"
      
      Set AppShell = Nothing
      Set BrowseDir = Nothing
    End Sub
    
    'Inhalt des angegebenen Ordners in ein Array schreiben (Dateinamen)
    Private Function readfolder(path, file_extension As String)
      Dim filelist()
      Dim filecount, index As Long
      Dim filename As String
      
      If path = "" Then
        MsgBox "Es wurde kein Ordner angegeben!", vbCritical
        Exit Function
      End If
      
      'falls keine Dateierweiterung übergeben wurde
      If file_extension = "" Then
        file_extension = "*.*"
      End If
    
      filename = Dir(path & file_extension, vbNormal)
      filecount = 0
       
      On Error Resume Next
      'Ordner durchgehen um Anzahl der Dateien zu ermitteln
      Do While filename <> ""
       filename = Dir
       If filename <> "" Then
         filecount = filecount + 1
       End If
      Loop
      'array anpassen
      
      ReDim filelist(filecount)
      
      filename = Dir(path & file_extension, vbNormal)
     
      For index = 1 To filecount
        filename = Dir
        filelist(index) = filename
      Next
      
      readfolder = filelist
    
    End Function
    
    'Abschließender Backslash anfügen falls er fehlt
    Private Sub txtAblagepfad_LostFocus()
      If (Right(txtAblagepfad.Text, 1) <> "\") And (txtAblagepfad.Text <> "") Then
        txtAblagepfad.Text = txtAblagepfad.Text & "\"
      End If
    End Sub
    
    
    p.S. das ganze Läuft unter Word 2003

    Wäre super wenn mir jemand einen Tipp geben könnte.
    :danke:
     
  2. Urs2

    Urs2 Megabyte

    Hallo scullhead,

    Ich habe das Makro in meinem Word2003 eingef&#252;gt, eine Listbox und eine Textbox ins Dokument gesetzt (keine Buttons) und das Makro btnAuflisten im VB-Editor gestartet.
    Das btnBrowsen musste ich gar nicht mehr testen...
    Das btnAuflisten tat was es sollte... und nach kurzer Zeit... Totalabsturz von Word !

    Die Ereignisanzeige von WindowsXP zeigt Fehler 1000 mit der user32.dll
    1000 scheint so ein Allerweltsfehler zu sein...

    Ein Befehl, den ich nie verwende ist "Option Base 1".
    Also hatte ich ihn deaktiviert... und siehe da... kein Absturz !

    Ich kann nur spekulieren > Option Base scheint eine Windows-, keine Office-Einstellung zu sein.
    Deshalb ruft Word diese user32.dll von XP und bekommt dort Streit.
    Da eigentlich kein Mensch diese Option Base braucht, wurde der Fehler offenbar auch noch nie festgestellt...

    Teste das einmal bei Dir.

    Es ist doch egal, ob der ListIndex jetzt bei 0, oder bei 1 beginnt, der restliche Code muss das nur ber&#252;cksichtigen.

    Gruss Urs
     
  3. scullhead

    scullhead Byte

    Super, danke für den hilfreichen Tipp - werde es gleich mal testen...

    Aber wenn der Befehl "Option Base 1" das verursacht scheint es wohl ein Bug im VBA interpreter von Word zu sein vermute ich..

    Aber du hast recht - ist eigentlich nicht notwendig das die Arrays bei Index 1 beginnen. Hatte ich aus purer bequemlichkeit gemacht :)
     
  4. Urs2

    Urs2 Megabyte

    Was da genau passiert, weiss ich natürlich nicht. Ich weiss nur, dass sich winword.exe und user32.dll streiten.

    Die user32.dll ist von 2002 und liegt seit mindestens 4 Jahren auf meinem System.
    Im 2008 muss sie aber geändert worden sein, wohl ein Update von XP, aus einem ganz anderen Grund.

    Möglicherweise erscheint der Fehler erst seit dann...

    Gruss Urs
     
  5. scullhead

    scullhead Byte

    Also das Makro funktioniert jetzt soweit - das Auflisten der Dateien und das Einfügen klappen problemlos.

    Allerdings habe ich festgestellt, dass man die Steuerelemente löschen kann wenn man mit Strg + A alles markiert und entfernen drückt. Wenn ich das Dokument schütze funktioniert das Makro nicht mehr korrekt, da kein Text mehr eingefügt werden kann.

    Hat jemand einen Tipp für mich wie ich meine Steuerelemente gegen (unbeabsichtigtes) löschen schützen kann?

    :idee:
     
  6. VB-Coder

    VB-Coder Megabyte

  7. Urs2

    Urs2 Megabyte

    Ich arbeite viel mit Excel-Makros, und wenig mit Word...
    Der Link von VB-Coder hilft leider nicht mit Word2003.

    In den Eigenschaften kann man ein Steuerelement auf Locked = True setzen. Laut Hilfe behält es trotzdem die Funktion... bei ListMails stimmt das auch, bei den CommandButtons aber leider nicht...

    Um "unabsichtliche" Veränderungen zu verhindern braucht es sowieso einen Passwortschutz.
    Also schütze das Dokument und gib das frei, wie Du es haben möchtest.

    Damit der Code das tun kann, was er soll, musst Du vor der betreffenden Zeile mit ActiveDocument.Unprotect den Schutz aufheben und gleich danach mit .Protect wieder setzen.
    Im Schrittmodus siehst Du genau, vor welcher Zeile es nötig ist...

    Schau in der VBA-Hilfe unter Protect und Unprotect. Dort sind auch die Parameter für die verschiedenen Schutzarten und das Passwort aufgeführt.

    Damit nicht "versehentlich" jemand im VB-Editor das Passwort ausliest...
    ...musst Du dort den Code für die Anzeige sperren... mit Passwort...

    Wenn das Ganze nicht so todernst sein soll, geht es natürlich genau gleich auch ohne Passwörter.

    In Excel verwende ich das oft - funktioniert perfekt.

    Gruss Urs
     
Thread Status:
Not open for further replies.

Share This Page