Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1804to1808
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Text nach Bookmark einfügen

Text nach Bookmark einfügen
15.01.2021 23:22:02
Firefly1111
Hallo Zusammen,
ich bin neu im Forum. Dank dieses Forums konnte ich bereits vielle VBA Probleme selber lösen, aber jetzt finde ich keine passende Lösung weder im deutschen noch im englischen Sprachraum.
Ich habe eine Excel Datei bestehend aus verschiedenen Tabellen. Jede Tabelle entspricht einem Kapitel in Word. Die Inhalte der Exceldatei werden dynamisch erzeugt. Das heißt die Anzahl der Tabellen, die nach Word exportiert werden variieren. Als auch die Inhalte innerhalb einer Tabelle. Die einzelnen Tabellen entsprechen der Reihenfolge der Kapitel. Sprich Tabelle 1 ist Kapitel 1, Tabelle 2 ist Kapitel 2 etc..
In meinem Wordtemplate ist nur eine Textmarke Ueberschriften hinterlegt. Dies ist mein Startpunkt. Meine Idee. Nach jedem Einfügen erzeuge ich ein neues Bookmark entsprechend des Tabellenblattnames.
Bisher funktioniert, das erfolgreiche übertragen in Word. Das Einfügen der Texte und das generieren der Bookmarks.
Mein Problem
Die Texte aus Excel werden nicht nach jedem Bookmark eingefügt, sondern immer Davor. Sprich die Kapitel starten in umgekehrter Reihenfolge. Ich denke es müsste mit InsertAfter funktionieren, aber dann überträgt das Makro keinen Text. Zusätzlich ist der erste Kapitel ordenlich formatiert entsprechend der Spalten. Daher specialpaste. Die anderen Kaptiel sind leider alle in Spalte 1.
Optimal wäre noch ein Enter nach jedem Kapitel.
Ich würde mich über eine Codeanpassung freuen. Vielen Dank im Voraus.

Sub ExcelDatenNachWord()
Dim AppWord As Object
Dim dateiname As String
Dim TextMarke As Word.Bookmark
Dim Bereich As Range
Dim WS_Count As Integer
Dim I, letztezeile As Integer
Dim Blattname As String
Dim BlattnameNext As String
'Fehlerbehandlung aktivieren
On Error Resume Next
'Word öffnen
Set AppWord = CreateObject("Word.application")
WS_Count = ActiveWorkbook.Worksheets.Count
dateiname = "c:\dok1.docx"  'ANPASSEN
With AppWord
.Documents.Add dateiname
.Visible = True: .WindowState = xlMaximized
End With
'Textelemente einlesen. Die Kapitel starten ab Tabelle 4
For I = 4 To WS_Count
Blattname = Worksheets(I).Name
BlattnameNext = Worksheets(I + 1).Name
'Hier wird die letzte Zeile in der Tabelle ermittelt.
letztezeile = Sheets(Blattname).UsedRange.SpecialCells(xlCellTypeLastCell).Row
'Einfügen von Texten in Word aus Excel an entsprechender Bookmark und dann zm nächsten   _
_
_
_
setzen
With AppWord.ActiveDocument
Set Bereich = Worksheets(Blattname).Range("A1:G" & letztezeile + 1) 'Bereich mit  _
den zu exportierenden Daten
Bereich.Copy
If I = 4 Then
Set TextMarke = .Bookmarks("Ueberschriften")
Else
Set TextMarke = .Bookmarks(Blattname)
End If
'Text einfügen als RTF
TextMarke.Range.PasteSpecial Link:=False, DataType:=wdPasteRTF, _
Placement:=wdInLine, DisplayAsIcon:=False
.Bookmarks.Add Name:=BlattnameNext, Range:=TextMarke.Range
End With
Next I
MsgBox "Daten sind übertragen"
End Sub

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Text nach Bookmark einfügen
16.01.2021 10:40:17
Luschi
Hallo Firefly1111,
die Verbindung von Excel zu Word ist in diesem Code ein Mischmasch von 'early-' & 'late-binding'; soll heißen:
- Du hast einen Objekt-Verweis zur Word-Bebliothek in Excel erstellt - early binding
- und verwendest CreateObject("Word.application") zum Aufruf von Word - late binding
- das ist selten eine gute Idee, beides zu vermengen
- besonders dann, wenn auf dem PC/Notebook mehrere Word-Versionen installiert sind
  (wie bei mir)
- bzw. Du als Entwickler hast Word 2016, der Anwender aber Word 2007/10/13/365
Ob ich heute am Samstag Lust habe, Dein Problem nachzubauen, muß ich mir erst noch überlegen.
Wenn Du allerdings ein Demobeispiel (Excel+Word-Datei) mit Demodaten bereitstellst, steigt meine Hilfebereitschaft gleich um mindestens 150%.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Text nach Bookmark einfügen
16.01.2021 12:07:54
Firefly1111
Hallo Luschi,
danke für die schnelle Rückmeldung. Anbei der Link zum Beispiel. Die Worddatei ist bei mir eine leere docx Datei mit der Textmarke Ueberschriften zum Testen.
https://www.herber.de/bbs/user/143048.zip
Viele Grüße
Firefly1111
AW: Text nach Bookmark einfügen
16.01.2021 15:35:56
Luschi
Hallo Firefly1111,
hier mein Lösungsvorschlag:
Wegen Regelverstoß gelöscht - Hans W. Herber
Frage zu Deinem Code
16.01.2021 16:56:06
Oisse
Hallo Luschi,
ich hab jetzt den ganzen Nachmittag versucht herauszufinden, wie man in Word eine neue Zeile einfügt. Das Internet rauf und runter gesucht und immer nur eine "Selection.irgendwas" gefunden. Aber dieses Selection war nirgendwo "auffindbar". Es wurde stets ein Fehler ausgegeben.
Erst jetzt mit dem "Parent" davor geht es und selbst hier spuckt die IntelliSense nichts aus, was man dann auswählen kann. Ich habe wdDoc as Word.Document dimensioniert.
Wie kommt man da drauf, dass man Parent verwenden muss? Wo findet man solche Informationen?
Danke für den klasse Code und schon mal für Deine Antwort.
Gruß Oisse
Anzeige
AW: Frage zu Deinem Code
16.01.2021 18:55:26
Luschi
Hallo Oisse,
alle Objekte , die einen Verweis auf Application besitzen, sollten/(müssen) über das Applications-Objekt angesprochen werden: Selection.Application gehört dazu.
Selection gehört also nicht zur geöffneten Worddatei (wdDoc) sondern zur Word-Application selbst.
Das bedeutet:
.Parent.Selection.MoveDown Unit:=wdLine, Count:=1
ist das selbe wie
AppWord.Selection.MoveDown Unit:=wdLine, Count:=1
da sich '.Parent' auf das übergeordnete Objekt von wdDoc (also der geöffneten Word.Application) bezieht.
Das ist aber nur dann wichtig, wenn Excel und Word per Vba gemeinsam gesteuert werden, denn
Excel.Application und Word.Application besitzen ein Selection-Objekt.
Gruß von Luschi
aus klein-Paris
Anzeige
Danke für die Antwort und noch eine
16.01.2021 19:04:27
Oisse
Frage:
Warum gibt die IntelliSense dann nichts weiter her?
Und - was passiert hier?
Selection.MoveDown Unit:=wdLine, Count:=1

im Vergleich zu:
Selection.Selection.TypeParagraph 

Sorry für die dumme Fragerei. Aber man will ja was lernen und verstehen.
Gruß Oisse
AW: Danke für die Antwort und noch eine
16.01.2021 19:57:21
Luschi
Hallo Oisse,
da der Vba-Code in der Exceldatei steht, verweist Selection auf das Excel.Application.Selection-Object, und dieses kennt keine MoveDown-Methode, die wird nur von Word.Application.Selection richtig interpretiert.
Selection.Selection.TypeParagraph ergibt in Word einen Syntax-Fehler während Selection.Parent.Selection.Parent.Selection.TypeParagraph wieder prächtig funktioniert.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Text nach Bookmark einfügen
16.01.2021 18:22:48
Firefly1111
Hallo Luschi,
ich habe soeben den Code ausprobiert und es funktioniert hervoragend. Formatierung passt und es sieht sehr gut aus. Aus deinem Code habe ich vieles neues gelernt. Vielen Dank.
In den Foren habe ich gelesen, dass es eine Möglichkeit gibt Überschriften zu generieren.
Selection.Style = activedocument.Styles("Überschrift 1")
Mir ist jetzt nicht ganz klar. Wie ich es am besten Löse, da ich einen Bereich kopiere, indem die erste Zeile die Überschrift ist.
Gibt es einen eleganten Weg?
Viele Grüße
Firefly1111
AW: Text nach Bookmark einfügen
16.01.2021 20:40:17
Luschi
Hallo
damit würde ich mich in Word-Vba gar nicht herumschlagen, sondern in Excel-Vba die 1. Zelle des Kopierbereiches so formatieren, wie man es in Word haben will.
Nach dem Füllen der Word Textmarke wird die 1. Zelle wieder auf Standard gestellt - daß ist viel leichter und geht locker aus der Hand (siehe Beispiel).
https://www.herber.de/bbs/user/143059.xlsm
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Text nach Bookmark einfügen
17.01.2021 10:18:44
pmpv8ljj
Hallo Luschi,
danke für das Update. Ich hatte in meiner Orginal Version bereits die 1. Zeile als Überschrift in Excel, dass hat das gleiche Resultat wie dein Code.
Ich hatte gehofft, dass es möglich ist direkt in Word die Überschriften Struktur zu nutzen.
In meiner Orginal Word Datei muss der Text mitten in eine bestehende Kapitelstruktur eingefügt. Werden. Deinen ursprünglichen Code habe ich an einer Stelle angepasst, damit es funktioniert.
'für jede Excel-Tabelle im Vorhinein eine Textmarke einfügen
For I = 4 To WS_Count
Blattname = ThisWorkbook.Worksheets(I).Name
''Punkt ist im TM-Name nicht erlaubt!
Tm_X = VBA.Replace(Blattname, ".", "_", 1, -1, vbTextCompare)
With wdDoc
If I = 4 Then
'cursor springt zur Textmarke
.Bookmarks("Ueberschriften").Select
'.Parent.Selection.MoveDown Unit:=wdLine, Count:=1
End If
.Bookmarks.Add Name:=Tm_X, Range:=.Parent.Selection.Range
.Parent.Selection.MoveDown Unit:=wdLine, Count:=1
.Parent.Selection.TypeParagraph
.Parent.Selection.MoveUp Unit:=wdLine, Count:=1
End With
Next I
Jezt überlege ich, ob es geschickter ist in Word ein Makro zu schreiben, dass die Überschriften generiert. Ich habe in Word noch keine Makros geschrieben, scheint aber ähnlich wie bei excel zu sein.
Viele Grüße
Firefly1111
Anzeige
AW: Text nach Bookmark einfügen
16.01.2021 12:04:44
Oisse
Hallo,
teste mal:
Sub ExcelDatenNachWord()
Dim AppWord As New Word.Application
Dim TextMarke As Word.Bookmark
Dim Bereich As Range
Dim WS_Count As Integer
Dim I, letztezeile As Integer
Dim Blattname As String
Dim BlattnameNext As String
Dim dateiname As String
'Fehlerbehandlung aktivieren
On Error Resume Next
'Word öffnen
dateiname = "c:\dok1.docx"  'ANPASSEN
WS_Count = ActiveWorkbook.Worksheets.Count
With AppWord
.Documents.Add dateiname
.Visible = True: .WindowState = xlMaximized
End With
'Textelemente einlesen. Die Kapitel starten ab Tabelle 4
For I = WS_Count To 4 Step -1
Blattname = Worksheets(I).Name
'Hier wird die letzte Zeile in der Tabelle ermittelt.
letztezeile = Sheets(Blattname).UsedRange.SpecialCells(xlCellTypeLastCell).Row
'Einfügen von Texten in Word aus Excel an entsprechender Bookmark und dann zm nächsten  _
_
_
_
_
'setzen
With AppWord.ActiveDocument
Set Bereich = Worksheets(Blattname).Range("A1:G" & letztezeile + 1) 'Bereich mit _
den zu exportierenden Daten
Bereich.Copy
If I = WS_Count Then
Set TextMarke = .Bookmarks("Ueberschriften")
Else
.Bookmarks.Add Name:=Blattname, Range:=.Tables(1)
Set TextMarke = .Bookmarks(Blattname)
End If
'Text einfügen als RTF
TextMarke.Range.PasteSpecial Link:=False, DataType:=wdPasteRTF, _
Placement:=wdInLine, DisplayAsIcon:=False
.Select
End With
Next I
MsgBox "Daten sind übertragen"
End Sub

Gruß Oisse
Anzeige
Sorry, war falsch
16.01.2021 12:11:47
Oisse
Leider nur an einer Tabelle getestet
Sorry

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige