2.4k Aufrufe
Gefragt in Tabellenkalkulation von ahorn38 Experte (3.3k Punkte)
Hallo,

ich habe Datenspalte, die jedoch nicht vollständig mit Werten gefüllt ist. Zwischen einzelnen Werten komme immer wieder Leerzellen vor. Ich such eine Möglichkeit, mit der ich von jeder (nichtleeren) Zelle dieser Spalte aus bestimmen kann, in welcher ersten oberen Reihe und in welcher ersten unteren Reihe dieser Spalte sich eine Leerzelle befindet.
Ich habe es mit ...find(what:= " "... versucht, komme aber damit nicht zum Ziel. Hat jemand einen Tipp??
Danke und Gruß

6 Antworten

0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Andreas,

versuch es mal so:

Sub leereZelle()

Dim rZelle As Range
Dim leer1, leer2 As Long
Dim lZeile As Long
Dim Spalte As Long

'Spalte der aktuell aktiven Zelle
Spalte = ActiveCell.Column

'letzte Zeile in dieser Spalte ermittlen
lZeile = ActiveSheet.Cells(Rows.Count, Spalte).End(xlUp).Row

'leere Zellen suchen
For Each rZelle In Range(Cells(1, Spalte), Cells(lZeile, Spalte))

If IsEmpty(rZelle) = True Then
If leer1 = 0 Then
leer1 = rZelle.Row
Else
leer2 = rZelle.Row
End If
End If

Next rZelle

MsgBox "Die erste leere Zelle in der aktuellen Spalte ist in Zeile " & leer1 & " und die letzte in " & leer2

End Sub


Gruß

M.O.
0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Andreas,

oder einfacher

MsgBox Range("A:A").Find("*", searchdirection:=xlPrevious).Row 'letzte belegte Zelle in Spalte A
MsgBox Range("A:A").Find("*", searchdirection:=xlNext).Row 'erste belegte Zelle in Spalte A


Gruß
Rainer
0 Punkte
Beantwortet von ahorn38 Experte (3.3k Punkte)
Hallo M.O.

danke für deine Antwort!!
Die Suche klappt leider nur für die erste leere Zelle nach der aktuellen Position, also nach unten. Nach oben funktioniert es leider nicht, da wird immer die allererste leere Zelle ermittelt. Wenn ich mich also z.B. im zweiten Block auf 9406,40 befinde, dann ist die erste leere nach unten nach 11880,85 und die erste nach oben nach 13248,16. Dein Code berechnet aber die Celle nach 13387,16.


13.387,16
12.354,14
14.200,87
6.605,28
13.416,04
7.339,86
14.757,38
9.688,30

13.248,16
9.406,40
12.095,75
12.400,92
12.532,77
11.880,85

14.328,25
14.070,20
6.401,11
16.430,28
19.145,82
13.123,85
9.828,08
7.459,96
3.112,72

14.200,87
6.605,28
13.416,04

Ich habe mittlerweile mit
Set rng = Columns(11).Find(what:="", after:=Cells(iRow, 11))
auch die erste Leerzelle nach der aktuellen Position gefunden, aber nach oben klappte das nicht, weil es keinen entsprechenden Ersatzcode für "after" gibt...
Gruß A.
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Andreas,

noch eine etwas elegantere Version meines Makros;-):

Sub leereZelle2()

Dim rZelle As Range
Dim leer1, leer2 As Long
Dim Spalte As Long

'Spalte der aktuell aktiven Zelle
Spalte = ActiveCell.Column

'leere Zellen suchen
For Each rZelle In Columns(Spalte).SpecialCells(xlCellTypeBlanks)

If IsEmpty(rZelle) = True Then
If leer1 = 0 Then
leer1 = rZelle.Row
Else
leer2 = rZelle.Row
End If
End If

Next rZelle

MsgBox "Die erste leere Zelle in der aktuellen Spalte ist in Zeile " & leer1 & " und die letzte in " & leer2

End Sub


Gruß

M.O.
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Andreas,

da habe ich dich, was nach oben angeht falsch verstanden. Ich hatte gedacht, immer die erste und letzte leere Zelle in einer Spalte - unabhängig von der Position.
(Mein Post Nr. 4 hat sich mit deinem überschnitten und ist somit hinfällig).

Versuch es mal so:

Sub leereZelle3()

Dim leer1, leer2 As Long
Dim lZeile As Long
Dim aZeile As Long
Dim Zeile As Long
Dim Spalte As Long

'Spalte der aktuell aktiven Zelle
Spalte = ActiveCell.Column

'Zeile der aktuelle aktiven Zelle
aZeile = ActiveCell.Row

'letzte Zeile in dieser Spalte ermittlen
lZeile = ActiveSheet.Cells(Rows.Count, Spalte).End(xlUp).Row

'nächste leere Zelle nach oben suchen
For Zeile = aZeile - 1 To 1 Step -1
If IsEmpty(Cells(Zeile, Spalte)) = True Then
leer1 = Zeile
Exit For
End If
Next Zeile

'nächste leere Zelle nach unten suchen
For Zeile = aZeile + 1 To lZeile
If IsEmpty(Cells(Zeile, Spalte)) = True Then
leer2 = Zeile
Exit For
End If
Next Zeile

MsgBox "Die nächste leere Zelle oberhalb ist in Zeile " & leer1 & " und die nächste leere Zelle unterhalb in Zeile " & leer2

End Sub


Gruß

M.O.
0 Punkte
Beantwortet von ahorn38 Experte (3.3k Punkte)
Hallo M.O.

sorry für meine unklare Problemdarstellung und danke für deinen Tipp - funktioniert einwandfrei!!! Ich hatte gehofft, dass es eine weniger aufwändige Lösung ohne Schleife geben könnte aber das scheint nicht zu gehen.
Vielen Dank und viele Grüße!
A.
...