Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Zellen aufwärts nach Merkmal durchsuchen
#1
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!
Antworten Top
#2
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
[-] Folgende(r) 1 Nutzer sagt Danke an Rabe für diesen Beitrag:
  • UnionJack
Antworten Top
#3
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
Gruß Atilla
[-] Folgende(r) 1 Nutzer sagt Danke an atilla für diesen Beitrag:
  • UnionJack
Antworten Top
#4
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 :)
Antworten Top
#5
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
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste