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

Schwierigkeiten mit der Row-Eigenschaft

Schwierigkeiten mit der Row-Eigenschaft
27.04.2017 20:24:57
Marc
Hallo zusammen,
Es geht um das wöchentliche Einsammeln von Grünabfällen.
Ich muss in einer sortierten Tabelle die Zeile finden, zu dem die Ausgangswerte Plz, Straße, ..., Hausnummer passen.
Mehrere Einträge pro Straße sind möglich, z.B wenn sie sehr lang ist.
Ziel ist am Ende eine einzige Zeilennummer, woraus sich dann der Leerungstag ermitteln lässt.
Spalte B enthält die Plz-Nummer
Spalte C enthält den Straßennamen
.
.
.
Spalte H die erste Hausnummer (>=)
Spalte I die letzte Hausnummer ( Der Wochentag, an dem geleert wird steht in der letzten Spalte.
Die Buchstaben bei den Hausnummern werden hier nicht berücksichtigt. Ansonsten wird das sehr kompliziert (da z.B. 100a > 1001) ...
Ich versuche eine Funktion zu schreiben, die, aufbauend auf der vorherigen Berechnung, immer mehr einengt.
Ich bin erst am Beginn. Die Funktionsweise für die Hausnummern ist noch nicht implementiert.
Das Problem entsteht durch das Row.
Wenn ich die Spalte vollständig durchsuchen lasse, so findet die Funktion die erste Zeilennummer.
Ab der zweiten Suche aber, da ich ja mit einem durch die erste Suche gefundenen Bereich arbeite, gibt die Funktion, wenn der gesuchte Wert bereits in der ersten Zeile steht, die Zeile plus eins aus.
Weiß jemand, wo mein Fehler liegt?
Ich möchte ungern mit Schleifen arbeiten wenn das nicht nötig ist.
Hier der Quelltext der Funktion und darunter eine Testsub.
Function Bereich(ByVal VarWert As Variant, ByVal StrSpaltenBuchstabe As String, _
ByVal LonErsteZeile As Long, ByVal LonLetzteZeile As Long) As String
' Sucht den Bereich des vorkommenden Wertes in der Tabelle (Bereich muss sortiert sein)
Dim StrSpalte As String
Dim LonZeile As Long
Dim RngZellenfund As Range
Dim LonAnzahl As Long
Dim StrAnfBereich As String
StrAnfBereich = StrSpaltenBuchstabe & LonErsteZeile & ":" & _
StrSpaltenBuchstabe & LonLetzteZeile
VarWert = UCase(Replace(VarWert, " ", ""))
StrSpaltenBuchstabe = StrSpaltenBuchstabe & ":" & StrSpaltenBuchstabe
LonAnzahl = WorksheetFunction.CountIf(Range(StrSpaltenBuchstabe), VarWert)
If Not LonAnzahl = 0 Then
Set RngZellenfund = Range(StrAnfBereich).Find(VarWert, LookAt:=xlWhole)
StrSpalte = Columns(RngZellenfund.Column).Address(False, False)
StrSpalte = Left(StrSpalte, InStr(StrSpalte, ":") - 1)
Bereich = StrSpalte & RngZellenfund.Row & ":" & StrSpalte & _
RngZellenfund.Row + LonAnzahl - 1
Else
Bereich = ""
End If
End Function

Private Sub TESTBEREICH()
Dim StrZielBereich As String
Dim VarWert As Variant
Dim StrSpalte As String
Dim LonErsteZeile As Long
Dim LonLetzteZeile As Long
VarWert = 4850
StrSpalte = "B"
LonErsteZeile = 22
LonLetzteZeile = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
StrZielBereich = Bereich(VarWert, StrSpalte, LonErsteZeile, LonLetzteZeile)
If Not StrZielBereich = "" Then
MsgBox "OK. Bereich = """ & StrZielBereich & """"
Else
MsgBox "Wert nicht gefunden"
End If
End Sub
Vielen Dank für Eure Hilfe.

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Bitte Beispieldatei owT.
28.04.2017 12:53:38
ChrisL
.
AW: Bitte Beispieldatei owT.
29.04.2017 16:51:13
Marc
Ich habe noch etwas verbessert.
Trotzdem gibt die Find.Row falsche Werte.
Entweder ist die Arbeitsweise der Eigenschaft nicht korrekt...
oder ich mache einen Denkfehler.
Anbei eine Testdatei: https://www.herber.de/bbs/user/113197.xlsm
Ich musste das Blatt aus dem Kontext herausholen und die sensiblen Daten löschen.
Kann sein, dass einige Programmzeilen dadurch unnötig erscheinen.

Function Bereich(ByVal VarWert As Variant, ByVal StrSpaltenBuchstabe As String, _
ByRef LonErsteZeile As Long, ByRef LonLetzteZeile As Long) As Boolean
' Sucht den Bereich des vorkommenden Wertes in der Tabelle (Bereich muss sortiert sein)
Dim RngZellenfund As Range
Dim LonAnzahl As Long
Dim StrAnfBereich As String
StrAnfBereich = StrSpaltenBuchstabe & LonErsteZeile & ":" & _
StrSpaltenBuchstabe & LonLetzteZeile
VarWert = Replace(VarWert, " ", "")
StrSpaltenBuchstabe = StrSpaltenBuchstabe & ":" & StrSpaltenBuchstabe
With Ausnahme
LonAnzahl = WorksheetFunction.CountIf(.Range(StrSpaltenBuchstabe), VarWert)
If Not LonAnzahl = 0 Then
Set RngZellenfund = .Range(StrAnfBereich).Find(VarWert, LookIn:=xlValues)
LonErsteZeile = RngZellenfund.Row
LonLetzteZeile = LonErsteZeile + LonAnzahl - 1
Bereich = True
End If
End With
If Bereich Then
MsgBox """" & StrSpaltenBuchstabe & """" & " """ & VarWert & """" & " von Zeile " &  _
LonErsteZeile & " bis Zeile " & LonLetzteZeile
Else
MsgBox "Nichts gefunden"
End If
End Function

Private Sub TESTBEREICH()
Dim StrZielBereich As String
Dim VarWert As Variant
Dim StrSpalte As String
Dim LonErsteZeile As Long
Dim LonLetzteZeile As Long
Dim BooGefunden As Boolean
Dim IntGesPlz As Integer
Dim StrGesStrasse As String
IntGesPlz = 4700
StrGesStrasse = "heidberg"
VarWert = IntGesPlz
StrSpalte = "B"
LonErsteZeile = 2
LonLetzteZeile = 0
Do Until Cells(LonLetzteZeile + 1, 2) = ""
LonLetzteZeile = LonLetzteZeile + 1
Loop
BooGefunden = Bereich(VarWert, StrSpalte, LonErsteZeile, LonLetzteZeile)
If BooGefunden Then
VarWert = StrGesStrasse
StrSpalte = "I"
BooGefunden = Bereich(VarWert, StrSpalte, LonErsteZeile, LonLetzteZeile)
End If
End Sub

Anzeige
erster Find-Treffer
01.05.2017 09:45:48
ChrisL
Hi Marc
Teste mal...
Sub t()
Dim RngZellenfund As Range
Set RngZellenfund = Range("B2:B23").Find(4700, LookIn:=xlValues)
MsgBox RngZellenfund.Address
End Sub
Der Treffer ist B3 anstelle von B2. Ich denke der Grund ist, dass Default After:=ErsteZelle ist. Die erste Zelle ist B2 somit ist der erste "After-Treffer" die Zelle B3.
Du könntest es lösen in dem du die letzte Zelle angibst:
Sub t()
Dim RngZellenfund As Range
Set RngZellenfund = Range("B2:B23").Find(4700, After:=Range("B23"), LookIn:=xlValues)
MsgBox RngZellenfund.Address
End Sub
Ich würde aber eher folgende Variante wählen:
Sub tt()
MsgBox Application.Match(4700, Columns(2), 0)
End Sub
Vergleich liefert den ersten Treffer.
cu
Chris
Anzeige
AW: LonErsteZeile = 1
01.05.2017 10:13:45
Gerd
Hallo Marc,
würde die VBA-Hilfe noch etwas taugen, stünde da, dass die Suche in der Folgezelle beginnt.
Entweder wie von ChrisL dargelegt, oder indem du bei der Bereich-Festlegung "eins höher gehst",
kannst du die erste Suchzelle auf B2 ändern.
Gruß Gerd
AW: Schwierigkeiten mit der Row-Eigenschaft
01.05.2017 12:30:19
Marc
Hallo zusammen,
vielen Dank für die Hilfe.
Tatsächlich beginnt die Suche mit der angegebenen Zeil PLUS 1.
Das kann man in der Vba-Hilfe nur aus der Erklärung zu "after" erahnen.
Ich hab also jetzt in der Funktion MINUS 1 gesetzt.
Übrigens findet die "SearchDirection:=xlPrevious" sehr wohl die richtige Zeilennummer, weil eben trotzdem von oben nach unten gesucht wird.
Dank Euren Infos ist meine Funktion jetzt fertig, einschließlich der Zeilen, bei der die kleinste und größte Hausnummer mit der gesuchten verglichen wird.

Function Bereich(ByVal VarWert As Variant, ByRef StrSpaltenBuchstabe As String, _
ByRef IntErsteZeile As Integer, ByRef IntLetzteZeile As Integer, _
Optional ByVal StrSpalteEnde As String = "") As Boolean
' Sucht im eingehenden Bereich den Bereich des vorkommenden Wertes in der Tabelle (Bereich muss  _
sortiert sein)
' und gibt den verbleibenden Bereich zurueck
Dim RngZellenfund As Range
Dim LonAnzahl As Long
Dim StrAnfBereich As String
Dim IntI As Integer
If StrSpalteEnde = "" Then: IntErsteZeile = IntErsteZeile - 1
StrAnfBereich = StrSpaltenBuchstabe & IntErsteZeile & ":" & _
StrSpaltenBuchstabe & IntLetzteZeile
VarWert = UCase(Replace(VarWert, " ", ""))
If VarWert = "" Then: VarWert = "z!?!a"
StrSpaltenBuchstabe = StrSpaltenBuchstabe & ":" & StrSpaltenBuchstabe
With Ausnahme
If StrSpalteEnde = "" Then
Set RngZellenfund = .Range(StrAnfBereich).Find(VarWert, _
MatchCase:=True, LookIn:=xlValues)
If Not RngZellenfund Is Nothing Then
IntErsteZeile = RngZellenfund.Row
Set RngZellenfund = .Range(StrAnfBereich).Find(VarWert, _
SearchDirection:=xlPrevious, MatchCase:=True)
If Not RngZellenfund Is Nothing Then
IntLetzteZeile = RngZellenfund.Row
Bereich = True
End If
End If
Else
For IntI = IntErsteZeile To IntLetzteZeile
If Not (CInt(VarWert)  CInt(.Range(StrSpalteEnde & IntI).Value)) Then
IntErsteZeile = IntI
IntLetzteZeile = IntI
Bereich = True
Exit For
End If
Next IntI
End If
End With
End Function

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige