Frage von derdigge1982, 152

VBA excel .Find Methode Formel?

Hallo liebe leute!

Ich stehe vor folgendem Problem. In einer Excel stehen in A3 01.01.2015, in B1 bis B10 steht jewweils =A1 ; =A2 ; =A3 usw. Nun versuche ich im Macro den Match zu finden:

Hitrow = Sheets("Matrizen").Range("A1:A10").Find(what:="01.01.2015").Row => Ergebnis 3

Hitrow = Sheets("Matrizen").Range("A1:A10").Find(what:="01.01.2015").Row => Error, nicht gefunden

Hat jemand eine Idee was ich hier machen kann? Ja man könnte mit einer Schleife die Values in B1-10 durch iterieren und abgleichen. Nur hätte ich gern eine elegantere Lösung!

Danke und Gruß Stephan

Antwort
von offeltoffel, 109

Zunächst mal: an einer Schleife ist überhaupt nichts auszusetzen. VBA selbst findet den Wert über eine Schleife, die Find-Funktion ist also nur sowas wie eine Abkürzung. Die Geschwindigkeit dürfte dir auch keine Sorgen bereiten, wenn es nur 10 Werte sind, also würde ich sagen - was funktioniert ist in deinem Fall gut genug.

Generell habe ich aber dein Problem nicht verstanden. Was ist der Unterschied zwischen den beiden Formeln? Kann es sein, dass du in der zweiten Formel Range("B1:B10") meintest? In dem Fall könnte es funktionieren, wenn du

Range("B1:B10").Value.Find 

nimmst, dann beziehst du dich explizit auf das, was als Wert in der Zelle steht. Ansonsten durchsucht er den Zellbezug statt des Werts.

Eine Schleife könnte übrigens so aussehen (kann es gerade nicht testen, evtl. musst du noch was anpassen):

For Each item in Worksheets("Matrizen").Range("B1:B10") 
If item.Value = "01.01.2015" Then
Ergebnis = item.row
End If
Next item
Kommentar von derdigge1982 ,

Sorry Mein Fehler!

Formel 1 (findet den match)

Hitrow = Sheets("Matrizen").Range("A1:A10").Find(what:="01.01.2015").Row => Ergebnis 3

Formel 2 (findet Nix)

Hitrow = Sheets("Matrizen").Range("B1:B10").Find(what:="01.01.2015").Row => Fehler

Habe auch eben deinen tip versucht mit:

Sheets("Matrizen").Range("B1:B10").value.Find(what:="01.01.2015").Row => Fehler(Objekt erforderlich)

All diese Schleifen blähen das gesamtkonstrukt immer so auf, daher mag ich sie nicht.

Kommentar von offeltoffel ,

Ich bin Try & Error - Programmierer, darum ist es gut möglich, dass das mit ".value" nicht sofort funktioniert. Vermutlich kann er nicht den Wert einer mehrzelligen Range angeben.

Habe gerade gegooglet und die Antwort erhalten: XY.Row ist ein Integer, das heißt, es darf nur eine einzige Zahl als Ergebnis rauskommen. Range("B1:B10").value ist allerdings ein Array, also eine Art "Liste". Du kannst es umgehen, indem du die Variablenzuweisung als "Variant" machst, z.B.:

Dim myRange as Variant
Dim TargetRow as Integer
myRange = Sheets("Matrizen").Range("B1:B10").Value

Dann musst du sie später aber auch wie ein Array auslesen und das geht nur über...du ahnst es schon...eine Schleife:

For item = LBound(myRange) To UBound(myRange)
If item = "01.01.2015" Then
TargetRow = item
End if
Next item

Achtung: ich weiß nicht sicher, ob VBA das erste Item #1 oder #0 hat. Ich programmiere normal mit Python, da ist das erste Listenelement immer 0. Dann müsstest du TargetRow noch um 1 erhöhen um die tatsächliche Zeile zu bekommen. Außerdem gibt es bestimmt elegantere Lösungen um ein Item in einem Array zu finden, bzw. dessen Position aus.

Eine letzte Lösung, die ich gegoogelt habe, nutzt sog. "Filter":

dim z as variant

z = Filter(MyRange, "01.01.2015")
If UBound(z) < 0 Then MsgBox ("empty")

Du müsstest selbst kucken, ob das für dein Projekt zielführend ist.

Wie du siehst: nicht jede elegante Lösung ist auch schlank und einfach. Manchmal sind auch komplexere Wege schneller, weil die "Abkürzungen" ziemlich aufgeblähte Funktionen im Hintergrund aufrufen.


Kommentar von offeltoffel ,

Sorry, das im zweiten Code-Kästchen müsste natürlich heißen: "If myRange(item) = "01.01.2015" "

Antwort
von maximilianus7, 92

kann es sein, dass in der A-spalte keine strings sonder datumswerte stehen? wenn du spalte A nicht explizit auf text formatiert hast, wandelt excel benutzereingaben in entsprechende formate um. intern wird ein datum als gleitkommazahl dargestellt (anzahl tage seit wasweissich). du erkennst es daran, dass die datumswerte rechtsbündig angezeigt werden. 

innerhalb VBA wird da nichts gewandelt. dass must du dann selbst mit der Format-funktion machen: 

versuchs mal mit:
what := CLng(CDate("28.04.2007")   
(oder genauer mit CDbl)

wenn du wiederum die zellen in einer schleife ausliest, so werden dir die datumswerte mit dem default-attribut value wieder als string ausgegeben. die entspr. zahlenwerte stehen in value2.

wobei die darstellung des datums von der windows-regionaleinstellung abhängig ist. 

Kommentar von offeltoffel ,

+1 für die Erkenntnis, dass ein Datum in Excel meist nicht das ist, wonach es aussieht. Hatte ich ganz vergessen zu erwähnen.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten