Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1176to1180
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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
...
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
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
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

100 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige