Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1232to1236
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Benutzerdeffinierte Funktion Rückgabewert 0

Benutzerdeffinierte Funktion Rückgabewert 0
tobi
Hallo liebe Excel-Gemeinde,
ich bemühe mich gerade, meine erste benutzerdeffinierte Funktion zu schreiben. Ich habe den Code schon getestet, er läuft sehr gut. Beim Einbinden in die eigentliche Funktion erhalte ich als Ergebnis aber leider immer den Rückgabewert 0. Im Anschluss der Funktionskopf sowie eine kurze Beschreibung der Funktionalität:
Function Test(x As Variant, y As Integer) As Single
Dim j, mth As Integer, vbArray(12), fvalue As Single, r As Object
mth = Month(td)

x: hier soll ein Datum (TT.MM.JJJJ) aus einer Excel-Zelle abgerufen werden
y: gibt die Position in einem Array an, aus welchem zum angegebenen Datum ein Wert ausgelesen werden soll.
Ich vermute einen Fehler bei der Typendeklaration, stoße hier aber an meine Grenzen.
Vielen Dank und Gruß
tobi
AW: Benutzerdeffinierte Funktion Rückgabewert 0
21.10.2011 12:45:19
Daniel
HI
du solltest uns mal die komplette Funktion zeigen.
das was du uns zeigst, ist zu wenig, um einen Fehler zu finden.
bspw hänt eine Typendeklaratioin auch davon ab, was du mit der Variable machst.
desweiteren muss man wissen, daß es in VBA Befehle und Aktionen gibt, die nicht funktioneren, wenn sie als Excelformel in einem Tabellenblatt verwendet werden.
Gruß Daniel
AW: Benutzerdeffinierte Funktion Rückgabewert 0
21.10.2011 13:11:20
tobi
Hallo,
sorry, das war mir nicht bewußt. Anbei die gekürzte Fassung der Funktion (der Mittelteil wiederholt sich relativ oft, deshalb hier ausgeklammert).

Option Explicit
Option Base 1

Function Test(x As Variant, y As Integer) As Single
Dim j, mth As Integer, vbArray(12), fvalue As Single, r As Object
mth = Month(x)
Set r = Sheets("Test").Columns(1).Find(what:=x)
If r Is Nothing Then Exit Function
For j = 1 To 12
vbArray(j) = r.Offset(0, j).Value
Next j
Select Case mth
Case 1
Select Case y
Case 1 To 6
fvalue = vbArray(y)
Case 7, 8
fvalue = vbArray(8)
Case 9 To 11
fvalue = vbArray(9)
Case 12 To 14
fvalue = vbArray(10)
Case 15 To 23
fvalue = vbArray(11)
Case 24 To 35
fvalue = vbArray(12)
End Select
...' Die übrige Case-Anweisung spare ich hier wohl besser End Select End Function An dieser Stelle nochmals vielen Dank für das Interesse :-)
Gruß
tobi
Anzeige
AW: Benutzerdeffinierte Funktion Rückgabewert 0
21.10.2011 13:25:47
Rudi
Hallo,
vor End Function muss Test=fvalue stehen.
Gruß
Rudi
AW: Benutzerdeffinierte Funktion Rückgabewert 0
21.10.2011 13:30:50
tobi
Danke!
Das stimmt natürlich und das hatte ich tatsächlich vergessen. Leider ist der Rückgabewert immer noch bei 0... :-(
Function kann nicht auf anderes Sheet zugreifen
21.10.2011 13:56:54
Sheldon
Hallo Tobi,
in einer Function kannst du nicht auf ein anderes Sheet zugreifen. Deine Variable r ist immer Nothing, deshalb läuft die Function nur bis zum Exit Function Befehl.
Gruß
Sheldon
AW: Function kann nicht auf anderes Sheet zugreifen
21.10.2011 14:19:59
tobi
Hallo Sheldon und alle weiteren Mitleser,
das wusste ich nicht, erklärt aber natürlich, weshalb die Funktion nicht lauffähig war.
Gibt es denn aus deiner Sicht eine intelligente Lösung für dieses Problem? Letztlich ist es meine Absicht die erste Spalte des Blattes nach dem angegebenen Datum zu durchsuchen und dann die Werte in dieser Zeile in das Array zu schreiben. Das müsste doch eigentlich relativ unkompliziert zu realisieren sein?
Ich stehe gerade leider auf dem berühmten Schlauch.
Danke und Gruß
tobi
Anzeige
AW: Function kann nicht auf anderes Sheet zugreifen
21.10.2011 14:43:33
Rudi
Hallo,
gib der Fkt. den Suchbereich mit.

Function Test(x As Variant, y As Integer, rSuch as Range) As Single
Dim j, mth As Integer, vbArray(12), fvalue As Single, r As Object
mth = Month(x)
Set r = rSuch.Find(what:=x)
If r Is Nothing Then Exit Function
For j = 1 To 12
vbArray(j) = r.Offset(0, j).Value
Next j
....

=Test(A1;B1;Tabelle2!C:C)
Gruß
Rudi
AW: Function kann nicht auf anderes Sheet zugreifen
21.10.2011 16:13:34
tobi
Hi Rudi,
danke nochmals. Ich finde die Idee ziemlich genial; den Fehler habe ich damit aber leider noch nicht lösen können: Das Ergebnis bleibt das gleiche. Scheinbar wird beim Funktionsaufruf für die Anweisung set r = rSuch.Find() kein Wert übergeben, ist das möglich?
An dieser Stelle übrigens mal ein großes Kompliment an alle Poster: Ich finde es super, dass man hier mit seinen (Excel-) Problemen geholfen bekommt und noch eine ganze Menge lernen kann!
Gruß und bei Zeiten ein schönes Wochenende!
tobi
Anzeige
Eine udFkt f.TabBlattEinsatz schreibt man ...
21.10.2011 14:57:58
Luc:-?
…so universell wie möglich, nicht nur wie unbedingt nötig, Tobi,
→s. Rudi's AW. Die xlFktt sind's doch auch (weitgehend).
Gruß Luc :-?
AW:Suchen nach Datumswerten
21.10.2011 16:25:55
Daniel
Hi
wie schon erwähnt wurde, bei einer Excelfunktion sollte man alle benutzen Zellbereiche als Parameter übergeben.
Auf dein Problem sollte das zwar keinen Einfluss haben, aber die Funktion wird damit universeller und vorallen Dingen ist der Zellbereich in der Überwachung für eine eventuell anstehende Neuberechung mit drin.
Dh wenn du in deiner Funktion einen Zellbereich verwendest, der nicht als Parameter übergeben wurde, dann ist das zwar möglich, aber es erfolgt kein Aktualisierung des Ergebnisses, wenn sich in diesem Bereich was ändert!
Aber jetzt zu deiner Problemursache:
Das Suchen mit der .Find-Funktion nach Datumswerten ist ein hochkomplexer vorgang, weil hier die Problematik: wahrer Zellwert (ganzzahl) vs angezeigter Textstring in unterschiedlichen Schreibweisen (VBA: amerikanisches Format, Excel: deutsches Format) voll zum Tragen kommt und deswegen die Suche oft scheitert, obwohl der Suchwert eigentlich vorhanden ist.
Wesentlich weniger problematisch ist hingegen die Verwendung der Funktion WorksheetFunction.Match().
diese entspricht der Funktion "Vergleich" in Excel und ist bei Datumswerten Formatunabhängig, da über den Zahlenwert des Datums gesucht wird.
So in etwa könnte der Ersatz für die .Find-Funktion aussehen:

dim Zeile as long
Zeile = 0
On Error Resume Next 'sonst Fehler wenn Suchwert nicht vorhanden
Zeile = Worksheetfunktion.Match(x, Sheets("Test").Columns(1), 0)
On Error Goto 0
If Zeile = 0 then Exit Function
For j = 1 To 12
vbArray(j) = Sheets("Test").Cells(Zeile, 1).Offset(0, j).Value
Next j
...
Gruß, Daniel
Anzeige
AW: AW:Suchen nach Datumswerten
24.10.2011 11:33:45
tobi
Hallo Daniel,
vielen Dank für den Hinweis! Mit dieser Methode habe ich mein Problem nun erfolgreich lösen können.
Super, dass man hier im Forum so tolle Tipps bekommt! Und vielen Dank an alle, die sich die Zeit für einen Beitrag genommen haben.
Beste Grüße
tobi

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige