Positionierung von Text in Tabelle mit VBA

Moderator: ModerationP

Positionierung von Text in Tabelle mit VBA

Beitragvon Gastheute » 12. Apr 2021, 10:59

Hallo liebes Word-Forum,

ich ringe noch mit Feinheiten meines Projekts. Im folgenden Code funktioniert die horizontale Zentrierung in einer Tabelle im Kopfbereich nicht, allerdings die vertikale schon.
Code: Alles auswählen
tabKopf.Cell(1, 1).Range.InlineShapes.AddPicture FileName:="H:\Projekte\Worksheets\Logo.png", LinkToFile:=False, SaveWithDocument:=True
tabKopf.Cell(1, 5).Range.Text = "Streng" & Chr(10) & "vertraulich"
tabKopf.Cell(1, 5).Range.Bold = wdToggle
tabKopf.Cell(1, 2).Merge Mergeto:=tabKopf.Cell(Row:=1, Column:=4)
tabKopf.Cell(1, 2).Range.Text = "Zentraler Überschriftentext"
tabKopf.Cell(1, 2).Range.Bold = wdToggle
tabKopf.Rows(1).Cells.VerticalAlignment = wdAlignVerticalCenter
tabKopf.Rows(1).Alignment = wdAlignRowCenter

Hat jemand eine Idee, warum die horizontale Zentrierung nicht funktioniert?
Vielen Dank für Hinweise,
T.

P.S.: Mir scheint auch, dass es speziell für die Cell-Formattierung keine speziellen Methoden und Konstanten für horzontale Positionierung gibt (links, recht, mitte), nur für eine Reihe. Ebenso die vertikal Positionierung, wie in meinem Code verwendet, nur für eine Reihe funktioniert und nicht Tabellenzell-spezifisch.

Wer hier Code kennt, bitte hier einfügen, denn auch im Internet finde ich hierzu nichts weiteres und zielführendes.

Ich hätte nämlich - als LaTeX-Freund - folgende Code-Variante erwartet, aber dieses ist nicht definiert:
Code: Alles auswählen
tabKopf.Rows(1).Cells.HorizontalAlignment = wdAlignHorizontalCenter

Genauso wie der folgende nicht verfügbar Code sinnvoll wäre, aber Word-VBA dies nicht bietet:
Code: Alles auswählen
tabKopf.Cell(1,5).Alignment = wdAlignCellCenter

Wenn das nicht anders funktioniert, dann gibt es hier in Word VBA eine krasse Lücke an Funktionen, die einfach nicht in Word-VBA bereit stehen. :(
Gastheute
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 95
Registriert: 09. Mär 2021, 16:07

Re: Positionierung von Text in Tabelle mit VBA

Beitragvon theoS » 12. Apr 2021, 19:28

Eine Lücke gibt es meistens im Wissen des Programmierers. Ganz abgesehen davon, glaube ich, dass es keinen einzelnen Menschen gibt, der Words Objektmodell in allen seinen Facetten kennt. Wie Word mit seinen Tabellen die in Tabellen und wieder in Tabellen eingebaut sind umgeht, das ist eine Kunst für sich. (NestedLevel)
Nachdem du den Befehl zum Zentrieren nach dem Mergen ausführst, kannst du nicht erwarten, dass was passiert, ich hätte sogar erwartet, dass du da eine Meldung kriegst, dass das nicht geht, weil sich VBA sehr oft weigert Tabellen zu bearbeiten die verbundene Zellen haben. (Merke: Verbundene Zellen sind BÖSE!)
Was hier aber das Problem ist, ist die Trennung des einen vom anderen.
Die Zelle wird Mittig gesetzt einmal Vertikal über die Cell-Eigenschaft und horizontal über die Paragraph-Eigenschaften des Range.
Und das kannst du natürlich auch für eine einzelne Zelle machen, solange die nicht verbunden sind.
Code: Alles auswählen
Sub dingesnd()
Dim dd1 As Word.Document: Set dd1 = ActiveDocument
'ich nehme das hier nur deswegen, weil ich von Word aus arbeite und derzeit nur 1 einziges Dok offen hab.
'wenn ich Gefahr laufen könnte, dass u.U. ein weiteres Dokument den Fokus bekommen könnte, würde ich das genauer spezifizieren
'In deinem Fall hast du das Dokument doch beim Erzeugen in eine Variable gepumpt. Die kannst du den ganzen Code über verwenden.
Dim tabKopf As Word.Table 'auch hier habe ich für dich gleich die Deklaration so gemacht, wie sie von Access aus zu machen wäre
Dim rngKopf As Word.Range 'wenn du early binding verwendest. sonst würde man das ja via Object machen

Set rngKopf = dd1.Sections(1).Headers(wdHeaderFooterPrimary).Range
Set tabKopf = rngKopf.Tables(1)
With tabKopf
.Rows(1).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter 'das raffinierte ist nun, dass man hier den Range anpacken muss
.Rows(1).Cells.VerticalAlignment = wdCellAlignVerticalCenter ' das zentriert wie gedacht, Vertikal.
'.Rows(2).Cells(3).VerticalAlignment = wdCellAlignVerticalCenter 'hier stellst du die 3. Zelle der zweiten Reihe auf mittig
.Cell(1, 1).Range.InlineShapes.AddPicture FileName:="Z:\Scrbeans\ALLEIN.WMF", LinkToFile:=False, SaveWithDocument:=True
.Cell(1, 5).Range.Text = "Streng" & vbCrLf & "vertraulich" 'finde ich besser lesbar. Die Absatzmarke wäre eigentlch chr(13)
.Cell(1, 5).Range.Bold = True 'da kannst du dann nicht daneben liegen. Ist die Zelle nämlich schon auf fett, machst du es mager
.Cell(1, 2).Range.Text = "Zentraler Überschriftentext"
.Cell(1, 2).Range.Bold = True
.Cell(1, 2).Merge Mergeto:=tabKopf.Cell(Row:=1, Column:=4) 'und das mergen immer zuletzt.

End With
Set tabKopf = Nothing: rngKopf = Nothing: dd1 = Nothing 'Objektvariablen sollte man immer aufräumen
End Sub
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5600
Registriert: 19. Apr 2008, 00:14

Re: Positionierung von Text in Tabelle mit VBA

Beitragvon Gastheute » 13. Apr 2021, 09:00

Hallo Theo,

ich danke dir für die Ausführlichkeit, muss ich aber insgesamt noch ausprobieren. Das "Word." hatte ich bereits den Deklarationen vorangestellt. Aber die Range ist anders als in deinem Code.

Zunächst eine Frage: Das .merge muss am Ende des gesamten Tabellen-Codes stehen? Oder am Ende der Reihe, in der eine Verbindung mancher Zellen der Reihe erfolgen soll?

Gute Grüße,
T.
Gastheute
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 95
Registriert: 09. Mär 2021, 16:07

Re: Positionierung von Text in Tabelle mit VBA

Beitragvon theoS » 13. Apr 2021, 09:23

Das merge ist das letzte das vba in der Tabelle machen sollte
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5600
Registriert: 19. Apr 2008, 00:14

Re: Positionierung von Text in Tabelle mit VBA

Beitragvon Gastheute » 13. Apr 2021, 09:43

Ok, danke, Theo, ich habe das entsprechend gesetzt. Aber das Entscheidende war das Anpacken des range, was du als raffiniert bezeichnet hat, damit wird jetzt die entsprechende Reihe zentriert gesetzt. Danke.

Aber den range hatte ich doch so wie in deinem Beispiel.

Für den Hauptinhalt meines Dokuments (also: nicht Kopfbereich), ist der folgende wesentliche Code ebenso noch verbesserungswürdig, da hier, im Gegensatz zum Kopf, jetzt die VerticalAlignment nicht funktioniert und dies gedruckt unschön aussieht.
Code: Alles auswählen
Dim tblInhalt As Word.Table
Dim rngInhalt As Word.Range
Set rngInhalt = ActiveDocument.Paragraphs(1).Range
ActiveDocument.Tables.Add Range:=rngInhalt, numrows:=34, numcolumns:=1
Set tblInhalt = ActiveDocument.Tables(1)
Dim stytblInhalt As Word.Style
With stytblInhalt.Table
        .Borders(wdBorderTop).LineStyle = wdLineStyleSingle
        .Borders(wdBorderBottom).LineStyle = wdLineStyleSingle
        .Borders(wdBorderHorizontal).LineStyle = wdLineStyleSingle
        .Borders(wdBorderVertical).LineStyle = wdLineStyleSingle
        .Borders(wdBorderLeft).LineStyle = wdLineStyleSingle
        .Borders(wdBorderRight).LineStyle = wdLineStyleSingle
        .Alignment = wdAlignRowLeft
' evtl. hier einen VericalAlignment -artigen Code einfügen? Aber wie?
End With
tblInhalt.Style = stytblInhalt
For i = 1 To 17
     tblInhalt.Cell(i, 1).Range.Text = strFelderTexteVB(i) '
     ' VerticalAlignment funktioniert nicht, warum?
     tblInhalt.Rows(i).Cells.VerticalAlignment = wdAlignVerticalCenter
Next i

Ich habe in der style-Definition schon probiert, aber das Kontextmenü gibt mir hier keinen Hinweis auf VerticalAlignment :(

Vielen Dank erneut für geniale Hinweise,
T.
Gastheute
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 95
Registriert: 09. Mär 2021, 16:07

Re: Positionierung von Text in Tabelle mit VBA

Beitragvon theoS » 13. Apr 2021, 12:31

Jetzt kommst du an einen Punkt, wo es nicht ganz ungeschickt wäre, das Objektmodell und die Prinzipien von Word verstanden zu haben.
Ein Style ist was, was man nicht für jedes Dokument bearbeitet, auch wenn man das vielleicht kann. So etwas erbt ein Dokument normal von seiner Vorlage.
Dass du hier in einen Style eingreifen möchtest, den du gar nicht benennst, wird dir nicht gelingen, die Dinger wollen mit Namen angesprochen werden.
Dann ist das verticalAlignment auch hier wie in der Einzelzelle eine Eigenschaft des Absatzes. Wenn du mal vom Rekorder aufzeichnen lässt, während du eine bestehende Tabellenformatvorlage bearbeitest, siehts du, was da alles dranhängt. So was macht man in der Vorlage und fertig. Das mit Code jedesmal nachzuvollziehen ist viel zu viel Aufwand.
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5600
Registriert: 19. Apr 2008, 00:14

Re: Positionierung von Text in Tabelle mit VBA

Beitragvon Gastheute » 13. Apr 2021, 13:21

Die VerticalAlignment-Eigenschaft müsste doch eigentlich in der Style definierbar sein, schließlich soll diese Eigenschaft für alle dynamischen Word-Dokumente so eingestellt sein in meinem Projekt. Ich verstehe nicht, dass dies nicht angeboten wird im Kontextmenü der Methoden-Bibliothek, wo es doch dort im Style gut aufgehoben wäre, da es sich ja nicht ändert, sondern lediglich das dauerhafte Aussehen des Word-Dokuments sicherstellen soll.

Mein Ziel ist schon, nur mit Access und VBA zu arbeiten und von dort aus das Word-Dokument dynamisch zu erzeugen, eine extra Word-Vorlage mit Textmarken will ich vermeiden. VBA will doch so mächtig sein, dann soll es das auch liefern können.

VBA ist für mich eine Programmiersprache mit der Word- und Access-Funktionen gemeinsam genutzt werden können. Ich erwarte hier viel davon, weshalb ich auch keine extra Word-Vorlage verwenden will.

Hast du noch eine Idee, wie sich der VerticalAlignment in meiner tblInhalt und rngInhalt realisieren lassen? (Das ist im Grunde das i-Tüpfelchen auf mein Projekt, dann wäre es so gut wie ideal.)

Gute Grüße und Dank für den vielen Input,
T.
Gastheute
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 95
Registriert: 09. Mär 2021, 16:07

Re: Positionierung von Text in Tabelle mit VBA

Beitragvon theoS » 13. Apr 2021, 14:15

Hab ich dir ja schon gesagt: Im Absatz.
Wenn du einen Style bearbeiten möchtest, der einheitlich ist, kannst du das umständlich mit VBA machen, oder du gönnst den Kollegen eine Tabellenformatvorlage die sie einmalig in einer Vorlagendatei die im Vorlagenordner rumgammelt, zur Verfügung steht.
Wenn du das mit VBA machen willst, dann viel Vergnügen.
Hier kannst du aber auch erst was tun, wenn du den Style hast. Den würde ich dann mit VBA auch erst erstellen, das kannst du im Prinzip schon alles aufzeichnen. Die Hälfte des Codes ist dann zwar unnütz, und du müsstest alles vom ActiveDocument befreien, aber das ist ja so schlimm auch wieder nicht.
z.B. die Zellausrichtung in meiner Tabellenformatvorlage, die ich geändert hab:

Code: Alles auswählen
 With ActiveDocument.Styles("GelbKopf").ParagraphFormat
        .LeftIndent = CentimetersToPoints(0)
        .RightIndent = CentimetersToPoints(0)
        .SpaceBefore = 0
        .SpaceBeforeAuto = False
        .SpaceAfter = 0
        .SpaceAfterAuto = False
        .LineSpacingRule = wdLineSpaceSingle
        .Alignment = wdAlignParagraphCenter
        .WidowControl = True
        .KeepWithNext = False
        .KeepTogether = False
        .PageBreakBefore = False
        .NoLineNumber = False
        .Hyphenation = True
        .FirstLineIndent = CentimetersToPoints(0)
        .OutlineLevel = wdOutlineLevelBodyText
        .CharacterUnitLeftIndent = 0
        .CharacterUnitRightIndent = 0
        .CharacterUnitFirstLineIndent = 0
        .LineUnitBefore = 0
        .LineUnitAfter = 0
        .MirrorIndents = False
        .TextboxTightWrap = wdTightNone
        .CollapsedByDefault = False
    End With

Wie gesagt: Zentrieren in horizontaler Ebene geht über das Absatzformat. Auch im Style.
Hier ändert das Ding alles Zellen auf zentriert.
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5600
Registriert: 19. Apr 2008, 00:14

Re: Positionierung von Text in Tabelle mit VBA

Beitragvon Gastheute » 13. Apr 2021, 14:59

.ParagraphFormat findet sich nicht in dem obigen Style, das ich gezeigt habe, die Methode steht dort nicht zur Verfügung.
Ich brauche eine VerticalAlignment keine horizontale Positionierung.

Irgendwie sprichst du von einem anderen Style als den, den ich oben gezeigt habe.
Gastheute
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 95
Registriert: 09. Mär 2021, 16:07

Re: Positionierung von Text in Tabelle mit VBA

Beitragvon theoS » 13. Apr 2021, 16:14

Ich spreche von einem Style, der was mit der Tabelle zu tun hat, von was für einem du sprichst, weiß ich nicht. Du hast einfach Style gesagt. Das ist wie wenn du in eine Menschenmenge "Mensch komm" rufst und erwartest, dass Otto kommt der aber vorher auch nie deine Stimme gehört hat.
Word will hier schon genau wissen was du von ihm willst.
da hilft auch nichts, dass du das 100 mal sagst, davon weiß es weder ich noch Word.
Style ist einmal einer der den Absatz behandelt, der hat im Allgemeinen keine Tabelle.
Dann gibt es einen Tabellenstyle, der hat wiederum einen Absatzstyle drin. Das ist alles nicht so linear wie du dir das vorstellst. Lass die Finger vom Style und formatier den Kram einzeln durch, da hast du schon Code dafür gekriegt, das funktioniert auch.
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5600
Registriert: 19. Apr 2008, 00:14

Re: Positionierung von Text in Tabelle mit VBA

Beitragvon Gastheute » 14. Apr 2021, 10:08

Guten Morgen Theo,

danke für den Hinweis. Ich weiß allerdings leider nicht wirklich, was ich jetzt am besten machen soll. Nach meinem Verständnis bedarf es nur einer Kleinigkeit und dann sollte das funktionieren. Dein Vorschlag läuft auf Aufwand hinaus, in meinen Ohren, den ich gerade nicht verstehe. Sorry für das Begriffsstutzen. :(

Ich habe bisher nur Tabellenstyles programmiert, da mein Ergebnisdokument nur 3 Tabelle beinhaltet (im Kopf- und Fußbereich, und im Dokumentinhalt)

Wie kann ich in dieses Tabellenstyle einen Absatzformat-VerticalAlignment einfügen? Ich ahne, du bist davon nicht begeistert. Ich komme leider aber mit deiner Erklärung nicht klar und weiß nicht, was du genau bevorzugst und wie das geht, was du meinst.

Vielen Dank und gute Grüße,
T.
Gastheute
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 95
Registriert: 09. Mär 2021, 16:07

Re: Positionierung von Text in Tabelle mit VBA

Beitragvon theoS » 14. Apr 2021, 12:33

Also, das mit dem veritkalen Zentrieren im Style ist so eine Option, die über VBA einfach nicht gesteuert werden kann.
Da haben sie so einige Sachen die in den Klickibuntibefehlen stecken, nicht implementiert, wie mir scheint, als sie die Tabellenformatvorlagen mit der 2007er Version neu aufstellten.
Zumindest ist mir davon bisher im Netz noch nichts untergekommen.

Du kannst das aber doch machen, indem du die Zellen, die so behandelt werden sollen entsprechend behandelst.
Das habe ich dir ein wenig weiter oben schon mal gezeigt:
Code: Alles auswählen
With tabKopf
.Rows(1).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter 'das stellt den Absatz in die Mitte
.Rows(1).Cells.VerticalAlignment = wdCellAlignVerticalCenter ' das zentriert die Zeile 1 wie gedacht, Vertikal.
'.Rows(2).Cells(3).VerticalAlignment = wdCellAlignVerticalCenter 'hier stellst du die 3. Zelle der zweiten Reihe auf mittig
end with

dumm ist halt hier, dass man keine Zellebereiche wie in Excel angeben kann.
Da kannst du aber auch mit Schleifen arbeiten.
Aber dazu musst du nicht im Style rumpfuschen. Würde mich schön bedanken, wenn du mir meinen Tabellenstyle zerschießt. :)
Und was den Aufwand betrifft, den hast du doppelt mit dem Style, den du ja nicht so manipulieren kannst wie du willst.
Du gehst einfach die Spalten oder die Zeilen durch die du so haben willst, das ist alles.
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5600
Registriert: 19. Apr 2008, 00:14

Re: Positionierung von Text in Tabelle mit VBA

Beitragvon Gastheute » 14. Apr 2021, 13:28

Das ist ja gerade das, was ich schon in meinem Code verarbeitet hatte und eingefügt. Aber es funktioniert nicht: die Tabellenzeilen mit Text zeigen sich nicht vertical zentriert, wie in deinem und meinem Code angegeben. Das ist ja gerade das Problem, dass dies nicht funktioniert. Jetzt sind wir wieder am Anfang angekommen.

Code: Alles auswählen
 For i = 1 To 17
        tblInhaltA.Cell(n, 1).Range.Text = strFelderTexteVB(n)
        tblInhaltA.Cell(n, 1).Range.Bold = wdToggle
        tblInhaltA.Cell(n, 1).Shading.Texture = wdTexture10Percent
        ' VerticalAlignment funktioniert nicht, warum?
        tblInhaltA.Rows(n).Cells.VerticalAlignment = wdAlignVerticalCenter
        tblInhaltA.Cell(m, 1).Range.Text = strFelderTexteVB(m)
        tblInhaltA.Rows(m).Cells.VerticalAlignment = wdAlignVerticalCenter
n = n+2
m = m+2
next i

Ratlos.
Gastheute
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 95
Registriert: 09. Mär 2021, 16:07

Re: Positionierung von Text in Tabelle mit VBA

Beitragvon theoS » 14. Apr 2021, 13:33

Lies mal noch mal meinen Code.
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5600
Registriert: 19. Apr 2008, 00:14

Re: Positionierung von Text in Tabelle mit VBA

Beitragvon Gastheute » 14. Apr 2021, 14:14

Ohje, ich hatte eben erst Hoffnung geschöpft, dass es am wdCellAlignVerticalCenter liegt, aber nein, die Zeile Text in den entsprechenden Tabellenzeilen in tabInhalt bleibt dezentriert und noch oben gerückt erscheinend. :( Auch wenn ich den entsprechenden Code etwas anders im Tabellencode positioniere, kommt der Text der Tabellenzeile vertikal dezentriert heraus. :(
Gastheute
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 95
Registriert: 09. Mär 2021, 16:07

Nächste

Zurück zu Word Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste