Announcement

Collapse
No announcement yet.

Word fernsteuern

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

  • Word fernsteuern

    Hallo, ich stehe grad aufn Schlauch.

    Ich habe mehrere Word-Dateien, in den eine Projektnummer geändert werden soll "102800" --> "1028001".

    Da es mehere Dateien sind, würde ich das gern mit VB.net erledigen:

    Dateinen von OpenFileDialog öffnen, "Suchen & ersetzen" und dann wieder speichern.

    Meine Idee:

    Code:
    Dim word As New Microsoft.Office.Interop.Word.Application
    Dim doc As Microsoft.Office.Interop.Word.Document
    word.Visible = (True) 'debug 
    doc = word.Documents.Open("c:\Word-Datei.doc") 'eine Datei aus dem Array von dem Dialog 
    doc.Activate()
    .
    .
    .
    Und jetzt komme ich nicht weiter, wie ich das suchen und ersetzen bewerkstelligen kann ... hat jemand eine Idee oder ein Beispiel?

    Danke

    Gruss ALex

  • #2
    Hi,

    zeichne in Word ein Makro auf und schau dir den Code an.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Danke Gü!!

      Auf die Simple Idee bin ich nicht gekommen.

      Mir fehlt aber immernoch das "Microsoft.Office.Interop.Word"

      Welchen Verweis muß ich da unter Projekt hinzufügen?

      Danke Gruss ALex

      Comment


      • #4
        Siehe Anhang.

        mfG Gü
        Attached Files
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Danke,

          haben wir irgendwie zur gleichen Zeit gefunden, als ich es importiert habe, kam die Email mit deiner Antwort.

          Ich habe immer nach Microsoft Office* Word gesucht nicht nach Microsoft Word ...

          Danke Dir.

          Gruss Alex

          Comment


          • #6
            Guten Morgen,
            ich habe mir mal das Macro aufgenommen:
            Code:
            Selection.Find.ClearFormatting
            Selection.Find.Replacement.ClearFormatting
            With Selection.Find
            .Text = "102801"
            .Replacement.Text = "102800"
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
            End With
            Selection.Find.Execute Replace:=wdReplaceAll
            ich komme nicht ran, aus VB.net, ich vermute mir fehlt eine Instanz:

            Code:
            Dim word As New Microsoft.Office.Interop.Word.Application
             Dim doc As Microsoft.Office.Interop.Word.Document
            
            doc = word.Documents.Open("c:\test.doc")
            
            doc.
            Hat jemand eine Idee?

            Gruss Alex

            Comment


            • #7
              Hi Alex,

              das Makro geht von einer Selection aus, Du hast aber im Moment nur das doc im Zugriff.

              siehe z.B. hier

              Gruß Womble
              Zuletzt editiert von Womble; 28.10.2008, 11:49.

              Comment


              • #8
                Hi Womble,

                danke für die Antwort, aber ich habe grad nen Hänger und komm nicht weiter.

                Eigentlich brauche ich ja ein neues Objekt, was "doc.selection" enthält

                Idee: dim sel_doc as new ...

                dann müßte ich ja mit

                with sel_doc.find

                ...

                end with

                arbeiten können, aber mir fehlt der Ansatz.

                Oder denke ich falsch?
                In dem Beispiel in dein Link, gehts ja von einen application objekt aus los.

                aber doc.selection.find. ... geht auch nicht.


                Gruss Alex

                Comment


                • #9
                  Hi Alex,

                  das Beispiel ist allgemein gehalten, deswegen steht da nur Application, in Deinem Fall ist das word, weil ...

                  [highlight=vbnet]Dim word As New Microsoft.Office.Interop.Word.Application[/highlight]

                  aus

                  [highlight=vbnet]
                  Application.Selection.Find.ClearFormatting()
                  Application.Selection.Find.Text = "suchen"
                  Application.Selection.Find.Replacement.ClearFormat ting()
                  Application.Selection.Find.Replacement.Text = "ersetzen"
                  Application.Selection.Find.Execute(Replace:=WdRepl ace.wdReplaceAll)[/highlight]

                  wird also

                  [highlight=vbnet]
                  word.Selection.Find.ClearFormatting()
                  word.Selection.Find.Text = "suchen"
                  word.Selection.Find.Replacement.ClearFormatting()
                  word.Selection.Find.Replacement.Text = "ersetzen"
                  word.Selection.Find.Execute(Replace:=WdReplace.wdR eplaceAll)[/highlight]

                  Gruß Womble

                  Comment


                  • #10
                    Hallo Womble,

                    ich habe es mal so angepasst:
                    [highlight=vbnet]
                    Dim word As New Microsoft.Office.Interop.Word.Application
                    Dim doc As Microsoft.Office.Interop.Word.Document

                    doc = word.Documents.Open("c:\test2.doc")
                    doc.Activate()
                    With word.Selection
                    .Find.ClearFormatting()
                    .Find.Text = "102800"
                    .Find.Replacement.ClearFormatting()
                    .Find.Replacement.Text = "102801"
                    .Find.Execute(Replace:=WdReplace.wdReplaceAll)
                    End With
                    doc.Save()
                    doc.Close()[/highlight]

                    Ich bin mir sicher, das ich da mist gebaut habe, ich brauche doch das doc nichtmehr oder? aber wie bekomme ich dann das word auf?

                    HILFE!!

                    Gruss Alex

                    Comment


                    • #11
                      Hi Alex,

                      Klar brauchst Du das doc noch.

                      Die word.Selection.Find sagt Word ja nur was zu tun ist, das wo ergibt sich aus der getroffenen Selektion und wenn nichts markiert ist dann gilt .WholeStory, d.h. ist es das ganze Dokument.

                      Gruß Womble

                      Comment


                      • #12
                        Hi Womble,

                        das heißt ja das mein Code oben korrekt ist? Aber warum funktioniert es dann nicht?

                        Ich dachte ich habe bei den Obkekten mist gebaut und deshalb geht es nicht, dachte ich durchsuche ein leeres Objekt oder so ;-)

                        Grss Alex

                        Comment


                        • #13
                          Hi Alex,

                          das ist mein ganzer Code, bei mir geht es.

                          Umgebung: VS 2008 & Office 2007

                          [highlight=vbnet]
                          Dim oMissing As Object = System.Reflection.Missing.Value
                          Dim oFalse As Object = False
                          Dim wApp As ApplicationClass = New ApplicationClass()
                          wApp.Visible = True
                          Dim docName As Object = "C:\Replace.docx"
                          wApp.Documents.Open(docName, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing)
                          wApp.Selection.Find.ClearFormatting()
                          wApp.Selection.Find.Text = "Dateiname"
                          wApp.Selection.Find.Replacement.ClearFormatting()
                          wApp.Selection.Find.Replacement.Text = "Filename"
                          wApp.Selection.Find.Execute(Replace:=WdReplace.wdR eplaceAll)
                          'wApp.Quit(oFalse, oMissing, oMissing)
                          [/highlight]

                          Den Quit habe ich auskommentiert, damit Word dann offen bleibt.

                          Gruß Womble

                          Comment


                          • #14
                            Hallo Womble,

                            mea culpa, meine Schuld, ich habe mir die Word-Datei mal richtig angeguckt und bemerkt, dass die Textstellen, die ich geändert haben will Textfelder sind. ich hab nur das Dokument geöffnet und nicht mal reingeklickt, somit hab ich es nicht bemerkt.
                            Also ohne die Textfelder funktioniert es.

                            Ich habe jetzt noch mal paar Fragen:

                            [highlight=vbnet]
                            Dim wApp As ApplicationClass = New ApplicationClass()
                            wApp.Visible = True
                            [/highlight]

                            Woher weiss das Programm, dass es Office-Word öffnen soll?
                            Wenn ich bis zu den Code ausführe, öffnet er ja Word?

                            Wie komme ich an die Textfelder? ich habe probiert ein Makro aufzunehmen, aber Word, mag kein Makro mit Textfeldern, beim googeln habe ich gefunden das es Bookmarks sind.

                            also habe ich geteste: for each tm in wApp.Selection.Bookmarks ...

                            Aber ich weiss nicht wie ich das tm initialisieren soll?

                            Dim tm as wApp.Document.Bookmark geht nicht.

                            Hast du eine Idee?

                            Ich möchte in der for-each schleife alle Textfelder durchgehen und ändern, wenn es nötig ist, müßte ich ja über die Text-Methode hinkriegen?

                            Gruss Alex

                            Comment


                            • #15
                              Hi Alex,

                              hier mal ein grober Schuß in die Luft, da ich keine Worddokumente mit Bookmarks habe, aber in der Theorie sollte das gehen

                              [highlight=vbnet]
                              ' Der vorhergehende Teil fehlt, wird aber noch benötigt
                              Dim docName As Object = "C:\Replace.docx"
                              Dim doc = wApp.Documents.Open(docName, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing)
                              Dim tm As Bookmark
                              For Each tm In doc.Bookmarks
                              tm.Range.Text = tm.Range.Text.Replace("Bla", "Blubb")
                              Next[/highlight]
                              Dieses winzige Codestück sollte in allen Bookmarks nach Bla suchen und durch Blubb ersetzen.

                              Gruß Womble

                              Comment

                              Working...
                              X