2.7k Aufrufe
Gefragt in Tabellenkalkulation von peters Mitglied (460 Punkte)
Hallo zusammen,

ich fülle Zellen mit aus mehreren Zellbezügen zusammengesetztem Text.

Mitunter wird dieser Text zu lang, so dass dieser umbrochen werden muss. Das klappt mittels der Voreinstellung "Zeilenumbruch" auch problemlos.

Allerdings:
Die Zeilenhöhe passt sich nicht automatisch an!

Gibt es eine Lösung dafür, oder bleibt mir nur, die Höhe von vornherein doppelt so hoch zu gestalten?
Das sähe allerdings im Ausdruck blöd aus.

Die Schriftgröße an die Zellgröße anzupassen ist, nebenbei bemerkt, keine Option, da es dann wirklich unleserlich wird.

Liebe Grüße

Peter

12 Antworten

0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)

Hallo Peter,

kopiere das folgende Makro in ein Standardmodul deiner Arbeitsmappe:

Sub Zeilenhoehe()

With ActiveSheet
  .Rows(1 & ":" & .UsedRange.SpecialCells(xlCellTypeLastCell).Row).AutoFit
End With

End Sub


Wenn du alle Eingaben erledigt hast, führe das Makro aus. Damit wird in allen Zeilen ab Zeile 1 die Zeilenhöhe automatisch angepasst.

Gruß

M.O.

0 Punkte
Beantwortet von peters Mitglied (460 Punkte)
Guten Morgen MO,

das ist toll, danke!

Wie müsste ich das definieren, wenn ich Zeile 5-8 und Zeile 13-17 auf Höhe 40 px setzen wollte?

Dann könnte ich die Zeilen eiinzeln abgrasen und mit einer if-Schleife prüfen, ob z.B. der Text in der
jeweiligen Zeile im Feld Spalte x jeweils zu lang ist und nur dann die Zeilenhöhe anpassen, oder?

LG

Peter
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)

Hallo Peter,

eine bestimmte Zeilenhöhe kannst die wie folgt festlegen:

With ActiveSheet
  .Rows("5:8").RowHeight = 40#
  .Rows("13:17").RowHeight = 40#
End With

Dann könnte ich die Zeilen eiinzeln abgrasen und mit einer if-Schleife prüfen, ob z.B. der Text in der jeweiligen Zeile im Feld Spalte x jeweils zu lang ist und nur dann die Zeilenhöhe anpassen, oder?

Mir ist nicht bekannt, wie du prüfen könntest, ob der Text "zu lang" für eine Zelle ist.

Mit Autofit wird die Zeilenhöhe (oder Spaltenbreite) automatisch an den "höchsten" (bei Spalten an den "breitesten") Eintrag in der Zeile (Spalte) angepasst.

Gruß

M.O.

0 Punkte
Beantwortet von peters Mitglied (460 Punkte)
Hallo MO,

ob der Text "zu lang" für eine Zelle ist, lässt sich durch einen Workaround definieren, indem ich austeste, wieviele Zeichen in der Zelle ohne Umbruch dargestellt werden können. Wenn das z.B. 50 Zeichen sind, kann ich also abfragen

if länge(F5)>50 then
...

Was mit vorschwebt ist eine Einzelabfrage in einer Art Schleife (in dem Bereich bin ich noch unwissender als ohnehin schon), in der definiert wird

zu prüfenden Zeilen 5-8 und 11-17
prüfe in jeder Zeile, ob cell(x, 5) länge(F5)>50
wenn ja, dann setze Zeilenhöhe auf 40px
wenn nein, dann setze Zeilenhöhe auf 24px
nächste Zeile

Mit der zweiten Prüfung "wenn nein" würde darauf reagiert, wenn der Text nach einer Erhöhung der Zeilenhöhe wieder kleiner wurde und weniger als 51 Zeichen hat.

Wenn das dann in den Code der entsprechenden Tabelle käme und jeweils beim Aktivieren durchläuft,
wäre das Ding glatt, oder?

LG

Peter
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)

Hallo Peter,

probiere es doch einfach aus wink. Wenn es so für dich funktioniert ist das gut. Ich würde aber nicht das Activate-Ereignis des Arbeitsblattes nehmen. Wenn du auf das Arbeitsblatt gehst, wird der Code ausgeführt. Änderst du aber danach etwas im Arbeitsblatt sieht das Blatt ggf. dann beim Ausdruck völlig anders. Ich würde dann lieber das BeforePrint-Ereignis der Arbeitsmappe nehmen:

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim lngZeile As Long

'Makro verlassen, wenn nicht aus Tabelle 1 gedruckt wird - Name anpassen
If ActiveSheet.Name <> "Tabelle1" Then Exit Sub

With Worksheets("Tabelle1")     'Name der Tabelle anpassen
  For lngZeile = 5 To 8
    If Len(.Cells(lngZeile, 5).Value) > 50 Then .Rows(lngZeile).RowHeight = 40#
  Next lngZeile
  For lngZeile = 11 To 17
    If Len(.Cells(lngZeile, 5).Value) > 50 Then .Rows(lngZeile).RowHeight = 40#
  Next lngZeile
End With

End Sub

Gruß

M.O.

0 Punkte
Beantwortet von peters Mitglied (460 Punkte)
Hallo MO,

das klappt soweit grundsätzlich super, danke!  :-)

2 Fragen dazu noch:

1. Wie bekomme ich die elseif "wenn nein, dann setze Zeilenhöhe auf 24px"-Bedingung in den Code?
    Ich habe bei dem Versuch nur Fehler produziert  :-/

2. In den ausgelesenen Zellen sind Formeln hinterlegt, darauf springt der Code natürlich an.
    Kann ich das Ausgabeergebnis der Formel auslesen für die Prüfung?

LG

Peter
0 Punkte
Beantwortet von halfstone Profi (18.1k Punkte)

Hi Peter,

bei deinem Workaround musst du dran denken, dass Buchstaben verschiedene Weiten haben. Ein W ist breiter als ein I, daher ist das ein sehr ungenauer Wert, die 50 Zeichen. Schreib mal lauter W's in die Zelle und schaue ob das auch passt oder ob solche Wörter überhaupt in deiner Tabelle vorkommen können.

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

Beides mal 50 Zeichen.

Gruß Fabian

0 Punkte
Beantwortet von peters Mitglied (460 Punkte)
Hallo Fabian,

danke für den Hinweis, das hatte ich aber bereits berücksichtigt.  ;-)

Gruß

Peter
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)

Hallo Peter,

eigentlich sollte durch den Zusatz .Value bei Angabe der Zellen die Länge des Inhalts ermittelt werden. Bei mir klappt der Code, auch wenn in der betreffenden Zelle eine Formel steht und das Formelergebnis mindestens 50 Zeichen beträgt.

Hier mal der Code mit der Else-Anweisung:

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim lngZeile As Long

'Makro verlassen, wenn nicht aus Tabelle 1 gedruckt wird - Name anpassen
If ActiveSheet.Name <> "Tabelle1" Then Exit Sub

With Worksheets("Tabelle1")     'Name der Tabelle anpassen
  For lngZeile = 5 To 8
    If Len(.Cells(lngZeile, 5).Value) > 50 Then
       .Rows(lngZeile).RowHeight = 40#
      Else
       .Rows(lngZeile).RowHeight = 24#
     End If
  Next lngZeile
  For lngZeile = 11 To 17
    If Len(.Cells(lngZeile, 5).Value) > 50 Then
      .Rows(lngZeile).RowHeight = 40#
      Else
       .Rows(lngZeile).RowHeight = 24#
     End If
  Next lngZeile
End With

End Sub

Gruß

M.O.

0 Punkte
Beantwortet von peters Mitglied (460 Punkte)

Hallo MO,

jo, hatte einen Fehler, deshalb funzte das nicht richtig. Wieder einmal ein echter Stirnklatscher...
Jetzt klappt die Routine phantastisch, danke!  :-)
Das Einzige, das nochnicht funktioniert, ist die Ausführung vor dem Drucken.
(ich hatte das zunächst als einfache Sub() ausgetestet)
 
Ich habe den Tabellennamen entsprechend angepasst und es sowohl mit der direkten Eingabe in dem Tabellenblatt versucht, als auch über den Call-Befehl.
Nix ist! Blatt bleibt, wie es ist.  :-/
Egal, ob ich drucke über Strg+P oder mich durchs Menü hangele.
Hast Du eine Idee, wo mein Fehler liegt?
Grüße
Peter
...