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

Forumthread: Zeilenhöhe automatisch an Text anpassen

Zeilenhöhe automatisch an Text anpassen
Henning
Hallo Experten,
ich habe schon lange recherchiert und probiert, leider komm ich nicht zum gewünschten Ergebnis.
Ich möchte in der Zeile 24, wo ein variabler Text drin steht automatisch dahingehend anpassen, das der Inhalt lesbar ist (Höhe der Zeile). Dies soll automatisch passieren und kann in ein bereits in der Datei vorhandenes Makro zur Erstellung des Inhaltes eingebaut werden.
Vielen Dank für Eure Hilfe.
P.S. folgender Code funktioniert nicht:
...
Rows("24:24").Select
Rows("24:24").EntireRow.AutoFit
...
Anzeige
AW: Zeilenhöhe automatisch an Text anpassen
16.09.2010 10:34:49
JogyB
Hallo Henning,
sind in der Zeile verbundene Zellen?
Gruß, Jogy
AW: Zeilenhöhe automatisch an Text anpassen
16.09.2010 10:40:47
Henning
Hallo,
es sind dort keine Zellen verbunden.
Mfg
Henning
AW: Zeilenhöhe automatisch an Text anpassen
16.09.2010 10:37:47
xr8k2
Hallo Henning,
eigentlich sollte einfach das hier funktionieren:
'...
Rows(24).Autofit
'...
Problematisch wird´s jedoch, wenn der zu berücksichtigende Text in verbundenen Zellen steht.
Gruß,
xr8k2
Anzeige
AW: Zeilenhöhe automatisch an Text anpassen
16.09.2010 10:41:44
Henning
Hi ihr zwei,
sorry die Zellen sind doch miteinander verbunden...
AW: Zeilenhöhe automatisch an Text anpassen
16.09.2010 11:39:57
JogyB
Hallo Henning,
dachte ich mir doch ;).
Der Code führt einen Autofit bei verbundenen Zellen durch:
' Autofit von verbundenen Zellen
Public Sub instantFitHeight(Optional myCells)
Dim tempWidth As Double
Dim zeLLe As Range
Dim totalWidth As Double
Dim totalPxWidth As Double
Dim tempHeight As Double
Dim oldHeight As Double
Application.ScreenUpdating = False
On Error GoTo fitErr
If IsMissing(myCells) Then
Set myCells = Selection
End If
With myCells
' Macht nur etwas für einzelne Zeile, wenn die Zellen verbunden sind und wenn der  _
Zeilenumbruch aktiv ist
If .Rows.Count = 1 And .MergeCells = True And (.WrapText = True Or IsNull(.WrapText))  _
Then
' Speichert alte Zeilehöhe zwischen
oldHeight = .RowHeight
' Speichert die Breite der ersten Zelle zwischen
tempWidth = .Cells(1).ColumnWidth
' Berechnet die Gesamtbreite der verbundenen Zellen
For Each zeLLe In myCells
totalWidth = zeLLe.ColumnWidth + totalWidth
totalPxWidth = zeLLe.Width + totalPxWidth
Next
' Löst den Verbund auf
.MergeCells = False
' weist der ersten Zelle (dort steht der Text) die Gesamtbreite zu
.Cells(1).ColumnWidth = totalWidth
' Breitenkorrektur auf Breite in Pixel
.Cells(1).ColumnWidth = Application.Min(255, _
.Cells(1).ColumnWidth + (.Cells(1).ColumnWidth - .Cells(2).ColumnWidth) / _
(.Cells(1).Width - .Cells(2).Width) * (totalPxWidth - .Cells(1).Width))
' Führt Autofit durch
.EntireRow.AutoFit
' Speichert die Höhe zwischen
tempHeight = .RowHeight
' Weist der ersten zelle wieder die alte Breite zu
.Cells(1).ColumnWidth = tempWidth
' Verbindet die Zellen wieder
.MergeCells = True
' Weist Höhe zu (geht beim Verbinden wieder verloren)
.RowHeight = tempHeight
End If
End With
On Error GoTo 0
Application.ScreenUpdating = True
Exit Sub
endOnError:
On Error Resume Next
' Weist der ersten zelle wieder die alte Breite zu
myCells.Cells(1).ColumnWidth = tempWidth
' Verbindet die Zellen wieder
myCells.MergeCells = True
' Weist alte Höhe wieder zu
myCells.RowHeight = oldHeight
Application.ScreenUpdating = True
Exit Sub
fitErr:
' Unschön, aber einfach, Fehlerbehandlung muss beendet werden
Resume endOnError
End Sub

Das braucht die verbundene Zelle als Übergabewert und fittet diese dann. Funktioniert zu 99%, ab und an ist mal eine Zeile zu viel da, das scheint aber ein allgemeines Problem von Excel bei sehr breiten Zellen zu sein.
Gruß, Jogy
Anzeige
AW: Zeilenhöhe automatisch an Text anpassen
16.09.2010 11:47:56
Henning
Hallo Jogy,
vielen Dank für das Skript, es läuft durch, verändert aber leider nichts an meinem Arbeitsblatt Rechnung in der Zeile 24. Leider übersteigt das meine VBA Kenntnisse insoweit, das ich den Fehler auch nicht finden kann.
Aber vielen herzlichen Dank schon einmal für die Mühe...
Gruß
Henning
Anzeige
AW: Zeilenhöhe automatisch an Text anpassen
16.09.2010 14:13:36
JogyB
Hallo Henning,
wie gesagt, das wirkt nur für verbundene Zellen... versuch das mal, im Test hat das bei mir funktioniert. Es darf nur eine Zeile angegeben/markiert sein.
Sub fitHeightComplete(Optional myRow As Range)
Dim sPalte As Long
Dim tempHeight As Double
If myRow Is Nothing Then
Set myRow = Selection.EntireRow
Else
Set myRow = Selection.EntireRow
End If
' Geht nur für einzelne Zeile
If myRow.Rows.Count > 1 Or myRow.Areas.Count > 1 Then Exit Sub
Application.ScreenUpdating = False
' AutoFit-Höhe ohne die verbundenen Zellen
myRow.AutoFit
tempHeight = myRow.Height
' Und jetzt noch auslesen für alle verbundenen Zellen
With myRow
For sPalte = 1 To .Cells(1, Columns.Count).End(xlToLeft).Column
With .Cells(1, sPalte)
If .MergeCells Then
tempHeight = Application.Max(tempHeight, FitMergeHeight(.MergeArea))
sPalte = sPalte + .MergeArea.Columns.Count - 1
End If
End With
Next
' Zeilenhöhe auf erhaltenen Maximalwert
.RowHeight = tempHeight
End With
Application.ScreenUpdating = True
End Sub
' Autofit von verbundenen Zellen
Public Function FitMergeHeight(myCells As Range) As Double
Dim tempWidth As Double
Dim zeLLe As Range
Dim totalWidth As Double
Dim totalPxWidth As Double
Dim tempHeight As Double
Dim oldHeight As Double
On Error GoTo fitErr
With myCells
' Macht nur etwas für einzelne Zeile, wenn die Zellen verbunden sind und wenn der  _
Zeilenumbruch aktiv ist
If .Rows.Count = 1 And .MergeCells = True And (.WrapText = True Or IsNull(.WrapText))  _
Then
' Speichert alte Zeilehöhe zwischen
oldHeight = .RowHeight
' Speichert die Breite der ersten Zelle zwischen
tempWidth = .Cells(1).ColumnWidth
' Berechnet die Gesamtbreite der verbundenen Zellen
For Each zeLLe In myCells
totalWidth = zeLLe.ColumnWidth + totalWidth
totalPxWidth = zeLLe.Width + totalPxWidth
Next
' Löst den Verbund auf
.MergeCells = False
' weist der ersten Zelle (dort steht der Text) die Gesamtbreite zu
.Cells(1).ColumnWidth = totalWidth
' Breitenkorrektur auf Breite in Pixel
.Cells(1).ColumnWidth = Application.Min(255, _
.Cells(1).ColumnWidth + (.Cells(1).ColumnWidth - .Cells(2).ColumnWidth) / _
(.Cells(1).Width - .Cells(2).Width) * (totalPxWidth - .Cells(1).Width))
' Führt Autofit durch
.EntireRow.AutoFit
' Übergabewert
FitHeight = .RowHeight
' Weist der ersten zelle wieder die alte Breite zu
.Cells(1).ColumnWidth = tempWidth
' Verbindet die Zellen wieder
.MergeCells = True
End If
End With
On Error GoTo 0
Exit Function
endOnError:
On Error Resume Next
With myCells
' Weist der ersten zelle wieder die alte Breite zu
.Cells(1).ColumnWidth = tempWidth
' Verbindet die Zellen wieder
.MergeCells = True
' Weist alte Höhe wieder zu
.RowHeight = oldHeight
End With
FitHeight = 0
Exit Function
fitErr:
' Unschön, aber einfach, Fehlerbehandlung muss beendet werden
Resume endOnError
End Function

Aufgerufen wird das obere Sub.
Gruß, Jogy
Anzeige
AW: Zeilenhöhe automatisch an Text anpassen
16.09.2010 15:23:10
Henning
Hi Jogy,
ich bekomme das irgendwie nicht reinkopiert. Bzw. ich kann es unter Makros dann nicht aufrufen.
Gruß
Henning
AW: Zeilenhöhe automatisch an Text anpassen
16.09.2010 16:04:32
JogyB
Hallo Henning,
wenn Du das direkt aufrufen willst, dann darf da keine Übergabevariable drin sein.
Sub fitHeightComplete()
Dim sPalte As Long
Dim tempHeight As Double
Dim myRow as Range
Set myRow = Selection.EntireRow
' Geht nur für einzelne Zeile
If myRow.Rows.Count > 1 Or myRow.Areas.Count > 1 Then Exit Sub
Application.ScreenUpdating = False
' AutoFit-Höhe ohne die verbundenen Zellen
myRow.AutoFit
tempHeight = myRow.Height
' Und jetzt noch auslesen für alle verbundenen Zellen
With myRow
For sPalte = 1 To .Cells(1, Columns.Count).End(xlToLeft).Column
With .Cells(1, sPalte)
If .MergeCells Then
tempHeight = Application.Max(tempHeight, FitMergeHeight(.MergeArea))
sPalte = sPalte + .MergeArea.Columns.Count - 1
End If
End With
Next
' Zeilenhöhe auf erhaltenen Maximalwert
.RowHeight = tempHeight
End With
Application.ScreenUpdating = True
End Sub
' Autofit von verbundenen Zellen
Public Function FitMergeHeight(myCells As Range) As Double
Dim tempWidth As Double
Dim zeLLe As Range
Dim totalWidth As Double
Dim totalPxWidth As Double
Dim tempHeight As Double
Dim oldHeight As Double
On Error GoTo fitErr
With myCells
' Macht nur etwas für einzelne Zeile, wenn die Zellen verbunden sind und wenn der  _
Zeilenumbruch aktiv ist
If .Rows.Count = 1 And .MergeCells = True And (.WrapText = True Or IsNull(.WrapText))  _
Then
' Speichert alte Zeilehöhe zwischen
oldHeight = .RowHeight
' Speichert die Breite der ersten Zelle zwischen
tempWidth = .Cells(1).ColumnWidth
' Berechnet die Gesamtbreite der verbundenen Zellen
For Each zeLLe In myCells
totalWidth = zeLLe.ColumnWidth + totalWidth
totalPxWidth = zeLLe.Width + totalPxWidth
Next
' Löst den Verbund auf
.MergeCells = False
' weist der ersten Zelle (dort steht der Text) die Gesamtbreite zu
.Cells(1).ColumnWidth = totalWidth
' Breitenkorrektur auf Breite in Pixel
.Cells(1).ColumnWidth = Application.Min(255, _
.Cells(1).ColumnWidth + (.Cells(1).ColumnWidth - .Cells(2).ColumnWidth) / _
(.Cells(1).Width - .Cells(2).Width) * (totalPxWidth - .Cells(1).Width))
' Führt Autofit durch
.EntireRow.AutoFit
' Übergabewert
FitMergeHeight = .RowHeight
' Weist der ersten zelle wieder die alte Breite zu
.Cells(1).ColumnWidth = tempWidth
' Verbindet die Zellen wieder
.MergeCells = True
End If
End With
On Error GoTo 0
Exit Function
endOnError:
On Error Resume Next
With myCells
' Weist der ersten zelle wieder die alte Breite zu
.Cells(1).ColumnWidth = tempWidth
' Verbindet die Zellen wieder
.MergeCells = True
' Weist alte Höhe wieder zu
.RowHeight = oldHeight
End With
FitMergeHeight = 0
Exit Function
fitErr:
' Unschön, aber einfach, Fehlerbehandlung muss beendet werden
Resume endOnError
End Function

Gruß, Jogy
Anzeige
Fehlerkorrektur
16.09.2010 16:00:13
JogyB
Der Vollständigkeit halber hier noch eine Fehlerkorrektur:
Sub fitHeightComplete(Optional myRow As Range)
Dim sPalte As Long
Dim tempHeight As Double
If myRow Is Nothing Then
Set myRow = Selection.EntireRow
Else
Set myRow = myRow.EntireRow
End If
' Geht nur für einzelne Zeile
If myRow.Rows.Count > 1 Or myRow.Areas.Count > 1 Then Exit Sub
Application.ScreenUpdating = False
' AutoFit-Höhe ohne die verbundenen Zellen
myRow.AutoFit
tempHeight = myRow.Height
' Und jetzt noch auslesen für alle verbundenen Zellen
With myRow
For sPalte = 1 To .Cells(1, Columns.Count).End(xlToLeft).Column
With .Cells(1, sPalte)
If .MergeCells Then
tempHeight = Application.Max(tempHeight, FitMergeHeight(.MergeArea))
sPalte = sPalte + .MergeArea.Columns.Count - 1
End If
End With
Next
' Zeilenhöhe auf erhaltenen Maximalwert
.RowHeight = tempHeight
End With
Application.ScreenUpdating = True
End Sub
' Autofit von verbundenen Zellen
Public Function FitMergeHeight(myCells As Range) As Double
Dim tempWidth As Double
Dim zeLLe As Range
Dim totalWidth As Double
Dim totalPxWidth As Double
Dim tempHeight As Double
Dim oldHeight As Double
On Error GoTo fitErr
With myCells
' Macht nur etwas für einzelne Zeile, wenn die Zellen verbunden sind und wenn der  _
Zeilenumbruch aktiv ist
If .Rows.Count = 1 And .MergeCells = True And (.WrapText = True Or IsNull(.WrapText))  _
Then
' Speichert alte Zeilehöhe zwischen
oldHeight = .RowHeight
' Speichert die Breite der ersten Zelle zwischen
tempWidth = .Cells(1).ColumnWidth
' Berechnet die Gesamtbreite der verbundenen Zellen
For Each zeLLe In myCells
totalWidth = zeLLe.ColumnWidth + totalWidth
totalPxWidth = zeLLe.Width + totalPxWidth
Next
' Löst den Verbund auf
.MergeCells = False
' weist der ersten Zelle (dort steht der Text) die Gesamtbreite zu
.Cells(1).ColumnWidth = totalWidth
' Breitenkorrektur auf Breite in Pixel
.Cells(1).ColumnWidth = Application.Min(255, _
.Cells(1).ColumnWidth + (.Cells(1).ColumnWidth - .Cells(2).ColumnWidth) / _
(.Cells(1).Width - .Cells(2).Width) * (totalPxWidth - .Cells(1).Width))
' Führt Autofit durch
.EntireRow.AutoFit
' Übergabewert
FitHeight = .RowHeight
' Weist der ersten zelle wieder die alte Breite zu
.Cells(1).ColumnWidth = tempWidth
' Verbindet die Zellen wieder
.MergeCells = True
End If
End With
On Error GoTo 0
Exit Function
endOnError:
On Error Resume Next
With myCells
' Weist der ersten zelle wieder die alte Breite zu
.Cells(1).ColumnWidth = tempWidth
' Verbindet die Zellen wieder
.MergeCells = True
' Weist alte Höhe wieder zu
.RowHeight = oldHeight
End With
FitHeight = 0
Exit Function
fitErr:
' Unschön, aber einfach, Fehlerbehandlung muss beendet werden
Resume endOnError
End Function

Betrifft das zweite Set myRow = ... in der ersten If-Abfrage.
Gruß, Jogy
Anzeige
Zweite Fehlerkorrektur...
16.09.2010 16:03:10
JogyB
Und in der Function FitMergeHeight muss noch das FitHeight durch FitMergeHeight ersetzt werden... ist immer das Dumme, wenn man nach dem Testen nochmal die Funktionsnamen ändert :(.
Gruß, Jogy

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Zeilenhöhe automatisch an Text anpassen in Excel


Schritt-für-Schritt-Anleitung

Um die Zeilenhöhe automatisch an den Text in Excel anzupassen, kannst du den folgenden VBA-Code verwenden. Dieser Code funktioniert insbesondere gut, wenn du mit verbundenen Zellen arbeitest:

Public Sub instantFitHeight(Optional myCells)
    Dim tempWidth As Double
    Dim zeLLe As Range
    Dim totalWidth As Double
    Dim totalPxWidth As Double
    Dim tempHeight As Double
    Dim oldHeight As Double
    Application.ScreenUpdating = False
    On Error GoTo fitErr
    If IsMissing(myCells) Then
        Set myCells = Selection
    End If
    With myCells
        If .Rows.Count = 1 And .MergeCells = True And (.WrapText = True Or IsNull(.WrapText)) Then
            oldHeight = .RowHeight
            tempWidth = .Cells(1).ColumnWidth
            For Each zeLLe In myCells
                totalWidth = zeLLe.ColumnWidth + totalWidth
                totalPxWidth = zeLLe.Width + totalPxWidth
            Next
            .MergeCells = False
            .Cells(1).ColumnWidth = totalWidth
            .Cells(1).ColumnWidth = Application.Min(255, _
                .Cells(1).ColumnWidth + (.Cells(1).ColumnWidth - .Cells(2).ColumnWidth) / _
                (.Cells(1).Width - .Cells(2).Width) * (totalPxWidth - .Cells(1).Width))
            .EntireRow.AutoFit
            tempHeight = .RowHeight
            .Cells(1).ColumnWidth = tempWidth
            .MergeCells = True
            .RowHeight = tempHeight
        End If
    End With
    On Error GoTo 0
    Application.ScreenUpdating = True
    Exit Sub
fitErr:
    On Error Resume Next
    myCells.Cells(1).ColumnWidth = tempWidth
    myCells.MergeCells = True
    myCells.RowHeight = oldHeight
    Application.ScreenUpdating = True
    Exit Sub
End Sub

Um den Code zu verwenden, öffne den VBA-Editor (Alt + F11), füge ein neues Modul hinzu und kopiere den Code dort hinein. Du kannst das Makro dann über die Makro-Optionen in Excel aufrufen.


Häufige Fehler und Lösungen

  1. Excel passt die Zeilenhöhe nicht automatisch an
    Überprüfe, ob du verbundene Zellen verwendest. Verbundene Zellen erfordern spezielle Handhabung im Code.

  2. Automatische Zeilenhöhe funktioniert nicht bei Text mit Zeilenumbruch
    Stelle sicher, dass die Option "Textumbruch" in den Zellen aktiviert ist. Andernfalls wird die Zeilenhöhe nicht korrekt angepasst.

  3. Der Code zeigt einen Fehler
    Überprüfe die Syntax und stelle sicher, dass du den Code in ein Modul eingefügt hast.


Alternative Methoden

Wenn der VBA-Code nicht funktioniert, kannst du auch manuell die Zeilenhöhe anpassen:

  • Wähle die Zeile aus, die du anpassen möchtest.
  • Klicke mit der rechten Maustaste und wähle „Zeilenhöhe anpassen“.
  • Alternativ kannst du die Zeilenhöhe auch anpassen, indem du die Grenzen zwischen den Zeilen ziehst.

Praktische Beispiele

Beispiel 1: Angenommen, du hast in Zeile 24 verbundene Zellen mit einem langen Text. Verwende den oben angegebenen VBA-Code, um die Zeilenhöhe automatisch anzupassen.

Beispiel 2: Wenn du mehrere Zeilen hast, die unterschiedliche Höhen erfordern, kannst du eine Schleife im VBA-Code einfügen, um alle betroffenen Zeilen nacheinander anzupassen.


Tipps für Profis

  • Verwende die AutoFit-Funktion in Kombination mit WrapText, um die optimale Zeilenhöhe für Zellen mit langen Texten zu erzielen.
  • Teste den VBA-Code zuerst in einer Kopie deiner Excel-Datei, um unerwünschte Änderungen zu vermeiden.
  • Wenn der Code nicht funktioniert, überprüfe die Version von Excel, da einige Funktionen in älteren Versionen nicht verfügbar sein könnten.

FAQ: Häufige Fragen

1. Warum passt Excel die Zeilenhöhe nicht automatisch an?
Das kann an verbundenen Zellen oder nicht aktivierten Textumbrüchen liegen. Stelle sicher, dass der Textumbruch aktiviert ist.

2. Wie kann ich die optimale Zeilenhöhe einstellen?
Nutze die AutoFit-Funktion in VBA oder über das Kontextmenü in Excel, um die Zeilenhöhe an den Inhalt anzupassen.

3. Funktioniert dieser Code in allen Excel-Versionen?
Der Code sollte in den meisten modernen Excel-Versionen funktionieren. Bei älteren Versionen kann es jedoch zu Einschränkungen kommen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige