Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Zellhöhe auslesen





Frage

Hi Zusammen! Habe mehrere Excel-Tabellen und diese sollten in der [b]Zellhöhe[/b] angeglichen werden. Die Spaltenbreite, Farben, sonstige Formatierungen sollen nicht angepasst werden. Kann man die Zellenhöhe (per Formel) auslesen? Schön wäre es dann die einzelnen Zellenhöhen pro Tabelle und Zeile zu addieren und miteinander zu vergleichen. Tom

Antwort 1 von JoeKe

Hallo Tom,

eine Formellösung gibt es soweit ich weiß nicht dafür.
Aber vielleicht kannst du mit folgenden Code etwas anfangen.

Option Explicit
Sub Zeilenhöhe()
Dim loStart As Long, loEnde As Long, loAnzahl As Long, _
loHöhe As Long
loStart = Application.InputBox(prompt:="Startzeile =", Type:=1)
loEnde = Application.InputBox(prompt:="Endzeile =", Type:=1)
For loAnzahl = loStart To loEnde
loHöhe = loHöhe + ((Cells(loAnzahl, 1).RowHeight) * 10)
Next
MsgBox loHöhe / 10
End Sub



Gruß

JöKe

Antwort 2 von CaroS

Hallo Tomschi,

ich habe hier erstmal was per VBA:

Sub Zeilenhöhe()
Dim i As Long, h As Single, max As Long, summe As Single
max = ActiveSheet.Cells(65536, 1).End(xlUp).Row
summe = 0
For i = 1 To ActiveSheet.Cells(65536, 1).End(xlUp).Row
h = ActiveSheet.Cells(i + 1, 1).Top - ActiveSheet.Cells(i, 1).Top
summe = summe + h
MsgBox "Zeilenhöhe:      " & CStr(h) & Chr(13) & _
"Gesamthöhe: " & CStr(summe), , "Zeile: " & CStr(i) & " von " & Cstr(max)
Next i
End Sub

Gruß,
CaroS

Antwort 3 von Tomschi

Schönen dank für die Bemühungen.

Besteht die Möglichkeit pro Zeile ermittelte Zeilenhöhe in eine freie Zelle in der Zeile hineinschreiben zu lassen?

Nur so kann ich Zeile für Zeile einfach mit den verschiedenen Tabellen vergleichen.

DANKE!

Tom

Antwort 4 von JoeKe

Hallo @ CaroS,

bei dir hat sich der Fehlerteufel eingeschlichen. ;-)

MsgBox "Zeilenhöhe: " & CStr(h) & Chr(13) & _
"Gesamthöhe: " & CStr(summe) & Chr(13) & "Zeile: " & CStr(i) & " von " & CStr(max)

Ausserdem habe ich festgestellt, dass es bei deinem Code bei einigen Zeilehnhöhe zu Abweichungen kommt. Stelle ich z.B. meine Zeilenhöhe auf 11 bekomme ich nur 10,8 angezeigt. ???

Gruß

JöKe

Antwort 5 von JoeKe

Hallo Tom,

so:

Option Explicit
Sub Zeilenhöhe()
Dim loStart As Long, loEnde As Long, loAnzahl As Long, _
loHöhe As Long
loStart = Application.InputBox(prompt:="Startzeile =", Type:=1)
loEnde = Application.InputBox(prompt:="Endzeile =", Type:=1)
For loAnzahl = loStart To loEnde
Cells(loAnzahl, 1) = Cells(loAnzahl, 1).RowHeight
Next
End Sub


Gruß

JöKe

Antwort 6 von Tomschi

@JöKe

Code kopiert + eingefügt = funktioniert = DANKESCHÖN

Kurze Frage:
WAS muss ich WO umstellen, dass die Zellenhöhe nicht in der Spalte A ausgegeben wird?

Tom

Antwort 7 von CaroS

Hallo Jöke,

habe Deine AW4 gerade eben erst gelesen, als ich meine Verbesserung (- kommt gleich) posten wollte. Über den "Fehlerteufel" kann man verschiedener Meinung sein, deshalb könnte ich Dir jetzt antworten: Bei Dir hat sich ein Irrtum eingeschlichen.

Beides Codes funktionieren, beides ist möglich. Meinen habe ich übrigens vor dem Posten getestet. Du willst die Msgbox nur mit dem 1. Parameter verwenden - nichts dagegen. Ich verwende den 1. und 3. Parameter (Prompt und Title) und lasse den zweiten - zwischen den Kommas (neuere deutsche Rechtschreibung: Kom|ma, das; -s, Plur. -s, auch -ta <griech.> (Beistrich)) - einfach weg, da ich sowieso nur vbOK verwenden will und das der Standardwert ist.

Da man mit Cells(z, s).Top die Zellen-/Zeilehöhe nicht verändern kann, habe ich mich nach einer anderen Möglichkeit umgesehen. Hier ein kleines Testbeispiel:

Sub Zeilenhöhe_ändern()

Dim h_alt As Single, h_neu As Single
h_alt = ActiveSheet.Rows(1).RowHeight
h_neu = InputBox("Wie hoch soll die Zeile 1 sein? (Maßeinheit: Punkte)", _
"Zeile 1 ist zurzeit " & CStr(h_alt) & " Punkte hoch.", h_alt)
If h_neu <> h_alt Then
ActiveSheet.Rows(1).RowHeight = h_neu
If MsgBox("Soll die Höhe der Zeile 1 auf den alten Wert von " & CStr(h_alt) & _
" zurückgesetzt werden?", vbYesNo, "Zeile 1 ist nun " & CStr(h_neu) & _
" Punkte hoch.") = vbYes Then ActiveSheet.Rows(1).RowHeight = h_alt
End If

End Sub

Für Tomschi zum Eintragen der Zeilen- und Gesamthöhen:

Sub Zeilenhöhe_eintragen()
Dim i As Long, höhe As Single, max As Long, summe As Single, H As Byte, S As Byte, f As Byte

max = 0
summe = 0
f = ActiveSheet.Range(Mid(ActiveSheet.UsedRange.Address, _
InStr(1, ActiveSheet.UsedRange.Address, ":") + 1)).Column

For i = 1 To f
If ActiveSheet.Cells(65536, i).End(xlUp).Row > max Then max = ActiveSheet.Cells(65536, i).End(xlUp).Row
Next

H = CByte(InputBox("In welche Spalte sollen die Zeilenhöhen geschrieben werden?" & _
Chr(13) & Chr(13) & "(Bitte als Zahl eingeben!)", _
"Die nächste freie Spalte ist " & CStr(f + 1), f + 1))

S = CByte(InputBox("In welche Spalte sollen die Gesamthöhen geschrieben werden?" & _
Chr(13) & Chr(13) & "(Bitte als Zahl eingeben!)", _
"Die nächste freie Spalte ist " & CStr(f + 2), f + 2))

For i = 1 To max
höhe = ActiveSheet.Cells(i + 1, 1).Top - ActiveSheet.Cells(i, 1).Top
summe = summe + höhe

If IsNumeric(H) Then If H < 257 Then ActiveSheet.Cells(i, H).Value = höhe
If IsNumeric(S) Then If S < 257 Then ActiveSheet.Cells(i, S).Value = summe
Next i
End Sub


Gruß,
CaroS

Antwort 8 von JoeKe

Hallo Tom,

wenn du eine andere Spalte wählen willst, muss du die 1 bei
Cells(loAnzahl, 1) = Cells(loAnzahl, 1).RowHeight
durch die entsprechende Zahl ersetzen.
1=A, 2=B usw.

Gruß

JöKe

Antwort 9 von CaroS

Sorry,

da war in dem zweiten Code das .RowHeight noch nicht drin. Es geht auch mit der Differenz (bis zur 65535. Zeile), aber mit dem .RowHeight ist es einfacher. Aber da ich ja sowieso mal wieder zu spät bin ...

Sub Zeilenhöhe_eintragen()
Dim i As Long, höhe As Single, max As Long, summe As Single, H As Byte, S As Byte, f As Byte

max = 0
summe = 0
f = ActiveSheet.Range(Mid(ActiveSheet.UsedRange.Address, _
InStr(1, ActiveSheet.UsedRange.Address, ":") + 1)).Column

For i = 1 To f
If ActiveSheet.Cells(65536, i).End(xlUp).Row > max Then max = ActiveSheet.Cells(65536, i).End(xlUp).Row
Next

H = CByte(InputBox("In welche Spalte sollen die Zeilenhöhen geschrieben werden?" & Chr(13) & Chr(13) & "(Bitte als Zahl eingeben!)", _
"Die nächste freie Spalte ist " & CStr(f + 1), f + 1))

S = CByte(InputBox("In welche Spalte sollen die Gesamthöhen geschrieben werden?" & Chr(13) & Chr(13) & "(Bitte als Zahl eingeben!)", _
"Die nächste freie Spalte ist " & CStr(f + 2), f + 2))

For i = 1 To max
höhe = ActiveSheet.Cells(i, 1).RowHeight
summe = summe + höhe

If IsNumeric(H) Then If H < 257 Then ActiveSheet.Cells(i, H).Value = höhe
If IsNumeric(S) Then If S < 257 Then ActiveSheet.Cells(i, S).Value = summe
Next i
End Sub

Gruß,
CaroS

Antwort 10 von JoeKe

@ CaroS,

ich wollte deinen Code nicht hinsichtlich seiner Funktionalität kritisieren. Der Fehler auf den ich dich hinweisen wollte bezieht sich allein auf die Ausgabe in der MsgBox. Wenn du beide Codes (deinen ersten und den von mir korrigierten) laufen lässt, wirst du erkennen was ich meine.

Gruß

JöKe

Antwort 11 von CaroS

Hallo JöKe,

ich fühle mich nicht kritisiert und ich setze mich mit jeder Fehlermeldung auseinander, ob von Excel oder von einem Anwender.

Aber ich kann nicht mehr Unterschiede erkennen, als ich vorher schon gewusst (und beschrieben) habe. Hier sind mal Deine und meine Msgbox-Zeile direkt untereinander - für den direkten Vergleich.

Sub Zeilenhöhe_CaroS_JöKe()
Dim i As Long, h As Single, max As Long, summe As Single
max = ActiveSheet.Cells(65536, 1).End(xlUp).Row
summe = 0
For i = 1 To max
h = ActiveSheet.Cells(i + 1, 1).Top - ActiveSheet.Cells(i, 1).Top
summe = summe + h
MsgBox "Zeilenhöhe: " & CStr(h) & Chr(13) & _
"Gesamthöhe: " & CStr(summe), , "Zeile: " & CStr(i) & " von " & CStr(max)
MsgBox "Zeilenhöhe: " & CStr(h) & Chr(13) & _
"Gesamthöhe: " & CStr(summe) & Chr(13) & "Zeile: " & CStr(i) & " von " & CStr(max)

Next i
End Sub

Der (bisher) einzige von mir festgestellte Unterschied ist, dass bei mir "Zeile: 1 von 38" in der Titelzeile der Msgbox steht und dass Du dies als letzte Zeile im Prompt unten dranhängst, während in Deiner Titelzeile standardmäßig "Microsoft Excel" steht. (Erscheint mir nicht als eine Frage von richtig oder falsch.) War´s das oder habe ich noch was übersehen?

Gruß,
CaroS

Antwort 12 von JoeKe

@CaroS

ich habe mal meine Beispieldatei hochgeladen.
Mit dem Button "CaroS" wird dein erster Code ausgeführt. Mit dem Button "JöKe" wird dein erster Code mit meiner Änderung ausgeführt.

Gruß

JöKe

Antwort 13 von JoeKe

um es mal zu verdeutlichen:

Du möchtest in der MsgBox "Zeile x von y" ausgeben!?
Macht dein Code aber nicht.

Gruß

JöKe

Antwort 14 von Tomschi

Will mich in Eure Fachgespräch nicht einmischen - aber beide Codes entsprechen meiner Anforderung.

Was Ihr da so schreibt = Fachchinesisch für mich.
Trotzdem vielen lieben Dank!

@CaroS:
Es es beabsichtigt, dass Dein Code immer in der ersten Zeile beginnt?
Das mit dem automatischen Saldieren in der nächsten Spalte ist eine gut Idee von Dir gewesen.

Ihr wißt gar nicht wie sehr Ihr mir damit geholfen habt!

Tom

Antwort 15 von CaroS

Hallo Tomschi,

Du sollst hier wirklich nicht den Eindruck haben, als ginge es hier nicht (oder nicht mehr) um Deine Frage. Also bei meinem Code war es tatsächlich so, dass ich die Zeilen- und Gesamthöhen immer (ohne Nachzufragen) ab der 1. Zeile ermittle und in 2 Spalten Deiner Wahl eintrage. JöKes Code dagegen fragt Dich, von welcher Zeile bis zu welcher Zeile das stattfinden soll.

Es ist ganz einfach so, dass jeder zuerst einmal das aufschreibt, was ihm so zu dem Thema einfällt. Am Ende kann man dann natürlich immer die besten Ansätze zu einer Lösung zusammenfassen. Jökes Einverständnis zur Verwendung seiner Code-Zeilen stillschweigend vorausgesetzt könnte eine zusammenfassung ungefähr so aussehen:

Sub Zeilenhöhe_eintragen2()
Dim i As Long, höhe As Single, summe As Single, H As Byte, S As Byte, f As Byte
Dim loStart As Long, loEnde As Long

summe = 0
f = ActiveSheet.Range(Mid(ActiveSheet.UsedRange.Address, _
InStr(1, ActiveSheet.UsedRange.Address, ":") + 1)).Column

loStart = Application.InputBox(prompt:="Startzeile =", Type:=1)
loEnde = Application.InputBox(prompt:="Endzeile =", Type:=1)


H = CByte(InputBox("In welche Spalte sollen die Zeilenhöhen geschrieben werden?" & Chr(13) & Chr(13) & "(Bitte als Zahl eingeben!)", _
"Die nächste freie Spalte ist " & CStr(f + 1), f + 1))

S = CByte(InputBox("In welche Spalte sollen die Gesamthöhen geschrieben werden?" & Chr(13) & Chr(13) & "(Bitte als Zahl eingeben!)", _
"Die nächste freie Spalte ist " & CStr(f + 2), f + 2))

For i = loStart To loEnde
höhe = ActiveSheet.Cells(i, 1).RowHeight
summe = summe + höhe

If IsNumeric(H) Then If H < 257 Then ActiveSheet.Cells(i, H).Value = höhe
If IsNumeric(S) Then If S < 257 Then ActiveSheet.Cells(i, S).Value = summe
Next i
End Sub

Gruß,
CaroS

Antwort 16 von Tomschi

Ist immer wieder erstaunlich was sich mit so ein paar Code-Zeilen alles machen läßt.

Nochmals herzlichen Dank!

Tom

Antwort 17 von CaroS

Hallo JöKe,

es tut mir leid, ich hab´s immer noch nicht verstanden. Ich habe auch Deine Beispieldatei runtergeladen und ausprobiert - trotzdem Fehlanzeige!

Wenn mein Code "Zeile x von y" nicht in der MsgBox (genauer gesagt in der Titelzeile der Msgbox - etwas anderes war nie beabsichtigt) ausgibt, was macht er denn dann?

Wo liegt der Fehler und was ist das für ein Fehler?

Gruß,
CaroS

Antwort 18 von JoeKe

Moin CaroS,

tut mir leid der Fehler liegt irgendwo bei mir! Ich habe hier auf meinem Arbeitsrechner bei keiner MsgBox eine Titelzeile, mal wieder irgendein Bug ;-((.
Als ich mir das am WE nochmal zu Hause angesehen habe lief alles wie von dir beschrieben.
Werde nächstesmal erst genauer nachsehen, bevor ich eine unnötige Diskussion anfange.

Gruß

JöKe

Antwort 19 von CaroS

Hallo JöKe,

kein Problem! Ich denke, dass ich von einer kritischen Durchsicht meiner Codes nur profitieren kann. Wenn es um die Aufdeckung eines Fehlers geht, muss man schon hartnäckig sein, alles andere bringt ja nichts. Wo man ihn dann letztendlich findet, weiß man ja am Anfang nicht.

Ich habe es auch schon mehrfach erlebt, dass mein Rechner aus Lösungen, die bei anderen gelaufen sind (und bei mir dann später meistens auch irgendwann), zeitweilig sehr seltsame Dinge gemacht hat. Wenn ich der Verzweiflung schon ziemlich nah war, hat manchmal ein Neustart des Rechners geholfen und ich habe mich hinterher nur gefragt, warum ich das erst nach 3,5 und nicht schon nach 0,5 Stunden gemacht habe.

Ein für mich nach wie vor noch ungeklärtes Problem ist z. B. Cells.SpecialCells(xlCellTypeLastCell). Während andere damit scheinbar ordentliche Ergebnisse bekommen, kriege ich oft nur Mist, und keine Dokumentation sagt mir, was ich falsch mache oder was meinem Rechner daran nicht passt. Aber irgendwann kommt mal jemand drauf und tut es hier kund, und oft ist der Ausgangspunkt, dass erstmal jemand feststellt oder behauptet, das geht nicht.

Also dann, auf zur nächsten Runde!
CaroS

Antwort 20 von JoeKe

Hallo Caro_S,

wenn du mit "Cells.SpecialCells(xlCellTypeLastCell)" keine ordentlichen Ergebnisse erhälst, liegt das nicht an dir oder deinem Rechner, sondern an der Methode ansich.


MsgBox Cells.SpecialCells(xlCellTypeLastCell).Address

liefert dir die letzte genutzte Zelle deines Tabellenblattes. Dies kann aber auch eine Zelle sein, deren Wert inzwischen gelöscht wurde. Es hilft auch nicht Zellen komplett zu löschen.
Eins von vielen Phänomenen bei Excel mit denen man leben muss. ;-)
Und wo wir schon Fachsimpeln:
Du verwendest zum Ermitteln der letzten Zeile:

ActiveSheet.Cells(65536, 1).End(xlUp).Row

Da ist ja soweit auch nichts gegen einzuwenden, aber mit Blick auf künftige Excelversionen, verwende ich:

ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row

damit bist du unabhängig von der Gesamtanzahl von Zeilen.

Gruß

JöKe

PS:
ich weiß, dass die von mir gepostete Lösung auch nicht bei allen Excelversionen funktioniert.
IIf(IsEmpty(Cells(Rows.Count, 1)), Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count)
ist eine Versions unabhängige Lösung.

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: