Excel 2010 VBA - Word Datei öffnen, bearbeiten, kopieren und schließen

  • Excel

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von John1337.

    Excel 2010 VBA - Word Datei öffnen, bearbeiten, kopieren und schließen

    Hallo zusammen,

    ich würde gerne eine Worddatei aus Excel heraus öffnen.

    In der Worddatei alles markieren --> einfügen --> Tabelle --> Text in Tabelle umwandeln --> Trennzeichen Tabstopps!

    Dann diese Tabelle kopieren und in eine Exceldatei einfügen.

    Allerdings habe ich nur anfängerkenntnisse in VBA.

    Könnte sich bitte jmd. den Code anschauen?
    Er bricht immer bei

    With objWordDoc
    Selection.WholeStory

    ab und geht zu "aufräumen"

    Vielen Dank!!


    Option Explicit

    Sub Berechnung_auslesen()

    Dim AppWD As Object, objWordDoc As Object
    Dim objWordRange As Object
    Dim wdSeparateByTabs As Object, wdAutoFitFixed As Object

    On Error GoTo aufräumen

    Set AppWD = CreateObject("Word.Application")
    AppWD.Visible = True
    Set objWordDoc = AppWD.documents.Open("C:\Users\..... 2017.docx")

    With objWordDoc
    Selection.WholeStory
    Selection.ConvertToTable Separator:=wdSeparateByTabs, NumColumns:=3, _
    NumRows:=48, AutoFitBehavior:=wdAutoFitFixed
    End With
    With objWordDoc
    .Style = "Tabellenraster"
    .ApplyStyleHeadingRows = True
    .ApplyStyleLastRow = False
    .ApplyStyleFirstColumn = True
    .ApplyStyleLastColumn = False
    End With
    Selection.Copy

    Workbooks("Berechnungen.xlsm").Sheets("Berechnung").Select
    Range("A1").Select
    ActiveSheet.Paste

    aufräumen:
    Set objWordRange = Nothing
    If Not objWordDoc Is Nothing Then objWordDoc.Close savechanges:=True
    Set objWordDoc = Nothing
    If Not AppWD Is Nothing Then AppWD.Quit
    Set AppWD = Nothing

    End Sub
    Schau dir mal genau an, wie das mit dem With funktioniert.

    John1337 schrieb:

    With objWordDoc
    Selection.WholeStory
    Hier wird versucht, das Selection-Objekt des aktuellen Contextes zu verwenden.
    Also das Selection aus Excel und das hat keine WholeStory-Methode.
    Wenn du es auf das With-Objekt beziehen willst, musst du einen Punkt davor machen.
    So wie hier:

    John1337 schrieb:

    With objWordDoc
    .Style = "Tabellenraster"


    Ich mag übrigens diese With-Konstrukte überhaupt nicht.
    Viel lieber sehe ich gerne auf Anhieb, welches Objekt gemeint ist.

    Visual Basic-Quellcode

    1. Set objWordDoc = AppWD.documents.Open("C:\Users\..... 2017.docx")
    2. objWordDoc.Selection.WholeStory
    3. objWordDoc.Selection.ConvertToTable Separator:=wdSeparateByTabs, NumColumns:=3, _NumRows:=48, AutoFitBehavior:=wdAutoFitFixed
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Vielen Dank schon mal!!

    hab es leicht abgeändert... aber so richtig verstehen tue ich es nicht...
    er bricht immer bei der Selection.WholeStory ab.
    Stimmt denn z.B. das hier Dim wdSeparateByTabs As Object, wdAutoFitFixed As Object
    Excel kennt doch keine Trennung nach Tabstopp!?
    darum wollte er immer eine variablendekl.

    Vielen Dank nochmal! :)

    Option Explicit

    Sub Berechnung_auslesen()

    Dim AppWD As Object, objWordDoc As Object
    Dim objWordRange As Object
    Dim wdSeparateByTabs As Object, wdAutoFitFixed As Object

    On Error GoTo aufräumen

    Set AppWD = CreateObject("Word.Application")
    AppWD.Visible = True
    Set objWordDoc = AppWD.documents.Open("C:\Users\kellerjo\Desktop\M001 KSt Berechnung 2017.docx")

    With objWordDoc
    .Selection.WholeStory
    .Selection.ConvertToTable Separator:=wdSeparateByTabs, NumColumns:=3, NumRows:=48, AutoFitBehavior:=wdAutoFitFixed
    End With

    With objWordDoc
    .Style = "Tabellenraster"
    .ApplyStyleHeadingRows = True
    .ApplyStyleLastRow = False
    .ApplyStyleFirstColumn = True
    .ApplyStyleLastColumn = False
    End With
    objWordDoc.Selection.Copy

    Workbooks("Datev-Berechnungen.xlsm").Sheets("Datev-Berechnung").Select
    Range("A1").Select
    ActiveSheet.Paste

    aufräumen:
    Set objWordRange = Nothing
    If Not objWordDoc Is Nothing Then objWordDoc.Close savechanges:=True
    Set objWordDoc = Nothing
    If Not AppWD Is Nothing Then AppWD.Quit
    Set AppWD = Nothing

    End Sub

    John1337 schrieb:

    er bricht immer bei der Selection.WholeStory ab.
    Gibt's dazu eine Fehlermeldung?

    John1337 schrieb:

    Stimmt denn z.B. das hier Dim wdSeparateByTabs As Object, wdAutoFitFixed As Object
    Nein, aber das taucht ja erst eine Zeile später auf.

    Wenn du Word nicht in den Referenzen hast (und das hast du offensichtlich nicht, du machst late binding mit CreateObject), musst du die Konstanten selbst definieren:

    Visual Basic-Quellcode

    1. ​Const wdSeparateByTabs = 1
    2. Const wdAutoFitFixed = 0

    Die Konstanten findest du hier: msdn.microsoft.com/en-us/libra…a211923(v=office.11).aspx
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:

    John1337 schrieb:

    er bricht immer bei der Selection.WholeStory ab.
    Gibt's dazu eine Fehlermeldung?


    Laufzeitfehler '438' - Objekt unterstütz diese Eigenschaft oder Methode nicht

    Ich denke das geht nicht von Excel aus einen Bereich/Selection in Word als Tabelle zu formatieren. Ich glaube auf die Idee ist bei Microsoft noch keiner kommen. ?(

    @John1337 warum kopierst Du den Inhalt aus Word nicht nach Excel und erstellst dann in Excel die Tabelle?

    Visual Basic-Quellcode

    cry.baby schrieb:

    Ich denke das geht nicht von Excel aus einen Bereich/Selection in Word als Tabelle zu formatieren
    Warum sollte das nicht gehen?

    Edit:
    Ich habe mich jetzt dazu hinreissen lassen und den Code getestet.
    Als erstes habe ich mal das On Error-Statement rausgeworfen.
    Solange der Code nicht produktiv läuft, ist das kontraproduktiv.
    So etwas kannst du ganz am Schluss der Entwicklung einfügen.

    Beim ersten Debugger-Durchlauf war sofort klar, wo das Problem ist.
    Selection ist keine Eigenschaft von Document, sondern von Window oder Pane.

    Visual Basic-Quellcode

    1. Sub Berechnung_auslesen()
    2. Dim AppWD As Object, objWordDoc As Object
    3. Dim objWordRange As Object
    4. Set AppWD = CreateObject("Word.Application")
    5. AppWD.Visible = True
    6. Set objWordDoc = AppWD.documents.Open("D:\Temp\xxx.docx")
    7. With objWordDoc.ActiveWindow.Selection
    8. .WholeStory
    9. .ConvertToTable Separator:=1, NumColumns:=3, NumRows:=48, AutoFitBehavior:=0
    10. End With
    11. End Sub


    Edit2:
    Im übrigen würde ich den Datenbereich gar nicht über Selection ansprechen, sondern direkt adressieren:

    Visual Basic-Quellcode

    1. Sub Berechnung_auslesen()
    2. Dim appWD As Object, objWordDoc As Object
    3. Dim objWordRange As Object
    4. Set appWD = CreateObject("Word.Application")
    5. appWD.Visible = True
    6. Set objWordDoc = appWD.Documents.Open("D:\Temp\xxx.docx")
    7. objWordDoc.Content.ConvertToTable Separator:=1, NumColumns:=3, NumRows:=48, AutoFitBehavior:=0
    8. End Sub

    Es ist bei Word zwar nicht immer zu umgehen, aber Selection und Active... sollte man auch hier vermeiden, wo immer es geht.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „petaod“ ()

    @petaod Wie bist darauf gekommen, dass es 'Content' heißen muss, um den Bereich in eine Tabelle zu konvertieren? Bist Du alle naheliegenden Eigenschaften von Word.Document durchgegangen (try and error) ? Nur mal so grundsätzlich, wie man in solchen Fällen am besten verfährt, außer zu googeln. :)
    Und wenn du das Ganze jetzt noch kompakt und lesbar haben willst:

    Visual Basic-Quellcode

    1. Sub BerechnungAuslesen()
    2. Dim Word As Object, WordDoc As Object
    3. Set Word = CreateObject("Word.Application")
    4. Word.Visible = True
    5. On Error GoTo Done
    6. Set WordDoc = Word.Documents.Open("C:\Users\kellerjo\Desktop\M001 KSt Berechnung 2017.docx")
    7. WordDoc.Content.ConvertToTable Separator:=1, NumColumns:=3, NumRows:=48, AutoFitBehavior:=0
    8. With WordDoc.Tables(1)
    9. .Style = "Tabellenraster"
    10. .ApplyStyleHeadingRows = True
    11. .ApplyStyleLastRow = False
    12. .ApplyStyleFirstColumn = True
    13. .ApplyStyleLastColumn = False
    14. End With
    15. WordDoc.Content.Copy
    16. Paste Sheets("Berechnung").Range("A1")
    17. Done:
    18. If Not WordDoc Is Nothing Then WordDoc.Close 0
    19. Word.Quit
    20. End Sub


    Aber dann bin ich hier raus.

    cry.baby schrieb:

    Wie bist darauf gekommen, dass es 'Content' heißen muss

    Selection ist vom Typ Range.
    Dann schaut man sich im Document-Objekt an, was da sonst noch an Ranges beinhaltet sind.
    Entweder man hat das Objektmodell (einigermaßen) im Kopf.
    Oder man nimmt den Debugger zu Hilfe.
    Oder man schaut sich das Objektmodell in der Dokumentation an:
    msdn.microsoft.com/en-us/vba/w…-model-word-vba-reference
    "If everything else fails, read the documentation..."
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()