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
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
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
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
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
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
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
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
1=A, 2=B usw.
Gruß
JöKe
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
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
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
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
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
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
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
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
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
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
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
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.
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.

