VBA - Zeilenhöhe automatisch UND maximale Höhe

Hallo,

folgendes Szenario:

Eine Excelausleitung mit immer unterschiedlicher Zeilenanzahl und -anordnung soll (u.a.) kleinere Zeilenhöhen erhalten.

Was ich könnte, aber mein Problem nicht löst:

  • Alle Zeilen auf die Höhe 33 anpassen
  • Alle Zeilen automatisch anpassen mit .autofit

Bei der ersten Möglichkeit werden auch die Zeilen, die die Höhe 11,25 behalten sollten auch auf 33 gezogen, was schlecht ist.
Bei der zweiten Möglichkeit haben die Zeilen teilweise die Höhe 157 und größer, was noch schlechter ist.
Eine statische Lösung funktioniert nicht, weil die Ausleitung wie gesagt immer unterschiedliche Anordnungen hat.

Gibt es eine Möglichkeit, diese zwei Möglichkeiten zu verbinden, also .autofit && maxRowHeight = 33???

„maxRowHeight“ hab ich schon ausprobiert, das hat nicht geklappt :smile:

Wär schön, wenn jemand helfen könnte.

Grüße,
Thomas

Hallo Thomas,
verstehe ich dich richtig so: Du möchtest, dass die Zeilen, deren Inhalt in einer (Ausgangs-)Zeilenhöhe von 11,25 nicht genug Platz hat, in der Höhe angepasst werden; und zwar auf max. 33?

falls nicht, so spezifiziere doch bitte:
Woran soll eine Zeile erkennen, dass sie die Höhe 11,25 behalten soll?
Woher soll eine Zeile wissen, dass die Höhe 157 und größer für sie schlecht ist?

Danke für die Info
Katharina

Hallo TomtomWa,
was um himmels Willen ist eine ‚Excelausleitung‘ und was hat diese mit VBA?
Nach welchen Kriterien entscheidest du dich für eine Bestimmete Zeilenhöhe? -> Hinterlege die als VBA-Code!
Wenn du keine Kriterien hast, kannst du es auch nicht automatisieren.

MfG
W.W.

Hallo Katharina,

das hast du alles richtig verstanden.

Zu deiner ersten Frage:
Die Zeile kann an dem „autofit“-Befehl erkennen, dass 11,25 gut ist, da der Inhalt bei der Spaltenbreite in eine Zeile passt. Das ist sicher, da bei der Ausleitung (die von einer anderen Firma programmiert wird) die Spaltenbreite fest ist und die Zeilenhöhe wohl auf autofit läuft.

Zweite Frage:
Genau das ist die Frage :smile: mir schwebt da der Befehl „autofit“ vor mit einer Erweiterung, dass die Zeile maximal die Höhe 33 haben darf.
Gibt es sowas? Oder könnte man das mit UND-Verknüpfungen schaffen?

Grüße und danke für die schnelle Antwort,
Tom

Woran erkennst du, dass die Zeile nicht höher werden soll?

Ist es immer die Zeile xyz?

Ansonsten würde ich die Zeilen von oben nach unten einzeln abklappern und dann jeweil nur für die gewünschten zeilen ein autofit vornehmen.
Dazu muss ich natürlich so was wie eine Tabelle oder Array haben, aus der die gewünschte /unerwünschte Zeilennummer hervorgeht.

Hallo Waldemar,

eine Ausleitung ist eine Excel-Tabelle, die automatisch aus Datenbankinformationen erstellt wird.
Wie ich oben in der Antwort schon geschrieben habe, ist diese in der Spaltenbreite festgelegt worden und die Zeilenhöhe läuft mit autofit.

Was meinst du mit „Hinterlege die als VBA-Code“?
Meine Kriterien sind „autofit“ und „maximale Zeilenhöhe 33“, das sollte doch genügen!?

Grüße,
Thomas

Grüezi Thomas

Gibt es eine Möglichkeit, diese zwei Möglichkeiten zu
verbinden, also .autofit && maxRowHeight = 33???

Dies ist so vermutlich nicht direkt machbar.

Mit .Autofit spielt die Breite einer Spalte für die Ermittlung der Höhe eine wichtige Rolle.

Also kommt vermutlich nur ein VBA-Makro in Frage, das zuerst mit .Autofit alles vergrössert und dann alle Zeile durchläuft und die Höhe auf maximal 33 setzt falls sie höher sein sollte.

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Genau da ist das Problem.

Die Tabelle, die ich bekomme, hat immer unterschiedliche Anordnungen bei den Zeilen und daher gibt es keine Tabelle, bei welchen Zeilen ich ein autofit vornehmen möchte und bei welchen nicht.

Vielleicht gibt es die Möglichkeit, jede Zeile abzufragen und wenn diese Zeile eine größere Höhe als 33 hat, diese auf 33 anzupassen?
Ich glaube, das würde mein Problem lösen, jetzt müsste man es nur noch programmieren :smiley:

Kann das jemand schnell machen :smile:? Bei mir würde das jetzt bestimmt ne dreiviertel Stunde dauern :smiley:

Vielen Dank,
Tom

Hallo TomtomWa,
wenn du .autofit ausführst - erhebst du KEINE Ansprüche auf die Formatierung der Tabelle.
Wenn du die Zeilen, die höher als 33 sind, auf 33 setzen willst, mach’ in einer Schleife im VBA.
z.B.

for i=1 to max
if Höhe\>33 then Höhe=33
next i

Hi Thomas,

genau das ist die Lösung.
Bzw. um den Prozess nicht unnötig zu verlangsamen wäre die noch schlankere Lösung, das autofit wegzulassen (da die Tabelle ja schon mit autofit rauskommt).

Wie würdest du die Höhe auf maximal 33 setzen?

Wie oben schon geschrieben, würde ich jede Zeile nacheinander abfragen, wie hoch die Zeile ist und dann den Code ausführen, also ca.:

Höhe end if

Höhe >33 --> ActiveSheet.Rows.RowHeight = 33
end if

Wäre das so ungefähr richtig? Also nur von der Logik, nicht vom Code natürlich

Vielen Dank,
Grüße,
Tom

Grüezi Thomas

Wie würdest du die Höhe auf maximal 33 setzen?

Wie oben schon geschrieben, würde ich jede Zeile nacheinander
abfragen, wie hoch die Zeile ist und dann den Code ausführen,
also ca.:

Höhe end if

Höhe >33 --> ActiveSheet.Rows.RowHeight = 33
end if

Wäre das so ungefähr richtig? Also nur von der Logik, nicht vom Code natürlich

Ja, das würde so in etwa passen - eigentlich reicht es alle Zellen der Spalte A abzufragen die im UsedRange liegen und dann entsprechend zu reagieren.
Das könnte dann wo aussehen:

Sub Makro1()
Dim rngzelle As Range
 For Each rngzelle In Intersect(ActiveSheet.UsedRange, ActiveSheet.Range("A:A"))
 If rngzelle.RowHeight \> 33 Then
 rngzelle.RowHeight = 33
 End If
 Next rngzelle
End Sub

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hier der Code:

Option Explicit

Sub Zeile\_begrenzen()
Dim I As Double
Dim EndZeile As Double
Dim ZeilenHoch As Double


EndZeile = 23 ' solltest du begrenzen, sonst läuft es so lange
 ' Max Wert wäre 65536

For I = 1 To EndZeile
 ZeilenHoch = Rows(I).RowHeight
 If ZeilenHoch \> 33 Then
 Rows(I).RowHeight = 33
 End If
Next I
End Sub

Sorry,

da habe ich keine Lösung mit den beiden angedachten Möglichkeiten. Ich bin Makrofan und würde in einer kleinen Schleife über alle belegten Zeilen die optimale Zeilenhöhe setzen. Ist diese >33 dann heruntersetzen, ggf. mit Zeilenumbruch etc.
Viel Erfolg
Rainer

Sub maxheight()
Application.ScreenUpdating = False
With ActiveSheet
.UsedRange.Rows.AutoFit
For Each zelle In Intersect(.Range(„A:A“), .UsedRange)
If zelle.RowHeight > 33 Then zelle.RowHeight = 33
Next zelle
End With
Application.ScreenUpdating = True
End Sub

viel erfolg und herzliche grüße

hallo Thomas,

Hab jetzt noch nicht ganz begriffen, was du meinst. Bitte was meinst du mit ausleitung?

Lg ovm

Hallo Thomas,

Hast es mit abfrage der Zellenhöhe schon bropiert?

MFG Fred

Hallo Thomas,
im Prinzip hast Du bereits das Problem komplett beschrieben.

  1. Du gehst alle Zeilen der Reihe nach durch.
  2. Die Zeilenhöhe wir mit autofit angepasst.
  3. Wenn die Zeilenhöhe größer 33 ist, dann ist sie 33.
  4. Nächste Zeile.
  5. Ende, wenn letzte Zeile erreicht ist.
    Für das Beispiel einer Lösung habe ich angenommen, Dein Blatt hat nur 50 Zeilen, und die maximale Zeilenhöhe sei 33.33.
    Mit Alt+F11 kommst Du auf die VB-Entwicklungsumgebung. Hier kannst Du ein neues Modul einfügen und die folgende VBA Subroutine einfügen:

’ Subroutine ZeilenHoeheA fuer TomtomWa
Sub ZeilenhoeheA()

’ Variablen definieren
Dim LezteZeile As Integer
Dim ZeilenHoehe As Single
Dim MaxHoehe As Single

’ Grenzen festlegen
LetzteZeile = 50
MaxHoehe = 33.33

’ For To Next Schleife fuer bestimmte Anzahl Wiederholungen
For Zeile = 1 To LetzteZeile
Rows(Zeile).Select
’ erst mal autofit
Selection.Rows.AutoFit
’ Abfrage: wie gross ist denn die Zeilenhoehe
ZeilenHoehe = Rows(Zeile).RowHeight
MsgBox ("Die Zeilenhoehe betraegt: " & ZeilenHoehe)
’ Wenn groesser Grenzwert dann zurueck auf Grenzwert
If ZeilenHoehe > MaxHoehe Then
ZeilenHoehe = MaxHoehe
End If
’ Einstellen der ggf neuen Zeilenhoehe
Rows(Zeile).Select
Selection.RowHeight = ZeilenHoehe
MsgBox ("Die Zeilenhoehe betraegt nun: " & ZeilenHoehe)
Next
End Sub

Mit Alt+F8 kannst Du Makros von der Excelseite aus bequem starten. Wenn Du noch gar keine VBA-Erfahrung hast, gib mir bitte noch mal Bescheid.

Mit freundlichen Grüssen MwieMichel

Hallo,
leider bin ich kein EXCEL-Spezialist, sodass ich auch bei dem Problem nicht weiterhelfen kann. Hoffendlich findet sich noch ein hilfreicher Mensch.
Viel Glück,Kch. Schilffarth

folgendes Szenario:

Eine Excelausleitung mit immer unterschiedlicher Zeilenanzahl
und -anordnung soll (u.a.) kleinere Zeilenhöhen erhalten.

Was ich könnte, aber mein Problem nicht löst:

  • Alle Zeilen auf die Höhe 33 anpassen
  • Alle Zeilen automatisch anpassen mit .autofit

Bei der ersten Möglichkeit werden auch die Zeilen, die die
Höhe 11,25 behalten sollten auch auf 33 gezogen, was schlecht
ist.
Bei der zweiten Möglichkeit haben die Zeilen teilweise die
Höhe 157 und größer, was noch schlechter ist.
Eine statische Lösung funktioniert nicht, weil die Ausleitung
wie gesagt immer unterschiedliche Anordnungen hat.

Gibt es eine Möglichkeit, diese zwei Möglichkeiten zu
verbinden, also .autofit && maxRowHeight = 33???

„maxRowHeight“ hab ich schon ausprobiert, das hat nicht
geklappt :smile:

Wär schön, wenn jemand helfen könnte.

Grüße,
Thomas

Hallo thomas,

hier mein Lösungsvorschlag:

Sub zeilenhoehe()
Dim letzte As Integer
Dim i As Integer
'letzte verwendete Zeile ermitteln
letzte = Tabelle1.Range(„A65536“).End(xlUp).Row
'Schleife starten
For i = 1 To letzte
'Prüfen ob Zeilenhöhe > 33 wenn ja auf 33 setzen
If Cells(i, 1).Rows.RowHeight >= 33 Then
Cells(i, 1).Rows.RowHeight = 33
End If
Next i
End Sub

Gruß Hugo

Hallo TomtomWa,

so wie ich das verstehe, können alle Zeilen mit Autofit bedacht werden und nur die Zeilen mit einer Höhe über 33 sollen auf 33 gesetzt werden.

Das sieht dann z. B. so aus:
Sub HoeheSetzen()
Dim i As Integer

For i = 1 To 15
Worksheets(„Tabelle1“).Rows(i).AutoFit
If Worksheets(„Tabelle1“).Rows(i).Height > 33 Then
Worksheets(„Tabelle1“).Rows(i).heigth = 33
End If
Next i
End Sub

(nur mal so auf die Schnelle - normalerweise würde ich das mit With-EndWith noch schöner machen :wink: aber es tut)

Das Ganze könnte man mit einem Button auf dem Tabellenblatt starten und z. B. die Zeilen von/bis übergeben, falls sich der Bereich anderweitig nicht einschränken läßt.
Allerdings ist Einschränken m. E. nicht nötig, da Du ja nur alle Zeile anpasst und die überhohen abschneidest.

Gruß
Harry