Announcement

Collapse
No announcement yet.

Word-Dokument von Access aus bearbeiten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Word-Dokument von Access aus bearbeiten

    Hallo zusammen,

    ich generiere ein Word-Dokument von Access aus. Das sieht so aus, dass ich eine Vorlage (.dot) per VBA in Word öffne und anschließend bearbeite. Text an Textmarken einzufügen stellt dabei kein Problem dar. Bis dahin läuft alles.

    Nun will ich aber den gesuchten Text formatieren. Hier beispielsweise <fett>. Dazu durchsuche ich das Dokument und wende die Formatierung entsprechend an. Hier erst einmal der Code:
    Code:
    Set wdApp = GetObject(, "Word.Application")
        Set TextPostanschrift = "Anschrift"
        
        Set myRange = wdApp.ActiveDocument.Content
        With myRange.Find
            .Replacement.Font.Bold = True
            .Text = TextPostanschrift
            .Replacement.Text = TextPostanschrift
            .Forward = True
            .Wrap = wdFindContinue
            .Format = True
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = True
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        myRange.Find.Execute Replace:=wdReplaceAll
    Das Schlimme ist, dass der Code, wenn man ihn in Word als Makro einfügt und ausführt funktioniert. Da ich aber sämtliche Daten aus der Access-Datenbank in das Dokument schreibe und mit verschiedenen Vorlagen arbeite, wäre es unsinnig jedem Dokument den Code anzuhängen. Also es muss von Access aus gehen. Wenn der Code jedoch in Access ausgeführt wird, bricht die Verarbeitung bei
    Code:
    .Replacemend.Font.Bold = True
    ab und springt zur Fehlerbehandlung. Zeitweise ist Access sogar ohne Fehlerhinweise abgestürzt.

    Könnt ihr mir sagen, wo mein Fehler liegt oder ob es einen Workaround gibt um solche Fehler zu beheben? Die Anwendung lief bereits unter Office 2003 und soll jetzt auf Office 2007 lauffähig gemacht werden.

    Vielen Dank

  • #2
    Hallo,

    prüfe ggf. einmal Extras -> Verweise, welche Word - Klassenbibliothek eingebunden ist.

    Viel Erfolg
    Tino
    Ich habs gleich!
    ... sagte der Programmierer.

    Comment


    • #3
      Originally posted by tinof View Post
      Hallo,

      prüfe ggf. einmal Extras -> Verweise, welche Word - Klassenbibliothek eingebunden ist.

      Viel Erfolg
      Tino
      Hallo Tino,

      es ist die Bibliothek von Word 12 eingebunden. Also schon einmal die richtige.

      Kann vielleicht jemand das Problem verifizieren, in dem er versucht von einer Access Anwendung aus ein Dokument zu durchsuchen und dort Ersetzungen vorzunehmen? Wie gesagt, es muss aus Access heraus erfolgen, weil dort die Daten aufbereitet werden.

      Vielen Dank weiterhin
      Gruß
      Stefan

      Comment


      • #4
        Vielleicht ist es noch aktuell- ich war gestern leider unterwegs.


        Ich habe das eben mit Access 2007 und Word 2007 ausprobiert.

        Bei mir funktionierte zunächst das

        Code:
        Set TextPostanschrift = "Anschrift"
        nicht, ich kenne allerdings deine Deklaration nicht. Aber mit einem

        Code:
        TextPostanschrift = "Anschrift"
        Läuft der code fehlerfrei durch und die Ersetzungen werden auch fett markiert.


        Leider bin ich zu doof, in diesem neuen rundgelutschten Menü die Punkt zu finden, der mit die genauen Versionen anzeigt. Ich meine aber, nie aktiv Servicepacks o.ä. eingespielt zu haben.

        Vielleicht sollten wir da nochmal schauen - sag' mir bitte aber mal WO man den ehemaligen " ? -> Info" - Menüpunkt versteckt hat.

        Grüße
        Tino
        Ich habs gleich!
        ... sagte der Programmierer.

        Comment


        • #5
          &quot;Set&quot; gibt's doch nur für Objekte...??!!

          Hallo,


          Originally posted by tinof View Post
          ...
          Bei mir funktionierte zunächst das

          Code:
          Set TextPostanschrift = "Anschrift"
          nicht, ich kenne allerdings deine Deklaration nicht. Aber mit einem

          Code:
          TextPostanschrift = "Anschrift"
          Läuft der code fehlerfrei durch und die Ersetzungen werden auch fett markiert.

          ...
          Meiner Meinung nach setzt man in VBA "SET" nur ein, um eine Objektreferenz zuzuweisen.
          Eine Stringzuweisung ist aber eine Wertzuweisung - hierfür benutzt man "SET" nicht...
          (Irgendwelche Gegenstimmen....?? ;-)

          Grüße,
          tAgedObject
          darkness is a state of mind

          Comment


          • #6
            Ja, Zustimmung.

            Wahrscheinlich ist das aber nur für's Forum so umgeschrieben, ich denke, im Originalcode passiert da viel mehr.
            Hab's nur der Vollständigkeit halber mit geschrieben.
            Ich habs gleich!
            ... sagte der Programmierer.

            Comment


            • #7
              Geht, geht nicht

              Hallo zusammen und schon einmal vielen Dank für Eure Unterstützung.

              Also, klar habe ich den Code gekürzt und für das Forum etwas umgeschrieben, deshalb zur Aufklärung mal ein paar weitere Informationen:

              In der ersten Methode, die über den Button initial aufgerufen wird, steht bildlich folgendes:
              Code:
              Private Sub fangAn()
              'Variablen-Deklarationen (mehr als hier abgebildet)
              Dim wordApp As Object
              Dim neuesDok As Object
              Dim template As String
              
              'tue ganz viel in der Datenbank / Sammeln von Infos
              
              'Starte MSWord-Applikation
                  On Error Resume Next ' damit die Fehlermeldung nicht kommt
                  Set wordApp = GetObject(, "Word.Application") 'sofern eine Instanz läuft
                  If Err = 429 Then Set wordApp = CreateObject("Word.Application") 'wenn nicht, starte Word
                  wordApp.Visible = True 'habs auf True gesetzt, damit ich beim Debuggen was sehe, ist sonst False
                  Err = False
                  On Error GoTo WordErr 'Error-Handler
              
              Set neuesDok = wordApp.Documents.Add(template:=template, NewTemplate:=False) 'Oeffne Profilvorlage als Dok
              
                      'In dieser Methode wird das Dokument initial mit Fußnoten und Headern
                      'befüllt und unter anderem auch versucht einen eingefügten Text zu formatieren
                      Call InitDocument(wordApp, strLanguage, "nix", strType)
              
                      'jetzt wird das Dokument spezifisch weiter verarbeitet
                      ...
                      Set myRange = wordApp.ActiveDocument.Content
              
                      With myRange.find                                     'Suche nach Titel
                          .Text = titleLang
                          .Replacement.Text = strAnrede & " " & strNachname 
                          .Replacement.ClearFormatting
                          .Wrap = wdFindContinue
                          .Format = False
                          .MatchCase = False
                          .MatchWholeWord = True
                          .MatchWildcards = False
                          .MatchSoundsLike = False
                          .MatchAllWordForms = False
                      End With
                      myRange.find.Execute replace:=wdReplaceAll, Forward:=True
              Der zuvor gepostete Code-Schnipsel ist also aus der InitDocument-Methode. Das Komische ist, dass in dieser Methode jede Menge Informationen in das Dokument geschrieben werden, der Zeiger passt also, aber beim Suchen-Ersetzen-Teil kommt es zu dem Fehler.

              Ich habe den Ersetzen-Algorythmus in der InitDocument-Methode auskommentiert, um zu sehen, was anschließend passiert. Anschließend folgt in der hier geposteten Methode noch einmal ein Suchen-Ersetzen-Algorythums. Allerdings führt dieser zu keinem Fehler. :-( Warum?

              TextPostanschrift wird in initDocument als String deklariert und anschließend mit TextPostanschrift = "..." belegt.

              Die Versionsnummer findest Du im Office-Menü --> ...-Optionen --> Reiter "Ressourcen" dort unter dem Abschnitt Informationen

              Bei mir:
              Access-Version: 12.0.4518.1014
              Word-Version: 12.0.6331.5000
              MSO-Version: 12.0.6320.5000

              Danke und Grüße
              Stefan

              Comment


              • #8
                Ich habe den Ersetzen-Algorythmus in der InitDocument-Methode auskommentiert, um zu sehen, was anschließend passiert. Anschließend folgt in der hier geposteten Methode noch einmal ein Suchen-Ersetzen-Algorythums. Allerdings führt dieser zu keinem Fehler. :-( Warum?
                Also liegt es wohl doch nicht an der Version / Servicpack.


                Poste doch bitte mal den neuralgischen Teil der InitDocument - Methode.

                Das ist nicht spitzfindig gemeint, ich habe selbst schon manchmal mehrere Stunden nach einem falsch gesetzten Punkt oder so gesucht.
                x Augen sehen mehr als 2.

                Wie ist InitDokument() deklariert - ich meine, wie erfolgt die Übergabe von WordApp ?

                Probier mal Dim WordApp AS Variant, sollte zwar keinen Einfluß haben, aber bei Access weiß man nie.

                Ggf. Wordapp probehalber einmal global im Modul definieren und nicht übergeben.

                Alles nur so Ideen.

                Viel Erfolg!
                Tino

                Edit:
                In dem zweiten Codeschnipsel wird ja auch
                .Replacement.Font.Bold = True
                nicht verwendet ?!
                Ich habs gleich!
                ... sagte der Programmierer.

                Comment


                • #9
                  Also hier die InitDocument-Methode in Gänze:

                  Code:
                  Public Sub InitDocument(wdApp As Word.Application, Sprache As String, Standort As String, strType As String)
                  On Error GoTo ErrorExit
                  
                  Dim OrgOben1 As String
                  Dim OrgOben2 As String
                  Dim OrgOben3 As String
                  Dim OrgOben4 As String
                  
                  Dim OrgUnten1 As String
                  Dim OrgUnten2 As String
                  Dim OrgUnten3 As String
                  Dim OrgUnten4 As String
                  Dim OrgUnten5 As String
                  
                  Dim OrgAbsender As String
                  
                  Dim TextTelefon As String
                  Dim TextPostanschrift As String
                  Dim TextFax As String
                  Dim TextInternet As String
                  Dim TextEmail As String
                  Dim TextVorstand1 As String
                  Dim TextVorstand2 As String
                  Dim TextVorstand3 As String
                  Dim TextVorstand4 As String
                  Dim TextSitz As String
                  Dim TextAusland As String
                  Dim TextBankverbindung As String
                  Dim crlf As String
                  Dim myRange As Range
                  
                  On Error GoTo ErrorExit
                  
                  'Ini-Datei definieren
                      DefineIniFile wdApp
                  
                  crlf = Chr$(13)
                      
                  Select Case Sprache
                          Case Is = "Deutsch"
                              TextTelefon = "Telefon "
                              TextPostanschrift = "Postanschrift"
                              TextFax = "Fax "
                              TextInternet = "Internet"
                              TextEmail = "E-Mail"
                              TextVorstand1 = "Vorstand "
                              TextVorstand2 = "(Vorsitzender)"
                              TextVorstand3 = "Vorsitzender des Aufsichtsrats "
                              TextVorstand4 = "Geschäftsführung "
                              TextSitz = "Sitz "
                              TextAusland = "Deutschland"
                              TextBankverbindung = "Bankverbindung"
                         Case Is = "Englisch (UK)", "Englisch (US)"
                              TextTelefon = "Phone "
                              TextPostanschrift = "Postadress"
                              TextFax = "Fax "
                              TextInternet = "Internet"
                              TextEmail = "E-Mail"
                              TextVorstand1 = "Executive Board "
                              TextVorstand2 = "(CEO)"
                              TextVorstand3 = "Chairman of the Supervisory Board "
                              TextVorstand4 = "Executive Board "
                              TextSitz = "Registered Office "
                              TextAusland = "Germany"
                              TextBankverbindung = "Bank details"
                         Case Is = "Französisch"
                              TextVorstand1 = "Conseil de administration"
                              TextVorstand2 = "(Président)"
                              TextVorstand3 = "Président du conseil de surveillance"
                              TextTelefon = "Téléphone "
                              TextFax = "Télécopie "
                              TextInternet = "Internet"
                              TextEmail = "E-Mail"
                              TextSitz = ""
                              TextAusland = "Allemagne"
                              TextPostanschrift = "adresse de post"
                              TextBankverbindung = "référence bancaire"
                      End Select
                      
                  'Organleiste oben rechts
                  ' Einträge aus Ini-Datei laden
                  If (strType <> "profile") Then
                      InifileSection = Standort
                      ReadIniFile
                  
                      OrgOben1 = Mid(InifileLine(0), 2, Len(InifileLine(0)) - 2)
                      ' OrgOben1 = "cirquent GmbH"
                      OrgOben2 = InifileLine(2) + crlf
                      OrgOben2 = OrgOben2 + InifileLine(3) + crlf + crlf
                      If (TextAusland <> "Deutschland") Then OrgOben2 = OrgOben2 + TextAusland + crlf
                      ' Mit Postfachangabe in Zeile 8 und 9
                      If InifileCounter >= 9 Then
                          OrgOben2 = OrgOben2 + TextPostanschrift + crlf + InifileLine(8) + crlf + InifileLine(9) + crlf
                      End If
                      OrgOben2 = OrgOben2 + TextTelefon + InifileLine(4) + " 0" + crlf
                      OrgOben2 = OrgOben2 + TextFax + InifileLine(5) + crlf
                      OrgOben2 = OrgOben2 + InifileLine(6)
                         
                      WriteVar wdApp, "mrkOrgOben1", OrgOben1
                      WriteVar wdApp, "mrkOrgOben2", OrgOben2
                  End If
                  'Organleiste oben links (nur Brief)
                  ' Einträge aus Ini-Datei laden
                  If (strType <> "fax") And (strType <> "profile") Then
                          InifileSection = Standort
                          ReadIniFile
                          OrgOben3 = Mid(InifileLine(0), 2, Len(InifileLine(0)) - 2)
                          ' OrgOben3 = "cirquent GmbH "
                          If InifileCounter >= 9 Then
                              OrgOben4 = InifileLine(8) + "  "
                              OrgOben4 = OrgOben4 + InifileLine(9)
                          Else
                              OrgOben4 = InifileLine(2) + "    "
                              OrgOben4 = OrgOben4 + InifileLine(3)
                          End If
                          WriteVar wdApp, "mrkOrgOben3", OrgOben3
                          WriteVar wdApp, "mrkOrgOben4", OrgOben4
                          wdApp.Selection.Font.Bold = wdToggle
                  
                  End If
                  
                  'Organleiste unten
                        
                      ' Board-Einträge aus Ini-Datei laden
                      InifileSection = "[Board]"
                      ReadIniFile
                      
                     ' OrgUnten1 = TextVorstand1 + crlf + _
                     '             InifileLine(1) + TextVorstand2 + crlf + _
                     '             InifileLine(2) + crlf + _
                     '             InifileLine(3) + crlf + _
                     '             TextVorstand3 + crlf + _
                     '             InifileLine(4)
                      
                      OrgUnten1 = TextVorstand4 + crlf + _
                                  InifileLine(1) + TextVorstand2 + crlf + _
                                  InifileLine(2) + crlf + _
                                  TextVorstand3 + crlf + _
                                  InifileLine(3) + crlf + _
                                  InifileLine(4) + crlf + _
                                  InifileLine(5)
                                  
                      OrgUnten4 = TextSitz + InifileLine(6) + crlf + _
                                  InifileLine(7) + crlf + _
                                  InifileLine(8)
                        
                      ' Banken-Einträge aus Ini-Datei laden
                      Select Case Sprache
                          Case Is = "Deutsch"
                              InifileSection = "[Banken_D]"
                          Case Is = "Englisch (UK)", "Englisch (US)"
                              InifileSection = "[Banken_E]"
                          Case Is = "Französisch"
                              InifileSection = "[Banken_F]"
                      End Select
                      
                      ReadIniFile
                      
                      OrgUnten2 = TextBankverbindung + crlf + _
                                  InifileLine(1) + crlf + _
                                  InifileLine(2) + crlf + _
                                  InifileLine(3)
                         
                      
                      
                      OrgUnten3 = TextBankverbindung + crlf + _
                                  InifileLine(4) + crlf + _
                                  InifileLine(5) + crlf + _
                                  InifileLine(6)
                                  
                     
                      WriteVar wdApp, "mrkOrgUnten1", OrgUnten1
                      WriteVar wdApp, "mrkOrgUnten2", OrgUnten2
                      WriteVar wdApp, "mrkOrgUnten3", OrgUnten3
                      WriteVar wdApp, "mrkOrgUnten4", OrgUnten4
                      
                      WriteVar wdApp, "mrkTextanfang", ""
                  
                  ' für den Fettdruck die Postanschrift finden
                      Set myRange = wdApp.ActiveDocument.Content
                      With myRange.find
                          .Replacement.Font.Bold = True
                          .Text = TextPostanschrift
                          .Replacement.Text = TextPostanschrift
                          .Forward = True
                          .Wrap = wdFindContinue
                          .Format = True
                          .MatchCase = False
                          .MatchWholeWord = False
                          .MatchWildcards = True
                          .MatchSoundsLike = False
                          .MatchAllWordForms = False
                      End With
                      myRange.find.Execute replace:=wdReplaceAll
                      
                  ' Template path löschen
                      wdApp.ActiveDocument.AttachedTemplate = ""
                      
                  
                  
                  Exit Sub
                  ErrorExit:
                  MsgBox Error(Err), 48, "Fehlerhinweis"
                  Resume Next
                  
                  End Sub
                  Werde es gleich mal mit Variant probieren.

                  Vielen Dank

                  Comment


                  • #10
                    Dim myRange As Range
                    Probier mal spaßenshalber

                    Dim myRange As Variant
                    range ist in MSOffice so ein mysteriöser container
                    Ich habs gleich!
                    ... sagte der Programmierer.

                    Comment


                    • #11
                      Access 2007 (12.0.6423.1000) SP2 (12.0.6425.1000)
                      Word 2007 (12.0.6504.5000) SP2 MSO (12.0.6425.1000)

                      also doch'n SP installiert bei mir.
                      Ich habs gleich!
                      ... sagte der Programmierer.

                      Comment


                      • #12
                        Du bist mein Held. Zwei Tage habe ich dafür gebraucht.

                        Also vielen vielen Dank. Möge der Thread auch anderen helfen.

                        Macht es denn Sinn generell Varian statt Range zu nehmen? Dann kann ich ja einmal in dem ganzen Code-Gewirr Range durch Variant ersetzen.

                        Viele Grüße
                        Stefan

                        Comment


                        • #13
                          Macht es denn Sinn generell Varian statt Range zu nehmen?
                          Naja,

                          Code:
                          Dim range AS Word.range
                          hätte wahrscheinlich auch geholfen. Als alter Delphi - Programmierer würde ich das sogar bevorzugen.

                          Aber in VBA spricht nichts gegen Varianten. Trotzdem würde ich nicht per Rundumschlag alle Objekttypen durch Variants ersetzen - wenn es jetzt erstmal geht. "Never touch a running system!".

                          Grüße
                          Tino
                          Ich habs gleich!
                          ... sagte der Programmierer.

                          Comment


                          • #14
                            Originally posted by tinof View Post
                            "Never touch a running system!".
                            Da stimme ich Dir voll und ganz zu. Bin ja noch nicht so tief in das Objektmodell von Office eingestiegen und hätte ja sein können, dass dieser Objekttyp generell Kompatibilitätsproblemen vorbeugt.

                            Viele Grüße
                            Stefan

                            Comment


                            • #15
                              Nein, das nicht, aber ein "range" gibt es im Word, und z.B. auch im Excel.

                              Deshalb ist nicht so klar, welchen Typ man mit einem einfachen

                              Code:
                              Dim MyRange as Range
                              bekommt. Im Zweifelsfalle halt den falschen.

                              Leider kommt zunächst bei

                              Code:
                              Set Word.Range = Excel.Range
                              kein Fehler - der Ärger geht erst hinterher los - wie bei dir.

                              Mit Varianten legt man sich nicht so fest. Aber man hat dann z.B. auch keine Syntaxvervollständigung.
                              Ich habs gleich!
                              ... sagte der Programmierer.

                              Comment

                              Working...
                              X