# automatische textformatierung in word-tabellen



## c_83 (18. September 2007)

hallo,
ich bin vba neuling und hab bei vielen anwendungen noch richtig probleme.

also ich habe in einem word dokument eine tabelle erstellt der ich über ein makro vorgebe, dass sie beim drucken (über einen extra erstellten drucken-button in der symbolleiste) automatisch die arial, 9 pt, regular verwendet. 
das war  ja auch gar nciht das problem. nun müchte ich aber, dass in der tabelle der text einer jeden zelle einen bold schnitt der schrift verwendet bis ich einen absatz erzeuge. mit dem absatz soll automatisch wieder in der arial regular weitergeschrieben werden. und das soll in jeder neuen tabellenzeile, -zelle und -spalte funktionieren, die ich einfüge. 

gibts dafür eine lösung?
habe mal eine beispieltabelle angehängt, wie das visuell aussehenn solllll.


----------



## c_83 (20. September 2007)

hatte ganz vergessen den quelltext meines bisherigen makris mal mitzuschiken... also hier ist er... 

so funktioniert er halt für die gesamte tabelle, aber eben nicht, wie ich es in dem vorhergehenden beitrag geschrieben hatte...  (also mit der bold- formatierten schrift bis man einen absatz macht, also enter drückt)


wie gesagt, ich bin noch in der lernphase und ganz frisch dabei was vb angeht... deswegen würde ich mich echt riesig über jeden hinweis freen, wie man mein problem lösen könnte. 

Sub formatieren_drucken()
 Selection.WholeStory
    Selection.HomeKey Unit:=wdLine
    Selection.MoveDown Unit:=wdLine, Count:=12
    Selection.Tables(1).Select
    With Selection.Font
        .Name = "Arial"
        .Size = 9
        .Bold = False
        .Italic = False
        .Underline = wdUnderlineNone
        .Color = wdColorBlack
    End With
    Selection.WholeStory
    Selection.HomeKey Unit:=wdLine
    ActiveDocument.PrintOut
End Sub



danke schon mal im voraus


----------



## Quaese (20. September 2007)

Hi,

du kannst ja alle Zellen der Tabelle durchlaufen. Den ersten Absatz (Paragraph) formatierst du mit fett, alle
anderen normal.

```
Dim intI As Integer, intJ As Integer, intPara As Integer
Dim objTable As Table

Set objTable = ActiveDocument.Tables(1)

For intI = 1 To objTable.Rows.Count
    For intJ = 1 To objTable.Columns.Count
        For intPara = 1 To objTable.Cell(intI, intJ).Range.Paragraphs.Count
            If intPara = 1 Then
                objTable.Cell(intI, intJ).Range.Paragraphs(intPara).Range.Font.Bold = True
            Else
                objTable.Cell(intI, intJ).Range.Paragraphs(intPara).Range.Font.Bold = False
            End If
        Next intPara
    Next intJ
Next intI
```
Ciao
Quaese


----------



## c_83 (20. September 2007)

okay, ich habe das mal eingefügt, doch ich bekomme einen laufzeitfehler 5941: das angeforderte element ist nicht  in der sammlung vorhanden....  hi esfunktioniert ja alles soweit, wandelt auch alles schön so um, wie es soll... . doch dann kommt beim ausführen des drucken befehls dieser fehler
der liegt bei

For intPara = 1 To objTable.Cell(intI, intJ).Range.Paragraphs.Count

mein jetztiger quelltext ist:

Sub formatieren_drucken()
 Selection.WholeStory
    Selection.HomeKey Unit:=wdLine
    Selection.MoveDown Unit:=wdLine, Count:=12
    Selection.Tables(1).Select
    With Selection.Font
        .Name = "Arial"
        .Size = 9
        .Bold = False
        .Italic = False
        .Underline = wdUnderlineNone
        .Color = wdColorBlack
    End With
    Dim intI As Integer, intJ As Integer, intPara As Integer
Dim objTable As Table

Set objTable = ActiveDocument.Tables(1)

For intI = 1 To objTable.Rows.Count
    For intJ = 1 To objTable.Columns.Count
        For intPara = 1 To objTable.Cell(intI, intJ).Range.Paragraphs.Count
            If intPara = 1 Then
                objTable.Cell(intI, intJ).Range.Paragraphs(intPara).Range.Font.Bold = True
            Else
                objTable.Cell(intI, intJ).Range.Paragraphs(intPara).Range.Font.Bold = False
            End If
        Next intPara
    Next intJ
Next intI
    Selection.WholeStory
    Selection.HomeKey Unit:=wdLine
    ActiveDocument.PrintOut
End Sub

ist das so halbegs richtig? oder wo liegt das problem, dass es nciht funktioniert?


----------



## c_83 (20. September 2007)

okay....
nach einigem rumprobieren, was mich auch echt nerven gekostet hat, hab ich das problem gefunden bzw den grund, warum da ein laufzeitfehler entsteht...  ich habe in den letzten beiden zeilen meiner tabelle  3 zellen zusammengefügt, d.h. bei einer eigentlich 5-spaltigen tabelle bestehen die letzten beiden zeilena aus 2 spalten. wenn ich diesen zeilen wieder die entsprechende anzahl an spalten hinzufüge, dann funktioniert  der code auch... allerdings sollen die letzten beiden zeilen nur 2 spalten haben... gibts da vielleicht eine lösung dafür, dass das trotzdem funktioniert? ich schikcke mal die mustertabelle mit, wie das ganze aussiet... weiß ja nciht ob ich vielleicht bissl wirr schreibe.


----------



## Quaese (20. September 2007)

Hi,

versuch mal die Tabellen im Dokument nacheinander zu durchlaufen und abzuarbeiten.

```
Sub formatieren_drucken()
    Dim i As Integer
    
    Selection.WholeStory
    Selection.HomeKey Unit:=wdLine
    Selection.MoveDown Unit:=wdLine, Count:=12
        
    With Selection.Font
    .Name = "Arial"
    .Size = 9
    .Bold = False
    .Italic = False
    .Underline = wdUnderlineNone
    .Color = wdColorBlack
    End With

    For i = 1 To ActiveDocument.Tables.Count
        ActiveDocument.Tables(i).Select
        
        With ActiveDocument.Tables(i).Range.Font
        .Name = "Arial"
        .Size = 9
        .Italic = False
        .Underline = wdUnderlineNone
        .Color = wdColorBlack
        End With
        
        formatTable ActiveDocument.Tables(i)
    Next i
    
    Selection.WholeStory
    Selection.HomeKey Unit:=wdLine
    ActiveDocument.PrintOut
End Sub

Sub formatTable(objTable As Table)
    Dim intI As Integer, intJ As Integer, intPara As Integer
    
    For intI = 1 To objTable.Rows.Count
        For intJ = 1 To objTable.Columns.Count
            For intPara = 1 To objTable.Cell(intI, intJ).Range.Paragraphs.Count
                If intPara = 1 Then
                    objTable.Cell(intI, intJ).Range.Paragraphs(intPara).Range.Font.Bold = True
                Else
                    objTable.Cell(intI, intJ).Range.Paragraphs(intPara).Range.Font.Bold = False
                End If
            Next intPara
        Next intJ
    Next intI
End Sub
```
Ciao
Quaese


----------



## c_83 (21. September 2007)

danke
funktioniert schon wesentlich besser, aber leider immer noch nicht ganz fehlerfrei... wäre ja auch zu schön gewesen...  ich bekomme wieder einen laufzeitfehler und dlie letzte zile meiner tabelle wird nicht bold formatiert, trotz absatz.... hm... stellle ich mich vielleicht einfach zu blöd an? 
trotzdem schicke ich mal nen screenshot mit meinem code mit und wo genau der fehler liegt... vielleicht gibts ja ne ganz einfache erklärung dafür.  werde auch selbst nochmal weiter rumprobieren... wäre aber toll wenn du dich nochmal melden würdest...


----------



## Quaese (21. September 2007)

Hi,

bau eine Fehlerbehandlungsroutine ein, die entsprechend reagiert - hier zum Beispiel den Spaltenindex inkrementieren.

```
Sub formatTable(objTable As Table)
    Dim intI As Integer, intJ As Integer, intPara As Integer
    
    ' Fehlerbehandlung
    On Error GoTo ErrorHandle
    For intI = 1 To objTable.Rows.Count
        For intJ = 1 To objTable.Columns.Count
            For intPara = 1 To objTable.Cell(intI, intJ).Range.Paragraphs.Count
                If intPara = 1 Then
                    objTable.Cell(intI, intJ).Range.Paragraphs(intPara).Range.Font.Bold = True
                Else
                    objTable.Cell(intI, intJ).Range.Paragraphs(intPara).Range.Font.Bold = False
                End If
            Next intPara
        Next intJ
    Next intI
    On Error GoTo 0
    
    Exit Sub
    
' Fehlerbehandlung
ErrorHandle:
    Select Case Err.Number
        Case 5941
            intJ = intJ + 1
            Resume Next
        Case Else
            MsgBox "Fehler " + CStr(Err) + ": " + Error() + " in Zeile " + CStr(Erl) + " aufgetreten"
            Resume Next
    End Select
End Sub
```
Ciao
Quaese


----------



## c_83 (22. September 2007)

vielen dank! jetzt funktioniert es du hast mir echt total geholfen. ohne diene hilfe hätte ich sicherlich schon aufgegeben.  kann durchaus sein, dass ich deine hilfe später nochmal beanspruchen muss, doch die tabelle funktioniert ja erstmal.


----------



## c_83 (2. Oktober 2007)

hallo,
ich hab noch mal eine frage zi diesem thema hier. ich habe jetzt t vor, über die gleiche prozedur wie über den "drucken-button"  eine aktion zu erstellen, mit der ich ein pdf erzeugen kann. also kurz, ich erstelle einen button zur pdf-erstellung, lege darauf das gleiche makro wie auf den drucken-button, nur eben mit einem anderen befehlt. hier mal der code:

Sub pdf_erstellen()
    Dim i As Integer

    Selection.WholeStory
    Selection.HomeKey Unit:=wdLine
    Selection.MoveDown Unit:=wdLine, Count:=12

    With Selection.Font
    .Name = "Arial"
    .Size = 9
    .Bold = False
    .Italic = False
    .Underline = wdUnderlineNone
    .Color = wdColorBlack
    End With

    For i = 1 To ActiveDocument.Tables.Count
        ActiveDocument.Tables(i).Select

        With ActiveDocument.Tables(i).Range.Font
        .Name = "Arial"
        .Size = 9
        .Italic = False
        .Underline = wdUnderlineNone
        .Color = wdColorBlack
        End With

        formatTable ActiveDocument.Tables(i)
    Next i

    Selection.WholeStory
    Selection.HomeKey Unit:=wdLine
    ActiveDocument.convertToPDF
End Sub

ist das so richtig? denn bei mir funktioniertrts wieder nciht 

edit: es funktioniert nur teilweise... ich bekomme einen laufzeitfehler 438... scheint so als ob es da ein problem mit dem befehlt convertTo PDF gibt... gibts für sowas auch  ne passende fehlerbehandlung? oder einen anderen befehl fürs pdf schreiben


----------

