Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Zeilen zählen in generierten Word-Dolkument

Zeilen zählen in generierten Word-Dolkument
12.03.2019 21:40:08
Daniel
Liebes Forum,
habe im Moment folgendes Problem:
Aus Excel heraus soll ein Word-Dokument geöffnet werden. Anschließend wird der String-Inhalt einer Zelle in die Word-Datei geschrieben. Anschließend soll die Anzahl der Zeilen bestimmt werden, die der String im Word-Dokument benötigt, um später dynamisch die Schriftgröße so lange zu verringern bis der String in eine Zeile passt.
Dies soll mit einer Schleife passieren, in der mit ComputeStatistics(Statistic:=wdStatisticLines) solange die Zeilenzahl ermittelt wird, bis diese 1 beträgt.
Mein Problem ist nun, dass sowohl ComputeStatistics(Statistic:=wdStatisticLines) als auch ComputeStatistics(Statistic:=wdStatisticCharacters) den Wert 1 liefert, obwohl dies nicht der Fall ist.
Der Code dazu sieht so aus:
Sub Tischschilder_erzeugen()
Dim intTNzahl As Integer
Dim n As Integer
Dim i As Integer
Dim intTNnummer As Integer
Dim intTNSlength As Integer
Dim intTNSlines As Integer
Dim intTNSchars As Long
Dim intTNSschriftgrad As Long
Dim strTNname As String
Dim intErstesKomma As Integer
Dim AppWD As Object, objWordDoc As Object
Application.ScreenUpdating = False
'Legt den Unterordner Tischschilder an
If Dir(ThisWorkbook.Path & "\Tischschilder", vbDirectory) = "" Then
MkDir (ThisWorkbook.Path & "\Tischschilder")
Else
End If
'zählt die TN im Tabellenblatt
intTNzahl = Application.WorksheetFunction.CountA(Worksheets("Tabelle1").Range("B2:B40"))
'TN-Namen werden extrahiert
For n = 1 To 1 'intTNzahl
strTNname = Worksheets("Tabelle1").Cells(2 + n, 2).Value
'Tischkärtchen werden erstellt
Set AppWD = CreateObject("Word.Application")
'Template öffnen
AppWD.Visible = True
Set objWordDoc = AppWD.Documents.Open(ThisWorkbook.Path & "\Tischschildtemplate.docx")
'Namen eintragen
objWordDoc.Activate
objWordDoc.Bookmarks("TNstart").Range.Text = strTNname
intTNSchars = objWordDoc.Range(objWordDoc.Bookmarks("TNstart").Range.Start, objWordDoc. _
Bookmarks("TNende").Range.End).ComputeStatistics(Statistic:=wdStatisticCharacters)
intTNlines = objWordDoc.Range(objWordDoc.Bookmarks("TNstart").Range.Start, objWordDoc.Bookmarks( _
"TNende").Range.End).ComputeStatistics(Statistic:=wdStatisticLines)
Debug.Print intTNSchars 'liefert 1 obwohl 61
Debug.Print intTNlines 'liefert 1 obwohl 3
i = 0
Do Until intTNSlines = 1
Debug.Print intTNSlines
With objWordDoc
intTNSschriftgrad = .Range(.Bookmarks("TNstart").Range.Start, .Bookmarks("TNende").Range.End). _
Font.Size
Debug.Print intTNSschriftgrad
.Range(.Bookmarks("TNstart").Range.Start, .Bookmarks("TNende").Range.End).Font.Size = 28 - i
intTNSlines = .Range(.Bookmarks("TNstart").Range.Start, .Bookmarks("TNende").Range.End). _
ComputeStatistics(wdStatisticLines)
End With
i = i + 1
Loop
objWordDoc.SaveAs2 Filename:=ThisWorkbook.Path & "\Tischschilder\" & strTNname & ".docx"
objWordDoc.Close
Set objWord = Nothing
Set objDoc = Nothing
AppWD.Quit
Next
Application.ScreenUpdating = True
Worksheets("Tabelle1").Activate
End Sub

Die Word-Vorlage ist leer und enthält die zwei durch ein Leerzeichen getrennte Bookmarks TNstart und TNende.
Liegt das Problem vielleicht darin, dass ich den Bereich zwischen den beiden Bookmarks nicht richtig anspreche?
Über Hilfe oder eine zielführende Idee würde ich mich sehr freuen!
Schöne Grüße und Danke im voraus,
Daniel
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeilen zählen in generierten Word-Dolkument
13.03.2019 10:28:12
Matthias
Moin!
Also habe mal getestet. Bei mir hat es dann geklappt, wenn ich an Stelle der Variablennamen wie wdstatisticline die dazugehörigen Zahlen eingesetzt habe. Bspw. so: ComputeStatistics(1).
Vorher waren die Variablen immer leer (vermutlich falsche bzw. kein Verweis auf Word) und haben demzufolge was falsches ergeben.
Hier mal eine Übersicht:
https://docs.microsoft.com/de-de/office/vba/api/word.wdstatistic
Würde da auch immer die Zahlen nehmen, falls das Programm auf anderen Rechnern laufen soll.
VG
Anzeige
AW: Zeilen zählen in generierten Word-Dolkument
14.03.2019 22:47:43
Daniel
Prima, herzlichen Dank, Matthias! Genau das war es. Hatte die Zahlenwerte in der Dokumentation irgendwie nicht wahrgenommen. Juhu, wieder eine vba-debugger-quest geschafft.
;
Anzeige
Anzeige

Infobox / Tutorial

Zeilen zählen in Word-Dokumenten aus Excel


Schritt-für-Schritt-Anleitung

  1. Vorbereitung: Stelle sicher, dass die Word-Vorlage die Bookmarks TNstart und TNende enthält. Der Bereich zwischen diesen Bookmarks wird später verwendet, um die Anzahl der Zeilen zu zählen.

  2. VBA-Code einfügen: Verwende den folgenden VBA-Code, um aus Excel heraus ein Word-Dokument zu öffnen und die Anzahl der Zeilen zu zählen:

    Sub Tischschilder_erzeugen()
       Dim intTNzahl As Integer
       Dim n As Integer
       Dim i As Integer
       Dim intTNSlines As Integer
       Dim strTNname As String
       Dim AppWD As Object, objWordDoc As Object
       Application.ScreenUpdating = False
    
       ' Zähle die Teilnehmer
       intTNzahl = Application.WorksheetFunction.CountA(Worksheets("Tabelle1").Range("B2:B40"))
    
       For n = 1 To intTNzahl
           strTNname = Worksheets("Tabelle1").Cells(2 + n, 2).Value
           Set AppWD = CreateObject("Word.Application")
           AppWD.Visible = True
           Set objWordDoc = AppWD.Documents.Open(ThisWorkbook.Path & "\Tischschildtemplate.docx")
    
           ' Namen eintragen
           objWordDoc.Bookmarks("TNstart").Range.Text = strTNname
           intTNSlines = objWordDoc.Range(objWordDoc.Bookmarks("TNstart").Range.Start, objWordDoc.Bookmarks("TNende").Range.End).ComputeStatistics(Statistic:=wdStatisticLines)
    
           ' Zeilen zählen anpassen
           i = 0
           Do Until intTNSlines = 1
               With objWordDoc
                   .Range(.Bookmarks("TNstart").Range.Start, .Bookmarks("TNende").Range.End).Font.Size = 28 - i
                   intTNSlines = .Range(.Bookmarks("TNstart").Range.Start, .Bookmarks("TNende").Range.End).ComputeStatistics(Statistic:=wdStatisticLines)
               End With
               i = i + 1
           Loop
    
           objWordDoc.SaveAs2 Filename:=ThisWorkbook.Path & "\Tischschilder\" & strTNname & ".docx"
           objWordDoc.Close
           AppWD.Quit
       Next
       Application.ScreenUpdating = True
    End Sub
  3. Führe den Code aus: Starte das Makro, um die Zeilen in deinem Word-Dokument zu zählen. Der Code passt die Schriftgröße so lange an, bis der Text in eine Zeile passt.


Häufige Fehler und Lösungen

  • Falsche Zeilenanzahl: Wenn ComputeStatistics(Statistic:=wdStatisticLines) immer 1 zurückgibt, stelle sicher, dass die Bookmarks korrekt gesetzt sind und der Text im Bereich vorhanden ist.

  • Leere Variablen: Wenn du Variablen wie wdStatisticLines verwendest, ersetze sie durch die zugehörigen Zahlen (z.B. 1 für Linien), um Probleme mit leeren Variablen zu vermeiden.


Alternative Methoden

  • Manuelle Zeilenzählung: Du kannst die Zeilenanzahl auch manuell in Word überprüfen, indem du die Funktion „Word-Zeilenanzahl“ nutzt, die die Gesamtanzahl der Zeilen in einem Dokument anzeigt.

  • Verwendung von Formularen: Erstelle ein Formular in Excel, das die Zeilenanzahl automatisch berechnet, bevor du die Daten an Word übergibst.


Praktische Beispiele

  • Beispiel 1: Erstelle Tischkarten für eine Veranstaltung, wobei jeder Teilnehmername in einer separaten Zeile angezeigt wird. Der oben genannte Code hilft dir dabei, die Schriftgröße automatisch anzupassen, um den Namen in eine Zeile zu bringen.

  • Beispiel 2: Verwende eine Excel-Tabelle mit langen Texten in einer Spalte. Der VBA-Code passt die Schriftgröße an, sodass die Texte in eine Zeile passen, während du die Anzahl der Zeilen in Word direkt zählst.


Tipps für Profis

  • Optimierung des Codes: Verwende With-Blöcke effizient, um die Lesbarkeit des Codes zu erhöhen und die Ausführungsgeschwindigkeit zu verbessern.

  • Debugging: Nutze Debug.Print regelmäßig, um den Status von Variablen während der Ausführung zu überprüfen. Dies ist besonders hilfreich, um Probleme mit der Zeilenanzahl zu identifizieren.


FAQ: Häufige Fragen

1. Wie kann ich die Zeilenanzahl in einem Word-Dokument anzeigen? Du kannst die Zeilenanzahl in Word über die Funktion „Zeilenanzeige“ im Menü „Überprüfen“ einsehen oder die ComputeStatistics-Methode in VBA verwenden.

2. Warum zeigt mein Code immer 1 für die Zeilenanzahl an? Überprüfe, ob die Bookmarks korrekt in deinem Word-Dokument gesetzt sind und ob der Text im angegebenen Bereich vorhanden ist. Stelle außerdem sicher, dass du die richtigen Statistiken anforderst.

3. Ist dieser Code in allen Excel-Versionen kompatibel? Der gezeigte VBA-Code sollte in den meisten modernen Versionen von Excel (Excel 2010 und neuer) funktionieren, solange die Word-Referenzen korrekt gesetzt sind.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige