Daten aus Word-Tabellen in Excel überführen

  • Excel

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Marco123.

    Daten aus Word-Tabellen in Excel überführen

    Hallo Forum,
    aktuell bin ich damit zugange anhand der in diversen Betriebsanweisungen vorhandenen Daten (eine Word-Datei pro Thema, Daten in vorgegebener Tabellenform) eine sich selbstständig aktualisierende Excel-Tabelle zu erstellen. Das Ganze soll durch die Zusammenfassung aller Daten viel übersichtlicher werden.

    Das Auslesen der Word-Tabellen als auch das Einfügen in die Excel-Datei funktioniert mit folgendem Code schonmal ganz gut:

    Visual Basic-Quellcode

    1. Sub Word_Tabellen_auslesen()
    2. Dim cL As Object
    3. Dim sPfad As String
    4. Dim appWord As Object
    5. Dim i As Long
    6. Dim a As Long
    7. Dim counter As Long
    8. Dim cDir As String
    9. Dim ws As Excel.Worksheet
    10. counter = 1
    11. On Error GoTo ENDE
    12. 'Aktualisierung ausschalten
    13. With Application
    14. .ScreenUpdating = False
    15. .Calculation = xlCalculationManual
    16. .EnableEvents = False
    17. End With
    18. 'WordObject erstellen
    19. Set appWord = CreateObject("Word.Application")
    20. 'Zielblatt
    21. Set ws = Tabelle002
    22. 'Bereich festlegen
    23. Set isect = Application.Intersect(ws.UsedRange, ws.Range("B3:D" & Rows.Count))
    24. 'Pfad
    25. sPfad = "C:\Users\Marco123\Desktop\Projekt\"
    26. cDir = Dir(sPfad & "*.doc")
    27. 'Tabelle vorher leeren
    28. isect.ClearContents
    29. Do While cDir <> ""
    30. 'Worddocument ?ffnen
    31. appWord.Documents.Open sPfad & cDir, ReadOnly:=True
    32. 'Wordtabelle auslesen
    33. 'Zeilen
    34. For a = 1 To 15
    35. i = 0
    36. 'Spalten
    37. For Each cL In appWord.activeDocument.Tables(1).Rows(a).Cells
    38. i = i + 1
    39. ws.Cells(a + counter, i) = Left(cL.Range.Text, Len(cL.Range.Text) - 2)
    40. Next
    41. Next a
    42. 'n?chstes Document lesen
    43. cDir = Dir
    44. counter = counter + 15
    45. 'Worddocument schliessen
    46. appWord.activeDocument.Close savechanges:=False
    47. Loop
    48. ENDE:
    49. 'WordObject l?schen
    50. Set appWord = Nothing
    51. 'gef?llte Zellen an Inhalt anpassen
    52. isect.VerticalAlignment = xlTop
    53. isect.WrapText = True
    54. isect.ColumnWidth = 50
    55. isect.EntireRow.AutoFit
    56. 'Aktualisierung einschalten
    57. With Application
    58. .ScreenUpdating = True
    59. .Calculation = xlCalculationAutomatic
    60. .EnableEvents = True
    61. End With
    62. End Sub


    Soweit klappt alles.Einziger Downer ist der Umstand, das die Textinhalte der einzelnen Word-Tabellenzellen ohne die dort vorhandenen Umbrüche/Absätze sondern als ein langer Strang in die einzelnen Excel-Zellen geschrieben werden.Wenn man jedoch die dann befüllten Zellen per Doppelklick oder F2 anwählen, passt sich der Inhalt automatische wieder an.
    Kennt einer von Euch dieses Problem und hat evtl. den passenden Tipp oder gar eine Lösung parat?

    Vielen Dank im Voraus für Eure Unterstützung

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

    Sind denn die Zellen im Excel-Blatt alle so formatiert, dass sie auch Textumbrüche können?

    Ansonsten - das Thema hatte ich hier letztens an anderer Stelle - gibt es häufig auch Formatierungsoptionen. Unter Umständen mal schauen, ob es sowas auch gibt, denn dann sind dort Umbrüche extra formatieren.
    Hi Padre,

    die Zellformatierung wird bereits in den Zeilen 57 bis 60 des Codes angepasst. Zeile 58 schaltet den Textumbruch.
    Der Inhalt wird daher schon an die Zellgröße angepasst (Textumbruch, Ausrichtung), was das Problem aber nicht löst.
    Die Umbrüche / Absätze erscheinen weiterhin erst wenn die Zellen manuell per Doppelklick / F2 angewählt werden.

    Auch die manuelle Anpassung der Zellformatierung schafft keine Abhilfe.
    Ursache des ganzen scheint die Code-Zeile 40 zu sein:

    Visual Basic-Quellcode

    1. ws.Cells(a + counter, i) = Left(cL.Range.Text, Len(cL.Range.Text) - 2)


    Die Kombi Left + Len bewirkt ja, das von links an die Anzahl der Zeichen aufgenommen wird, welche übernommen werden sollen
    Da Absätze aber keine Zeichen sind, werden diese nicht erfasst.

    Im Gegensatz zur Zelle wird der Inhalt in der Bearbeitungsleiste aber korrekt angezeigt.

    Ich bin weiterhin aktiv auf der Suche nach einer passenden Lösung / Alternative, bin bisher aber nicht fündig geworden.

    Falls jemand etwas parat haben sollte, würde ich mich sehr über eine entsprechende Info freuen.
    Moin Forum,

    kleines Update.
    Ich hab einen Lösungsweg gefunden, auch wenn dieser mal wieder eher dem Vorgehen "von hinten durch dir Brust ins Auge" zuzurechnen ist.

    Hier stichpunktartig mein Vorgehen:
    - Word-Datei per Excel-Makro öffnen
    - in Word-Datei nach Absätzen suchen und durch unübliche Zeichenfolge ersetzen
    - Texte in Excel übernehmen
    - Ersatzzeichen gegen Absätze austauschen (eigenes Makro)

    Der aktuelle Code sieht dann wie folgt aus:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim cL As Object
    3. Dim sPfad As String
    4. Dim appWord As Object
    5. Dim objDoc As Object
    6. Dim i As Long
    7. Dim a As Long
    8. Dim counter As Long
    9. Dim cDir As String
    10. Dim ws As Excel.Worksheet
    11. Dim isect
    12. Const Ersatz As String = "<>"
    13. Const wdReplaceAll As Long = 2
    14. Const wdFindContinue As Long = 1
    15. Const wdDoNotSaveChanges As Long = 0
    16. Sub BA_LZ_techn_Einrichtungen_auslesen()
    17. counter = 1
    18. On Error Resume Next
    19. 'Aktualisierung ausschalten
    20. With Application
    21. .ScreenUpdating = False
    22. .Calculation = xlCalculationManual
    23. .EnableEvents = False
    24. End With
    25. 'Zielblatt
    26. Set ws = Tabelle002
    27. 'Bereich festlegen
    28. Set isect = Application.Intersect(ws.UsedRange, ws.Range("B3:D" & Rows.Count))
    29. 'Pfad
    30. sPfad = Tabelle020.Range("D10")
    31. cDir = Dir(sPfad & "*.doc")
    32. 'Tabelle vorher leeren
    33. isect.ClearContents
    34. Do While cDir <> ""
    35. 'WordObject erstellen und ?ffnen
    36. Set appWord = CreateObject("Word.Application")
    37. Set objDoc = appWord.documents.Open(sPfad & cDir, ReadOnly:=True)
    38. 'in Word suchen und ersetzen
    39. appWord.ScreenUpdating = False
    40. With objDoc.Content.Find
    41. .Text = "^p"
    42. .Replacement.Text = Ersatz
    43. .Wrap = wdFindContinue
    44. .Execute Replace:=wdReplaceAll
    45. End With
    46. 'Wordtabelle auslesen
    47. 'Zeilen
    48. For a = 1 To 15
    49. i = 0
    50. 'Spalten
    51. For Each cL In appWord.activeDocument.Tables(1).Rows(a).Cells
    52. i = i + 1
    53. ws.Cells(a + counter, i) = Left(cL.Range.Text, Len(cL.Range.Text) - 2)
    54. Next
    55. Next a
    56. 'Worddocument schliessen
    57. appWord.ScreenUpdating = True
    58. objDoc.Close savechanges:=wdDoNotSaveChanges
    59. 'n?chstes Document lesen
    60. cDir = Dir
    61. counter = counter + 15
    62. Loop
    63. 'WordObject l?schen
    64. Set objDoc = Nothing
    65. appWord.Quit
    66. Set appWord = Nothing
    67. 'gef?llte Zellen an Inhalt anpassen
    68. Absaetze_einfuegen
    69. With isect
    70. .VerticalAlignment = xlTop
    71. .WrapText = True
    72. .ColumnWidth = 50
    73. .EntireRow.AutoFit
    74. End With
    75. ActiveWorkbook.RefreshAll
    76. 'Aktualisierung einschalten
    77. With Application
    78. .ScreenUpdating = True
    79. .Calculation = xlCalculationAutomatic
    80. .EnableEvents = True
    81. End With
    82. End Sub
    83. Sub Absaetze_einfuegen()
    84. ActiveSheet.Cells.Replace What:= Ersatz, _
    85. Replacement:="" & Chr(10), _
    86. LookAt:=xlPart, _
    87. SearchOrder:=xlByRows, _
    88. MatchCase:=False, _
    89. SearchFormat:=False, _
    90. ReplaceFormat:=False, _
    91. FormulaVersion:=xlReplaceFormula2
    92. End Sub


    Das Austauschen in Word verlangsamt die ganze Sache zwar, aber es funktioniert.

    Wenn jemand noch Ideen hat, wie man das ganze noch beschleunigen kann... immer her damit :)

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