ich stehe vor einem Rätsel. Ich möchte in einer Tabelle alle Zellen bis auf
die der ersten Spalte und die der ersten Zeile mit der Ausrichtung
rechtsbündig versehen. Und obwohl der von mir gewünschte Bereich richtig
selektiert wird, werden ab der dritten Zeile auch die Zellen der ersten
Spalte auf rechtsbündig gesetzt, ist das irgendwie erklärbar, warum sich
Word so verhält?
Hier ist mein kleines Makro:
Sub ZellenAusrichtung()
Dim tbl As Word.Table
Dim rng As Word.Range
Set tbl = ActiveDocument.Tables.Add(Selection.Range, 4, 5,
wdWord8TableBehavior, wdAutoFitFixed)
Set rng = ActiveDocument.Range
With rng
.Start = tbl.Columns(2).Cells(2).Range.Start
.End =
tbl.Columns(tbl.Columns.Count).Cells(tbl.Columns(tbl.Columns.Count).Cells.Count).Range.End
.Select
.ParagraphFormat.Alignment = wdAlignParagraphRight
End With
End Sub
Man kann bestimmt den rng eleganter setzen, aber bei der Zeile rng.Select
wird bei mir zumindest genau der Bereich (= genau die Zellen) markiert, den
ich bearbeiten will, Word aber anscheinend nicht...:-(
Danke fürs Lesen und eventuelle Tips.
Viele Grüße aus dem hohen flachen Norden Deutschlands
Susanne
--
Office XP, SP3, aktueller Patchstand
Windows 2000, SP4, aktueller Patchstand
KI-TRIPLE 2007
>ich stehe vor einem Rätsel. Ich möchte in einer Tabelle alle Zellen bis auf
>die der ersten Spalte und die der ersten Zeile mit der Ausrichtung
>rechtsbündig versehen. Und obwohl der von mir gewünschte Bereich richtig
>selektiert wird, werden ab der dritten Zeile auch die Zellen der ersten
>Spalte auf rechtsbündig gesetzt, ist das irgendwie erklärbar, warum sich
>Word so verhält?
intern ist eine Tabelle eine eindimensionale(!) Folge von Zellen von
Zelle(1) bis Zelle (x). Wenn ein Range von a bis x definiert wird,
schließt der alle Zellen in diesem Range ein. Da mit Selection nur
rechteckige Bereiche markierbar sind, also keine Treppen, hält sich
Selection nicht an den definierten Range, sondern nur an die
Eckpunkte. Tut mir leid, eine bessere Definition fällt mir zur Zeit
nicht ein.
So gehts jedenfalls:
Sub ZellenAusrichtung2()
Dim tbl As Word.Table
Dim rng As Word.Range
Dim oCl As Word.Cell
Set tbl = ActiveDocument.Tables.Add( _
selection.Range, 4, 5, _
wdWord8TableBehavior, wdAutoFitFixed)
Set rng = ActiveDocument.Range
With rng
.start = tbl.Columns(2).Cells(2).Range.start
.End = _
tbl.Columns(tbl.Columns.Count).Cells(tbl.Columns(tbl.Columns.Count).Cells.Count).Range.End
.Select
For Each oCl In selection.Cells
oCl.Range.ParagraphFormat.Alignment = wdAlignParagraphRight
Next
End With
End Sub
--
Gruß
Helmut Weber, MVP WordVBA
Vista Small Business, Office XP
> ich stehe vor einem Rätsel. Ich möchte in einer Tabelle alle Zellen bis auf
> die der ersten Spalte und die der ersten Zeile mit der Ausrichtung
> rechtsbündig versehen. Und obwohl der von mir gewünschte Bereich richtig
> selektiert wird, werden ab der dritten Zeile auch die Zellen der ersten
> Spalte auf rechtsbündig gesetzt, ist das irgendwie erklärbar, warum sich
> Word so verhält?
Word arbeitet die Zellen von links nach rechts ab. In der letzten
rechten Zelle folgt als nächste Zelle die 1. linke Zelle der 2. Zeile.
Das merkt man auch wenn man in der letzten Zelle Tab drückt, dann wird
links eine neue Zeile erzeugt. Der Range von der 2. Zelle der 1. Zeile
bis zum Ende der Tabelle enthält daher die 1. Zelle der folgenden
Zeilen. Deswegen muss der Range für jede Zeile neu gesetzt werden:
Sub ZellenAusrichtung()
Dim tbl As Word.Table
Dim rng As Word.Range
Dim i As Integer
Set tbl = ActiveDocument.Tables.Add(Selection.Range, 4, 5, _
wdWord8TableBehavior, wdAutoFitFixed)
For i = 2 To tbl.Rows.Count
Set rng = ActiveDocument.Range(Start:=tbl.Rows(i).Cells
(2).Range.Start, _
End:=tbl.Rows(i).Cells(tbl.Columns.Count).Range.End)
rng.ParagraphFormat.Alignment = wdAlignParagraphRight
Next i
Set rng = Nothing
Set tbl = Nothing
End Sub
_____
Gruß
Lisa
_____
http://www.schreibbuero-richter.de/vba.html
>> ich stehe vor einem Rätsel. Ich möchte in einer Tabelle alle Zellen bis auf
>> die der ersten Spalte und die der ersten Zeile mit der Ausrichtung
>> rechtsbündig versehen. Und obwohl der von mir gewünschte Bereich richtig
>> selektiert wird, werden ab der dritten Zeile auch die Zellen der ersten
>> Spalte auf rechtsbündig gesetzt, ist das irgendwie erklärbar, warum sich
>> Word so verhält?
> intern ist eine Tabelle eine eindimensionale(!) Folge von Zellen von
> Zelle(1) bis Zelle (x). Wenn ein Range von a bis x definiert wird,
> schließt der alle Zellen in diesem Range ein. Da mit Selection nur
> rechteckige Bereiche markierbar sind, also keine Treppen, hält sich
> Selection nicht an den definierten Range, sondern nur an die
> Eckpunkte. Tut mir leid, eine bessere Definition fällt mir zur Zeit
> nicht ein.
Aber immerhin kann ich mir jetzt etwas vorstellen, danke schön.
Ich habe jetzt mal Deine Version bei mir eingebaut, gefällt mir
gefühlsmäßig besser als jedesmal wieder den Range neu festzulegen (das
macht für mich den Code irgendwie noch unleserlicher als er sowieso schon
ist). Da ich kein Freund von Select oder Selection außerhalb von
Debuggingzwecken bin, dachte ich, ich könnte den Part auslassen und
stattdessen im rng.Cells alle Zellen durchlaufen, das führt aber leider
wieder zur nicht erwünschten Lösung. Gibt es noch eine andere Variante,
diese doofe Selection wegzulassen?
Aber auf jeden Fall vielen Dank Euch beiden, ich kann den Kampf jetzt
weiter fortsetzen.
>
> Aber immerhin kann ich mir jetzt etwas vorstellen, danke schön.
>
> Ich habe jetzt mal Deine Version bei mir eingebaut, gefällt mir
> gefühlsmäßig besser als jedesmal wieder den Range neu festzulegen (das
> macht für mich den Code irgendwie noch unleserlicher als er sowieso schon
> ist). Da ich kein Freund von Select oder Selection außerhalb von
> Debuggingzwecken bin, dachte ich, ich könnte den Part auslassen und
> stattdessen im rng.Cells alle Zellen durchlaufen, das führt aber leider
> wieder zur nicht erwünschten Lösung. Gibt es noch eine andere Variante,
> diese doofe Selection wegzulassen?
Eben, meine Version kommt ohne Selection aus. Der Range wird sauber
gebildet, ganz ohne Selection. In Hartmuts Beispiel funktioniert es
nur mit der Selection, weil selektierte Columns angesprochen werden
können. Columns selbst haben keinen Range, weswegen man keinen Range
mit ihnen bilden kann (sondern nur mit selektierten Columns). Wenn die
Selection weggelassen werden soll (was ich auch befürworte), probier
bitte noch meine Version, dort wird der Range einfach in jeder Zeile
neu gesetzt.
>> Ich habe jetzt mal Deine Version bei mir eingebaut, gefällt mir
>> gefühlsmäßig besser als jedesmal wieder den Range neu festzulegen (das
>> macht für mich den Code irgendwie noch unleserlicher als er sowieso schon
>> ist). Da ich kein Freund von Select oder Selection außerhalb von
>> Debuggingzwecken bin, dachte ich, ich könnte den Part auslassen und
>> stattdessen im rng.Cells alle Zellen durchlaufen, das führt aber leider
>> wieder zur nicht erwünschten Lösung. Gibt es noch eine andere Variante,
>> diese doofe Selection wegzulassen?
> Eben, meine Version kommt ohne Selection aus. Der Range wird sauber
> gebildet, ganz ohne Selection. In Hartmuts Beispiel funktioniert es
> nur mit der Selection, weil selektierte Columns angesprochen werden
> können. Columns selbst haben keinen Range, weswegen man keinen Range
> mit ihnen bilden kann (sondern nur mit selektierten Columns). Wenn die
> Selection weggelassen werden soll (was ich auch befürworte), probier
> bitte noch meine Version, dort wird der Range einfach in jeder Zeile
> neu gesetzt.
Schade eigentlich, sowas habe ich schon befürchtet. Ich habe also die Wahl
zwischen Pest und Cholera.:-(
Wie ich oben schon schrieb: jedesmal wieder neu den Range festzulegen und
damit einen Bereich zu zersplittern, der eigentlich nur ein einziger ist,
ist für mich nicht nachvollziehbar. Spätestens beim nächsten Mal, wo ich in
den Code gucke, verstehe ich mit ziemlicher Sicherheit nichts mehr, weil
mir das extrem unlogisch vorkommt. Denn dies entspricht auch nicht der
Vorgehensweise mit dem GUI. Wenn ich dort dasselbe mache, also mit
Tastatur/Maus den gleichen Bereich markiere und über Format/Absatz die
Ausrichtung ändere, bleiben die Zellen der ersten Spalte gänzlich
unberührt, da verändert sich keine Ausrichtung.
Tja, Pest oder Cholera, da hilft wohl nur ein Münzwurf.;-)
Vielen Dank für Deine Hilfe und
> Wie ich oben schon schrieb: jedesmal wieder neu den Range festzulegen und
> damit einen Bereich zu zersplittern, der eigentlich nur ein einziger ist,
> ist für mich nicht nachvollziehbar. Spätestens beim nächsten Mal, wo ich in
> den Code gucke, verstehe ich mit ziemlicher Sicherheit nichts mehr, weil
> mir das extrem unlogisch vorkommt.
Das gibt sich, wenn Du öfter mit Tabellen in Word arbeitest. Schreib
Dir einen ausführlichen Kommentar in den Code hinein, und zwar so
ausführlich, dass Du beim nächsten Mal noch weißt, warum die
Konstruktion so gewählt ist.
> Denn dies entspricht auch nicht der
> Vorgehensweise mit dem GUI. Wenn ich dort dasselbe mache, also mit
> Tastatur/Maus den gleichen Bereich markiere und über Format/Absatz die
> Ausrichtung ändere, bleiben die Zellen der ersten Spalte gänzlich
> unberührt, da verändert sich keine Ausrichtung.
Genau, die Benutzerschnittstelle verwendet die Selection dafür. Für
mich wäre das trotzdem kein Grund, die Selection zu verwenden, wenn es
auch ohne geht.
> Tja, Pest oder Cholera, da hilft wohl nur ein Münzwurf.;-)
Seh ich nicht so. Ich nehme lieber die zuverlässigere Variante, auch
wenn der Code etwas länger ist. Lieber einen ausführlichen Kommentar.
Jedesmal, wenn man den Kommentar wieder liest, tritt sozusagen ein
"wiederholender Lerneffekt" ein. Nach einiger Zeit muss man den
Kommentar nicht mehr lesen, weil man mit dem Objektmodell besser
vertraut ist. ;)
Noch einen schönen Restsonntag,
Gruß
Lisa
_____
http://www.schreibbuero-richter.de/word.html
> Spätestens beim nächsten Mal, wo ich in
> den Code gucke, verstehe ich mit ziemlicher Sicherheit nichts mehr, weil
> mir das extrem unlogisch vorkommt. Denn dies entspricht auch nicht der
> Vorgehensweise mit dem GUI. Wenn ich dort dasselbe mache, also mit
> Tastatur/Maus den gleichen Bereich markiere und über Format/Absatz die
> Ausrichtung ändere, bleiben die Zellen der ersten Spalte gänzlich
> unberührt, da verändert sich keine Ausrichtung.
Manuell hätte ich es wahrscheinlich so gemacht:
ganze Tabelle markieren, alles rechtsbündig
erste Zeile markieren, alles linksbündig
erste Spalte markieren, alles linksbündig
Das mit VBA nachzubilden, dürfte nicht so schwer sein.
Klappt natürlich nicht, wenn die erste Zeile/Spalte nicht umformatiert werden darf.
Gruß
Bernhard Sander
[...]
> Manuell hätte ich es wahrscheinlich so gemacht:
> ganze Tabelle markieren, alles rechtsbündig
> erste Zeile markieren, alles linksbündig
> erste Spalte markieren, alles linksbündig
> Das mit VBA nachzubilden, dürfte nicht so schwer sein.
das hatte ich sogar gemacht. Nachdem ich das Desaster sah, dachte ich mir:
na gut, dann angel ich mir mal die erste Spalte und mache sie wieder
linksbündig. Aber der Schuss ging nach hinten los, da veränderte er dann
wieder Zellen, die ich vorher so mühsam hinformatiert hatte.:-(
Wordtabellen sind ein hartes Brot, ich habe schon das nächste Problem
ausgemacht, seufz.
> Manuell hätte ich es wahrscheinlich so gemacht:
> ganze Tabelle markieren, alles rechtsbündig
> erste Zeile markieren, alles linksbündig
> erste Spalte markieren, alles linksbündig
>
> Das mit VBA nachzubilden, dürfte nicht so schwer sein.
Genau das dachte ich auch.
Ich habe es dann erst mal ausprobiert und bin genau auf Susannes
Desaster gestoßen.
Ich halte das, was Word da tut, für einen echten dicken Bug, denn wenn ich
---snip---
ActiveDocument.Tables(1).Columns(1).Select
Selection.Range.Paragraphs.Alignment = wdAlignParagraphLeft
---snap---
hinschreiben kann, dann soll das Programm gefälligst auch genau das tun
und nicht diverse nicht-selektierte Zellen auch noch ändern.
Und vielleicht ziehst Du nächstes Mal auch in Erwägung, erst mal
auszuprobieren, was Du beschreibst? Es wird dann sicher etwas viel
Nützlicheres dabei herauskommen.
Wolfram
Sub ZellenAusrichtung()
Dim tbl As Word.Table
Dim rng As Word.Range
Dim col As Column
Dim cel As Cell
Set tbl = ActiveDocument.Tables.Add(Selection.Range, 4, 5,
wdWord8TableBehavior, wdAutoFitFixed)
For Each col In tbl.Columns
If col.Index > 1 Then
For Each cel In col.Cells
If cel.RowIndex > 1 Then
cel.Range.ParagraphFormat.Alignment = wdAlignParagraphRight
End If
Next
End If
Next
end Sub
Dein anderes Problem konnte ich unter W2002 nicht nachstellen, ich habe es
ohne Style gemacht.
ggf. ist es ein W2000 zu W2002 Effekt, da da für Tabellen einige Features
hinzukammen.
cu CS
> Zelle für Zelle geht es ohne Probleme.
[Code gesnipt]
Schönen Dank, das werde ich auch mal testen. Ich würde zwar vermuten, dass
eine doppelte Schleife nicht so performant ist, aber bei meinen kleinen
Tabellen wird das nichts ausmachen.
> Dein anderes Problem konnte ich unter W2002 nicht nachstellen, ich habe es
> ohne Style gemacht.
Noch eine neue Info, ich kann also die Zeile mit dem Style ersatzlos
streichen, sehr schön!
> ggf. ist es ein W2000 zu W2002 Effekt, da da für Tabellen einige Features
> hinzukammen.
Das kann es nicht sein, denn mein Code läuft zur Zeit noch ausschließlich
auf WordXP, der Einsatz auf Word2000 steht noch aus.
> > Manuell hätte ich es wahrscheinlich so gemacht:
> > ganze Tabelle markieren, alles rechtsbündig
> > erste Zeile markieren, alles linksbündig
> > erste Spalte markieren, alles linksbündig
> >
> > Das mit VBA nachzubilden, dürfte nicht so schwer sein.
>
> Genau das dachte ich auch.
>
> Ich habe es dann erst mal ausprobiert und bin genau auf Susannes
> Desaster gestoßen.
>
> Ich halte das, was Word da tut, für einen echten dicken Bug, denn wenn ich
>
> ---snip---
> ActiveDocument.Tables(1).Columns(1).Select
> Selection.Range.Paragraphs.Alignment = wdAlignParagraphLeft
> ---snap---
>
> hinschreiben kann, dann soll das Programm gefälligst auch genau das tun
> und nicht diverse nicht-selektierte Zellen auch noch ändern.
Das ist kein Bug, sondern der falsche Code. Um genau diese Handlung in der
Benutzerschnittstelle nachzubilden: Spalte 1 auswählen und linksbündig zu
formatieren, lautet der Code nämlich:
ActiveDocument.Tables(1).Columns(1).Select
Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft
Das ist ein Unterschied! Dieser Code tut nämlich genau das, was erwartet
wird, er formatiert nur die 1. Spalte und lässt die anderen Spalten
unangetastet.
Und im Übrigen hat Susanne ja bereits in zwei Varianten den sauberen Code
ohne Selection, wie man die Tabellenspalten bearbeitet. Da mein erster
Beitrag aber offenbar hier nicht mehr zu sehen ist, versuche ich das nochmals
zu verdeutlichen:
Im Objektmodell von Word haben die Spalten von Tabellen keine
Range-Eigenschaft. Das ist weder bösartig noch fies von Word, sondern ist im
Objektmodell so angelegt. Eine Range-Eigenschaft haben jedoch die Zeilen und
die Zellen. Deswegen kann man (wie Carsten oben) durch die Zeilen und die
Zellen schleifen und deren Range bearbeiten, was vollkommen zuverlässig
funktioniert.
Oder man kann, wie in meiner Schleife durch die Zeilen der Tabelle schleifen
und in jeder Zeile einen Range von der 2. bis zur letzten Zelle bilden, den
man bearbeitet. Auch das funktioniert vollkommen zuverlässig. Beide Varianten
funktionieren ganz ohne Selection.
Der andere Weg ist, man geht über die Selection. Die Selection hat eine
Range-Eigenschaft. Wenn man folglich eine Spalte einer Tabelle selektiert,
kann man die Range-Eigenschaft der Selection verwenden, wie jetzt eben
gezeigt.
Und hier gebe ich Susanne recht: Tabellen in Word sind einer der Fälle
(besonders, wenn es um große Tabellen geht), in denen es Situationen gibt, in
denen die Arbeit mit Selection Möglichkeiten bietet, die man bei der Arbeit
mit Ranges nicht hat. Wenn ich in einer Tabelle über 10 Seiten eine Spalte
formatieren will, kann man sehr leicht feststellen, dass hier die Benutzung
der Selection deutlich schneller (in dem Sinne performanter) ist als die
Verwendung des Ranges.
--
Cool. Dass Selection direkt ein eigenes Paragraphformat haben könnte
(ohne .range. dazwischen), darauf bin ich nicht gekommen.
Danke für die Klarstellung, wieder was gelernt.
Wolfram