Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1020to1024
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

erste numerische Zelle finden

erste numerische Zelle finden
05.11.2008 10:37:00
marcl
Moin zusammen,
ich möchte im gesamten Blatt die erste numerische Zelle finden.
Ich dachte dabei an Find+IsNumeric, komme damit aber nicht weiter. Kann mir jemand helfen?
Danke
Gruß
marcl

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: erste numerische Zelle finden
05.11.2008 10:58:00
Matthias
Hallo
mit
Cells.SpecialCells(xlCellTypeConstants, 1).Select
markierst Du die erste freie numerisch gefüllte Zelle.


Das kannst Du auch händisch erledigen, indem Du
1.) alle Zellen markierst.
2.) F5 drücken
3.) Inhalte wählen (Button drücken)
4.) Konstanten wählen und nur Zahlen angehakt lassen.
Daraufhin werden Dir im Sheet alle Zahlen markiert.
Nun sollte es einfach sein die erste Zelle zu erkennen.
Gruß Matthias
AW: erste numerische Zelle finden
05.11.2008 11:55:26
marcl
Hallo Matthias,
vielen Dank.
Cells.SpecialCells(xlCellTypeConstants, 1).Select
markiert mir aber leider alle numerischen Zellen in meinem Blatt. Ich würde gerne die Adresse der ersten und letzten Zelle ermitteln, um eine Tabelle zu generieren.
Gruß
marcl
Anzeige
AW: erste numerische Zelle finden
05.11.2008 11:33:00
Erich
Hi,
hier ein paar Spielereien mit Matthias' SpecialCells-Vorschlag:

Option Explicit
Sub tst()
Dim rngN As Range
On Error Resume Next
Set rngN = Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
On Error GoTo 0
If rngN Is Nothing Then
MsgBox "Keine numerische Zelle gefunden"
Else
MsgBox rngN.Cells(1) & " in Zelle " & rngN.Cells(1).Address(0, 0)
End If
End Sub
Sub tst2()
Dim rngErg As Range
Set rngErg = rng1Num()
If Not rngErg Is Nothing Then MsgBox rngErg.Value & " in Zelle " & rngErg.Address
MsgBox "Zahl: " & dblZahl1()
End Sub
Function rng1Num() As Range
On Error Resume Next
Set rng1Num = Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
On Error GoTo 0
If Not rng1Num Is Nothing Then Set rng1Num = rng1Num.Cells(1)
End Function
Function dblZahl1() As Double
Dim rngN As Range
On Error Resume Next
Set rngN = Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
On Error GoTo 0
If Not rngN Is Nothing Then dblZahl1 = rngN.Cells(1).Value
End Function

(Es muss nicht immer eine numerische Zelle geben - deshalb die Fehlerbehandlung.)
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: erste numerische Zelle finden
05.11.2008 11:59:00
marcl
Hallo Erich,
vielen Dank. Damit kann ich schon sehr viel anfangen.
Gruß
marcl aus Hannover
markiert nicht erste numerische Zelle
06.11.2008 07:06:00
marcl
Guten Morgen zusammen,
leider funzt das bei mir nicht so richtig mit der ersten Zelle. Ich finde zwar alle numerischen, aber die erste wird nicht immer angezeigt. Hier ein Beispiel mit meinem Makro dazu. Um den gesamten Zahlenbereich möchte ich genre einen Rahmen legen. Das ist das Ziel meiner Arbeit.
https://www.herber.de/bbs/user/56541.xls
Gruß
Marcel
AW: nachgefragt ..
06.11.2008 09:56:50
marcl
Hallo Matthias,
da ich derzeit zu Hause Internetprobs habe und auf Arbeit kein Download vollziehen kann, konnte ich mir Dein 2. Beispiel noch nicht ansehen :-(
Bin beim Antworten im falschen Fenster geblieben, sry.
Der Rahmen sollte von der ersten bis zur letzten Zelle der Tabelle verlaufen. Nun habe ich in einem weiteren Durchlauf meiner Abfragen festgestellt, dass auch mal die erste Zelle der Tabelle leer sein kann! Am Ende soll von F16 bis K43 ein Rahmen gesetzt werden. Ich glaube, ich habe die Sache falsch angefangen....
Gruß
marcl
AW: nachgefragt ..
06.11.2008 11:13:00
Matthias
Hallo
hier der Programmcode:

Option Explicit
Sub Marcl()
Dim rng As Range, Zelle1 As String, Zelle2 As String
Dim spLinks As Long, spRechts As Long, ZlOben As Long, ZlUnten As Long
With ActiveSheet
'findet die erste Numerische Zelle
For Each rng In .Cells.SpecialCells(xlCellTypeConstants, 1)
Zelle1 = rng.Address
ZlOben = rng.Row
spLinks = rng.Column
spRechts = spLinks
Exit For
Next
Application.ScreenUpdating = False
'geht bis zur letzten numerischen Zelle
For Each rng In .Cells.SpecialCells(xlCellTypeConstants, 1)
rng.Select
Zelle2 = rng.Address
ZlUnten = rng.Row
If rng.Column > spRechts Then spRechts = rng.Column
If rng.Column 




und so sieht es aus:
Userbild
Hoffe geholfen zu haben
Gruß Matthias
Anzeige
super. Vielen lieben Dank!!!! o.T.
06.11.2008 12:01:54
marcl
bitte, gern geschehen :o) __oT
06.11.2008 12:09:00
Matthias
AW: Korrektur
07.11.2008 08:31:24
Erich
Hi Marcel und Matthias,
der Code funktioniert in diesem Beispiel gut, das ist aber nicht immer so.
Er geht davon aus, dass die letzte in der Schleife erreichte Zelle
auch die unterste bzw. am weitesten rechts liegende ist.
Das ist aber nicht sicher. Ein Beispiel ist in dieser Mappe: https://www.herber.de/bbs/user/56582.xls
B4:B8 geht nicht bis zur letzten Zeile des Bereichs, ist aber die letzte Area.
Enthalten sind darin Matthias' Prozedur, die Zeile 9 nicht mitrahmt,
eine kurze, die nur den Bereich markiert und eine lange mit einer Art Protokoll und dem Rahmen.
In den neuen Prozeduren gibt es eine Schleife über die Teilbereiche (Areas), von denen immer
die erste bzw. letzte Zelle ausgewertet wird. das sollte immer funzen.
Hier die beiden neuen Prozeduren aus der Mappe:

Option Explicit
Sub SpecialCells_Bereich()
Dim rngS As Range, rngN As Range, rng As Range
Dim lngZvon As Long, lngZbis As Long, lngSvon As Long, lngSbis As Long
Set rngS = Range("B:G")
With rngS
lngZvon = .Row + .Rows.Count - 1
lngSvon = .Column + .Columns.Count - 1
Set rngN = .SpecialCells(xlCellTypeConstants, xlNumbers)
End With
For Each rng In rngN.Areas
With rng
lngZvon = Application.Min(lngZvon, .Row)
lngSvon = Application.Min(lngSvon, .Column)
lngZbis = Application.Max(lngZbis, .Cells(.Count).Row)
lngSbis = Application.Max(lngSbis, .Cells(.Count).Column)
End With
Next
With Range(Cells(lngZvon, lngSvon), Cells(lngZbis, lngSbis))
.Select ' oder besser: tue etwas mit dem Bereich, z. B. Rahmen setzen
End With
End Sub
Sub SpecialCells_Bereich_Test()
Dim rngS As Range, rngN As Range, rng As Range, zz As Long
Dim lngZvon As Long, lngZbis As Long, lngSvon As Long, lngSbis As Long
Set rngS = Range("B:G")
With rngS
.Borders.LineStyle = xlNone            ' Rahmen löschen
lngZvon = .Row + .Rows.Count - 1
lngSvon = .Column + .Columns.Count - 1
Set rngN = .SpecialCells(xlCellTypeConstants, xlNumbers)
zz = zz + 1
Cells(zz, 9) = .Address
Cells(zz, 10) = .Cells(.Count).Address
Cells(zz, 11) = lngZvon
Cells(zz, 12) = lngSvon
Cells(zz, 13) = lngZbis
Cells(zz, 14) = lngSbis
Cells(zz, 15) = .Cells(1)
End With
For Each rng In rngN.Areas
With rng
lngZvon = Application.Min(lngZvon, .Row)
lngSvon = Application.Min(lngSvon, .Column)
lngZbis = Application.Max(lngZbis, .Cells(.Count).Row)
lngSbis = Application.Max(lngSbis, .Cells(.Count).Column)
zz = zz + 1
Cells(zz, 9) = .Address
Cells(zz, 10) = .Cells(.Count).Address
Cells(zz, 11) = lngZvon
Cells(zz, 12) = lngSvon
Cells(zz, 13) = lngZbis
Cells(zz, 14) = lngSbis
Cells(zz, 15) = .Cells(1)
End With
Next
With Range(Cells(lngZvon, lngSvon), Cells(lngZbis, lngSbis)) ' Rahmen setzen
With .Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
End With
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
Danke, Erich ...
07.11.2008 13:29:00
Matthias
Hallo Erich
Vielen Dank für Deinen Test.
Kannst Du mir kurz erläutern, wo in meinem Code ich den Denkfehler habe.
Gruß Matthias
AW: Danke, Erich ...
07.11.2008 17:21:04
Erich
Hi Matthias,
es sind wohl zwei Stellen, an denen Ungewolltes passieren kann. In

For Each rng In .Cells.SpecialCells(xlCellTypeConstants, 1)
Zelle1 = rng.Address
ZlOben = rng.Row
spLinks = rng.Column
spRechts = spLinks
Exit For
Next

wird (wg. "Exit For") die erste Zelle des Special-Bereichs ausgewertet.
Belegt werden ZlOben und spLinks mit Zeile und Spalte dieser Zelle.
Aber: Ist sicher, dass diese Zelle die oberste und linkeste Zelle des Bereichs ist?
In


For Each rng In .Cells.SpecialCells(xlCellTypeConstants, 1)
rng.Select
Zelle2 = rng.Address
ZlUnten = rng.Row
If rng.Column > spRechts Then spRechts = rng.Column
If rng.Column 

wird ZlUnten immer wieder überschrieben und hat letztlich als Wert die Zeilennummer der
letzten Zelle der Schleife.
Die letzte Zelle der Schleife muss aber nicht die Zelle mit der größten Zeilennr. sein.
Das hängt stark davon ab, in welcher Reihenfolge die Teilbereiche (Areas) und damit die Zellen
in der Schleife abgearbeitet werden.
Hier wäre also auch so eine "If rng.Row ..."-Zeile nötig.
Schau mal in meiner Beispielmappe das "Protokoll" an. Da siehst du, dass die voletzte
Area $D$7:$E$9 bis Zeile 9 geht, die letzte Area $B$4:$B$8 nur bis Zeile 8.
In deiner Schleife hat ZlUnten einmal den Wert 9, der wird am Schluss aber mit 8 überschrieben.
In meinem Code geht die Schleife über die Areas des Bereichs, das sind vermutlich weniger als die Einzelzellen.
Jede Area ist rechteckig, deshalb reicht es hier aus, die erste und die letzte Zelle der Area auszuwerten.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
Danke fürs Feedback
07.11.2008 17:42:58
Matthias
Hallo Erich
werd mich bei nächster Gelegeheit mal intensiver damit beschäftigen.
das mit dem:
... Hier wäre also auch so eine "If rng.Row ..."-Zeile nötig.
leuchtet mir schon beim lesen ein :o)
den Rest arbeite ich noch durch ...
Vielen Dank
Gruß Matthias

313 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige