Clever-Excel-Forum

Normale Version: Zellen aufwärts nach Merkmal durchsuchen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

mittels VBA lese ich Daten aus einer PDF aus, die ich zuvor in ein Tabellenblatt eingefügt habe.

Ausgehend von einer bereits gefunden Zelle (z.B. i = A45) möchte ich nun die Zellen oberhalb davon nach einem Kriterium absuchen und als Variable "str_werte" definieren.

Meine aktuelle Lösung funktioniert zwar, allerdings ist das einfach nur eine ewig lange Kette um bekannte Eventualitäten abzudecken, siehe hier:

                str_werte = Sheets("Tabelle1").Cells(i - 1, 1).Value
               
                If IsNumeric(Left(str_werte, 9)) = False Or Right(str_werte, 1) = "*" Then
                    str_werte = Sheets("Tabelle1").Cells(i - 2, 1).Value
                    End If
                If IsNumeric(Left(str_werte, 9)) = False Or Right(str_werte, 1) = "*" Then
                    str_werte = Sheets("Tabelle1").Cells(i - 3, 1).Value
                    End If
                If IsNumeric(Left(str_werte, 9)) = False Or Right(str_werte, 1) = "*" Then
                    str_werte = Sheets("Tabelle1").Cells(i - 4, 1).Value
                    End If
                If IsNumeric(Left(str_werte, 9)) = False Or Right(str_werte, 1) = "*" Then
                    str_werte = Sheets("Tabelle1").Cells(i - 5, 1).Value

... und so weiter ...

Als totaler VBA-Anfänger bin ich an sich damit zufrieden, dass es fiunktioniert, aber man möchte ja auch dazulernen.
Wie könnte man das eleganter lösen, also so, dass praktisch eine Schleife so lange immer die darüberliegende Zelle prüft, ob sie mein Kriterium erfüllt?

Mein Kriterium ist, dass die Zelle links genau 9 Ziffern hat und recht kein * haben darf. 
Sollte ja so hier funktionieren:  If IsNumeric(Left(str_werte, 9)) = True And Right(str_werte, 1) <> "*" Then
nur wie lasse ich Excel automatisch immer eine Zeile aufsteigen?

Ich hoffe ich könnt mir helfen, meinen VBA-Horizont zu erweitern und bedanke mich schonmal für jede Hilfe!
Hi,

(08.02.2017, 11:01)UnionJack schrieb: [ -> ]Wie könnte man das eleganter lösen, also so, dass praktisch eine Schleife so lange immer die darüberliegende Zelle prüft, ob sie mein Kriterium erfüllt?

so?
Dim j As Long
Dim Ende As Long
Dim i As Long

Ende = 45
For j = 1 To Ende
   
   
   If IsNumeric(Left(str_werte, 9)) = False Or Right(str_werte, 1) = "*" Then
      str_werte = Sheets("Tabelle1").Cells(i - j, 1).Value
   End If
Next j
Hallo,

ohne zu wissen, was da in der If Abfrage genau passieren soll, "Rückwärtslaufen" ginge so:


Code:
For j = i To 1 Step -1
    str_werte = Sheets("Tabelle1").Cells(j - 1, 1).Value
   If Len(str_werte) <> 9 Or Right(str_werte, 1) = "*" Then
      str_werte = Sheets("Tabelle1").Cells(j - 1, 1).Value
   End If
Next j


Die Prüfung auf Anzahl Zeichen geht mit der Funktion LÄNGE() was len() in VBA entspricht
Vielen Dank euch beiden!

Ich arbeite jetzt mit der Version von Rabe und alles läuft wie es soll.
Jetzt ist der Code endlich wieder übersichtlich :)
Hi,
evtl. könntest Du auch diese Variante wählen:
Dim j As Long
Dim Ende As Long
Dim i As Long

i = ActiveCell.Row

'die Zahl 1 bei To muß angepasst werden an die tatsächlich oberste Zeile der Tabelle ohne Kopfzeile 
For j = i To 1 Step -1
   If IsNumeric(Left(str_werte, 9)) = False Or Right(str_werte, 1) = "*" Then
      str_werte = Sheets("Tabelle1").Cells(j, 1).Value
   End If
Next j