3.2k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo Forum,
ich versuche einen SVERWEIS, der bisher als Zellfunktion definiert war, in eine VBA-Funktion umzuwandeln. Dabei habe ich bei der Definiton des Suchargumentes in der VLOOKUP-Anweisung ein Problem!

Funktionsaufruf:
If Not Application.Intersect(Target, Range("K9:K223")) Is Nothing Then

Die folgende Definition des Suchargumentes (Target.Offset(0, -6) )
Target.Offset(0, 3) = [VLOOKUP(Target.Offset(0, -6), Testtab!$H$5:$L$11, 4)]
erzeugt den Fehler-Code >Fehler 2029 oder #NAME?.
Die Definiton mit direkter Angabe der Zelladresse, die das Suchargument enthält
Target.Offset(0, 3) = [VLOOKUP($E$223, Testtab!$H$5:$L$11, 4)]
liefert dagegen das gewünschte Ergebnis!
Das Suchargument muß variabel definiert sein, deshalb kann ich die 2. Lösung nicht verwenden.
Kann mir jemand sagen warum die 1. Variante nicht funktioniert?

Danke für jede Hilfe im voraus.

10 Antworten

0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Hans-Werner,

ich mach das immer so:

Target.Offset(0, 3) = WorksheetFunction.VLookup(Target.Offset(0, -6),
Sheets("Testtab").Range("H5:L11"), 4, 0)


Gruß
Rainer
0 Punkte
Beantwortet von
@Rainer: Danke für die Antwort, mit Deiner Lösung ist meine vorherige Frage beantwortet!

Ich bitte aber nochmals um Hilfe.
Da ich die Funktion aus mehreren Tabellenblättern heraus aufrufen muß, möchte ich eine benutzerdefinierte Funktion daraus machen. Dazu habe ich folgenden Code definiert:
Global suchargument As String
Global ergebnis As Integer
If Not Application.Intersect(Target, Range("K9:K223")) Is Nothing Then
suchargument = CLng(Target.Offset(0, -8)) & Target.Offset(0, 1)
Das Suchargument wird zusammengesetzt aus Target.Offset(0, -8) (enthält ein Datum in der Form TT.MM.JJ welches in eine fortlaufende Nummer umgesetzt wird) und einer 1-stelligen Kennziffer.
ergebnis = ermitteln_ergebnis(suchargument) 'Funktion aufrufen
End If

Function ermitteln_ergebnis(suchargument As String)
ermitteln_ergebnis.FormulaLocal = _
"=WENN(ISTFEHLER(SVERWEIS(suchargument;Testtab!$C$3:$D$140;2;FALSCH)); _
SVERWEIS(WERT("99999"& Right(suchargument, 1));Testtab!$C$3:$D$140;2;FALSCH); _
SVERWEIS(suchargument;Testtab!$C$3:$D$140;2;FALSCH);"")
End Function
Folgendes soll passieren:
Wird das Suchargument in der Testtab gefunden soll der Wert aus der 2. Spalte zurückgegeben werden. Anderenfalls, wird ein neues Suchargument aus der Konstanten "99999" und der letzten Stelle des vorherigen Suchargumentes gebildet, welches auf jeden Fall gefunden wird. Bei der Suche nach einer Problemlösung bin ich auf die Eigenschaft .FormulaLocal gestoßen und da ich mit der VBA Syntax auf Kriegsfuß stehe, habe ich einfachhalber einen funktionierenden SVERWEIS aus einer Zellfunktion, unter Verwendung von .FormulaLocal in diese Funktion übernommen. Ich komme aber nicht weiter, der Debugger bemängelt die Syntax der Funktion (Fehler beim Kompilieren / Erwartet: Anweisungsende - 2. SVERWEIS ist grau hinterlegt),.
Wo ist der Syntaxfehler? Oder grundsätzlich gefragt, geht das überhaupt so und wenn nicht, wie könnte man das Problem lösen?
0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Hans-Werner,

ohne entsprechende Testumgebung kann ich Dir da leider nicht helfen.
Ein Nachbau ist zeitaufwändig und entspricht in den meisten Fällen nicht dem Original.
Ob Du eine Beispieldatei hochladen kannst/darfst, musst Du selbst entscheiden.

Wenn ja, sollten zumindest Struktur und Zellformate dem Original entsprechen, Namen und andere
sensible Daten kannst Du ja verfälschen


Gruß
Rainer
0 Punkte
Beantwortet von hans-werner Einsteiger_in (49 Punkte)
Hallo Rainer,
ich kann Dir ein EXCEL-File zur Verfügung stellen nur, wir lade ich das hier hoch?
0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Hans-Werner,

über folgenden Link hochladen und den angebotenen Download-Link hier posten.

rapidshare.de/

Gruß
Rainer
0 Punkte
Beantwortet von hans-werner Einsteiger_in (49 Punkte)
0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Hans-Werner,

habe mir Deine Datei angesehen und komme zum Schluss, dass es mit SVERWEIS() nicht geht,
ohne dies behaupten zu wollen.

Mir fällt aber im Moment keine andere Lösung ein, da mich die Suchwerte verwirren.

Wenn der erste Suchwert z.B. nicht gefunden wird, kann man logischerweise auch nicht die letzte
Stelle von diesen ermitteln und somit gibt es auch keinen neuen Suchwert.

Übrigens die Syntax Deiner Formel ist falsch, so kann sie nicht funktionieren.
Ich kann sie aber, aus o.g. Gründen, auch nicht berichtigen.

Vielleicht hat ein anderer Helfer noch eine Idee zu Deinem Problem.

Gruß
Rainer
0 Punkte
Beantwortet von
Hallo Rainer,

als Zellfunktion macht der SVERWEIS genau das, was er soll !

Deshalb sehe ich das Problem in der Syntax eigentlich nur in Verbindung mit .FormulaLocal. Hatte gehofft, dass Dir spontan etwas auffällt. Das die Syntax nicht stimmt ist klar, das sagt mir ja der Debugger!

Den neuen Suchwert für den 2. SVERWEIS bilde ich aus dem String "99999" und der letzten Stelle der an die Funktion übergebenen Variablen >suchargument< und da steht immer ein Wert drin,

Ich werde damit noch ein bischen rumexperimtieren, hoffe aber weiterhin auf Hilfe.

Gruss
hans-werner
0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Hans-Werner,

habe mich noch mal mit Deinem Problem befasst und schlage vor, auf die UDF zu verzichten und
dafür das Workbook_SheetChange-Ereignis zu verwenden.

Schau mal rein, ob Dir das reicht, eine andere Lösung fällt mir dazu nicht ein.

rapidshare.com/files/266617922/re_beispiel_forum.xls.html

Gruß
Rainer
0 Punkte
Beantwortet von
Hallo Rainer,

s u p e r, funktioniert wie gewünscht!
Ich verwende den Code allerdings doch in einer UDF, es gibt anwendungsspezifische Gründe dafür!

Wie gesagt, mit der VBA-Syntax stehe ich auf Kriegsfuß und die Tatsache, dass es verschiedene Definitionsvarianten (nicht nur für VLOOKUP) in VBA gibt, macht die Sache nicht einfacher!
Ich muß mich zwangsläufig doch mal mit VBA-Literatur beschäftigen.

Dir ein herzliches Dakeschön für die Hilfe, hast mir sehr geholfen!

Bis zum nächsten Problem ;-)

hans-werner
...