Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1232to1236
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

SpecialCells(xlCellTypeLastCell) lügt m.E.

SpecialCells(xlCellTypeLastCell) lügt m.E.
Reinhard
Hallo Wissende,
in einem Blatt sind in Zeilen 1 und 2 Überschriften.
In Zeile 19 und 20 sind Summenformeln und so'n Kram.
In A3 bis A18 stehen fortlaufende Nummern.
Ich möchte nun die unterste irgendwo befüllte Zeile in B3:H18 ermitteln.
Specialcells liefert das falsche Ergebnis. Siehe Prozedur Falsch.
Indem ich alle Zellen in dem Bereich abklappere liefert mir die Prozedur Richtig das korrekte Ergebnis.
Einzelne Zellen eines Bereiches abzuklappern kostet aber Zeit wenn der Zellbereich sehr groß ist.
Dann hätte ich als einzige Idee die ich dazu habe in einer Hilfsspalte per Vba =Anzahl() bzw. Anzahl2() reinschreiben lassen und das dann per Vba ausgewertet.
Benutze ich SpecialCells falsch? Oder gibt es mir unbekannte oder mir nicht eingefallene Möglichkeiten
in einer CodeZeile die unterste belegte Zeile eines Bereichs zu ermitteln, wenn unterhalb des Bereiches noch weitere gefüllte Zellen sind?
Hier eine Beispieldatei dazu: https://www.herber.de/bbs/user/76846.xls
PS: einem nacktem Mann in die Tasche zu greifen ist schwierig. Griechenland soll kein Geld haben sagt man. Das haben wohl die nicht gewußt die eine griechische Bank am Athener Flughafen wohl am So um 1 Million (unsrer?) Euros erleichtert haben.
Merke, Unkenntnis schützt vor plötzlichem Reichtum nicht *grins*
Danke ^Gruß
Reinhard

Option Explicit
Sub Falsch()
Dim Zei As Long
Zei = Range("B3:H18").SpecialCells(xlCellTypeLastCell).Row
MsgBox Zei
End Sub
Sub Richtig()
Dim Zelle As Range, Zei As Long
For Each Zelle In Range("B3:H18")
If Zelle.Value  "" Then
If Zelle.Row > Zei Then
Zei = Zelle.Row
End If
End If
Next Zelle
MsgBox Zei
End Sub

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: SpecialCells(xlCellTypeLastCell) lügt m.E.
03.10.2011 18:37:18
fcs
Hallo Reinhard,
SpecialCells(xlTypeLastCell) ermittelt die letzte Zelle des im Tabellenblatt verwendeten Bereichs, der nicht ausgeblendet ist. Dabei können die Zellen auch leer sein, aber formatiert.
Wenn du schnell die letzte verwendete Zeile mit Inhalt in einem Bereich ermitteln willst, dann mit der folgenden benutzerdefinierten Funktion.
Die Function muss du in einem allgemeinen Modul deines VBA-Projekts einfügen und kannst sie dann beliebig im VBA-Projekt verwenden.
Gruß
Franz

Sub Richtig1()
Dim zei As Long
zei = fncLastCellWithContent(Range("B3:H18")).Row
MsgBox "letzte verwendete Zeile in Bereich ""B3:H18"": " & zei, , "Richtig1"
zei = fncLastCellWithContent(Cells).Row
MsgBox "letzte verwendete Zeile im Blatt: " & zei, , "Richtig1"
End Sub
Public Function fncLastCellWithContent(ByVal rngBereich As Range) As Range
'Gibt die letzte Zelle mit Inhalt im Bereich als Range-Objekt zurück
Dim rngZelle  As Range
With rngBereich
Set rngZelle = .Find(What:="*", After:=.Range("A1"), lookat:=xlWhole, _
LookIn:=xlFormulas, searchdirection:=xlPrevious)
If rngZelle Is Nothing Then
Set fncLastCellWithContent = .Range("A1")
Else
Set fncLastCellWithContent = rngZelle
End If
End With
End Function

Anzeige
Danke dir und Nachfrage
03.10.2011 19:41:31
Reinhard
Hallo Franz,
ja so funktioiniert es. An der Beispielmappe habe ich es mit folgendem Code getestet:

Sub tt()
MsgBox fncLastCellWithContent(Range("B3:H18")).Row
End Sub
Public Function fncLastCellWithContent(ByVal rngBereich As Range) As Range
'Gibt die letzte Zelle mit Inhalt im Bereich als Range-Objekt zurück
Dim rngZelle  As Range
With rngBereich
Set rngZelle = .Find(What:="*", After:=.Range("A1"), lookat:=xlWhole, _
LookIn:=xlFormulas, searchdirection:=xlPrevious)
If rngZelle Is Nothing Then
Set fncLastCellWithContent = .Range("A1")
Else
Set fncLastCellWithContent = rngZelle
End If
End With
End Function

Was ich nicht verstehe ist, im Gegensatz zur Beiapielmappe habe ich nicht nur in C11 einen Wert stehen sondern auch in Zellen oberhalb davon.
Trotzdem (was ja für meine Zwecke sehr schön ist) wird Zeile 11 als letzte Zeile ermittelt.
Warum, wieso?
Laut Hilfe und meinem Wissen liefert doch "Find" die erste Zelle im Suchbereich auf die "*" zutrifft.
Die "A1" im Code verstehe ich, das ist dann bezogen auf den Suchbereich dann in Wahrheit B3.
Auch sonst gibt mir
Set rngZelle = .Find(What:="*", After:=.Range("A1"), lookat:=xlWhole, _
LookIn:=xlFormulas, searchdirection:=xlPrevious)
keinen Hinweis darauf daß dadurch die letzte Zelle im Bereich ermittelt wird.
Oder aber, fällt mir grad beim Schreiben auf, sucht dann Find beginnend bei der Zelle vor A1 (durch xlPrevious) dann halt H18 rückwärts bis es "*" in einer Zelle findet?
Gruß
Reinhard
Anzeige
AW: Danke dir und Nachfrage
04.10.2011 06:49:13
Gerd
Hallo Reinhard,
richtig, vor der ersten Zelle des Bereichs liegt hier bei der Rückwärtssuche die letzte Zelle.
Die Searchorder kannst noch festlegen.
Gruß Gerd
wieder was gelernt, merci o.w.T.
04.10.2011 10:50:48
Reinhard


9 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige