WorksheetFunction.match liefert kein Ergebnis in Excel VBA?

1 Antwort

Auf dem ersten Blick fällt mir syntaktisch nichts auf.

Ich würde mir die Funktion kopieren, das On Error herausnehmen, die Schleifenvariable und die anderen Variablen Konstanten ersetzen und dann mit dem Debugger durchklicken. Es geht ja zunächst darum, überhaupt einen Match zu finden.

Mit dem Debugger könntest du vorweg schon einmal im bestehenden Code starten. Vielleicht kannst du dir dadurch das Kopieren und anpassen ersparen.

wbk360 ist offen, richtig?

PS: Wenn du On Error Resume Next verwenden möchtest (ich rate dazu nur in begründeten Fällen), solltest du das außerhalb der Schleife festlegen.

Oubyi, UserMod Light  12.07.2017, 13:23

DH!

Die Match-Zeile funktioniert bei mir, wenn ich feste Werte einsetze.
Daran kann es also eigentlich nicht liegen.
Setzt doch mal im Tabellenblatt die gesuchte Zelle und die zu suchende Zelle gleich (=A55=C4 ; natürlich voll referenziert) und schau ob auch wirklich WAHR zurückgegeben wird.
Oder schau mal, ob Dir:

debug.print wbk360.ActiveSheet.Range("A5").value

den richtigen Wert zurück gibt.

1
PWolff  12.07.2017, 15:29

wbk360 muss nicht nur offen sein, sondern auch die gefragte Tabelle im Vordergrund haben.

Sinnvoller ist - sowohl für die Excel-Tabelle mit dem Makro als auch für wbk360 -, statt ActiveSheet die Tabelle über ihren Namen anzusprechen (wbk360.Sheets("Name_der_Tabelle")).

Ein On Error Resume Next ist bei Funktionen, bei denen vorgesehen ist, dass sie Fehler schmeißen, durchaus sinnvoll. WorksheetFunction.Match gehört dazu.

Aber man sollte nur gerade diesen Funktionsaufruf erfassen und insbesondere auf das Auftreten eines Fehlers prüfen. Etwa

 Set thisWS = Me 'falls das Makro in dieser Tabelle steht
Set thisWS = ActiveWorkbook.Sheet("Name_der_Zieltabelle")
Set wbk260WS = wbk360.Sheet("Name_der_Quelltabelle")

For idatecol = 2 To 21
idaterow = 0 'Vorgabewert, falls nicht gefunden
On Error Resume Next
idaterow = WorksheetFunction.Match(ThisWorkbook.ActiveSheet.Cells(4, idatecol).Value, wbk360.ActiveSheet.Range("A:A"), 0)
If Err.Number = 1004 Then
'Fehlerbehandlung
End If
On Error Goto 0

If idaterow > 0 'Treffer
thisWS.Cells(5, idatecol).Value = wbk360WS.Cells(idaterow, iOccHeader).Value
thisWS.Cells(6, idatecol).Value = wbk360WS.Cells(idaterow, iIndexHeader).Value
End If
Next

In solchen Fällen halte ich übrigens auch ein GoTo für gerechtfertigt, da VBA6 aus nicht ganz nachvollziehbaren Gründen ein "break" ("Exit For") kennt, aber kein "continue":

        'wie oben

If idaterow = 0 Then GoTo Continue_For_idatecol 'kein Treffer

thisWS.Cells(5, idatecol).Value = wbk360WS.Cells(idaterow, iOccHeader).Value
thisWS.Cells(6, idatecol).Value = wbk360WS.Cells(idaterow, iIndexHeader).Value

Continue_For_idatecol:
Next

Mir kommt noch eine weitere schreckliche Idee: sind die Daten vielleicht als Text und nicht als Zahl da drin? Wenn es um die Umwandlung und Darstellung von Zahlen, Daten und Zeiten geht, verwenden die Tabellfunktionen von Excel die aktuell eingestellte Systemsprache, die Makrofunktionen (einschl. den WorksheetFunktion-Members) die US-amerikanischen Einstellungen.

2
frhi2015 
Fragesteller
 17.07.2017, 11:26

Danke für die Antworten. Ich habe die Variablen durch Konstante ersetzt, aber ohne Erfolg. Ich habe ein einzelnes Datum in eine MessageBox schreiben lassen, aus Tabelle 1 und daneben den Wert aus der richtigen Zeile in Tabelle 2. Sehen genau gleich aus und dennoch findet der Code kein Match.

Ein Kollege aus Amerika hat exakt die gleiche Änderung im Code vorgenommen wie ich und bei ihm funktioniert es. Ich lasse mir von ihm das Tool und ein Beispielextrakt schicken, um zu sehen, ob es an den Ländereinstellungen liegt. Aber auf meinem Computer habe ich auch US Amerikanische Einstellungen.

1
Suboptimierer  17.07.2017, 11:34
@frhi2015

Wenn du meinst, es könnte an den Ländereinstellungen liegen, kannst du diese testweise einmal ändern.

Ansonsten bleibt dir wohl nur der Vergleich mit de Extrakt des Kollegen.

1