UDF funktioniert bei Aufruf per Sub, sonst Fehler
Vere
Hallo,
ich habe Programmiererfahrung, bin aber Anfänger mit VBA und komme mit folgender Geschichte nicht weiter:
Ich möchte eine Funktion schreiben, die mir Daten enstsprechend verschiedener Suchkriterien aus einem anderen Tabellenblatt ausliest. Die Funktion funktioniert wenn ich Sie über ein Sub aufrufe und den Rückgabewert in eine MessageBox schreibe, bei Aufruf aus einem Tabellenblatt wird der Fehler "Ein in der Formel verwendeter Wert ist vom falschen Datentyp" ausgegeben. Wobei es auch für manche Eingabewerte funktioniert hat (nach einer kleinen Änderung jetzt aber auch nicht mehr). Ich hab mich schon totgegoogelt. Irgendwelche Ideen? Bin sehr dankbar für jede Hilfe!
Das ist mein Code:
Function Zähldaten(Knoten As String, TimeStr As String, VonArm As Integer, NachArm As Integer)
As Variant
' Variablen:
' WS_Count = Anzahl Tabellenblätter
' I = Zählvariable
' EndStr = Endung der Tabellenblätter für gesuchten Wochentag
' VMittel = Verkehrsmittel; wird aus TimeStr ausgelesen
' Quelle = Ziel-Worksheet gemäß Knoten und Erhebungstag
' QuelleSS = Worksheet, aus dem Spitzenstunde ausgelesen wird
' temp1, temp2 = Variablen zum Zwischenspeichern der Suchbereiche
' VMCell, TimeCell = Zellen, die Spalte(VMCell) und Zeile(TimeCell) der gesuchten
' Zelle angeben
Dim WS_Count As Integer
Dim I As Integer
Dim Tageszeit As String
Dim EndStr As String
Dim Quelle As Worksheet
Dim QuelleSS As Worksheet
Dim VMittel As String
Dim TimeCell As Range
Dim VMCell As Range
Dim temp1 As Range
Dim temp2 As Range
Set QuelleSS = ActiveWorkbook.Worksheets("Auswertung_SS")
If Left(TimeStr, 2) = "Di" Then EndStr = ".1" Else EndStr = ".2"
VMittel = Mid(TimeStr, 4, Len(TimeStr) - 7)
If Right(TimeStr, 3) = "MSP" And EndStr = ".1" Then
Tageszeit = QuelleSS.Cells(6, 12).Value
ElseIf Right(TimeStr, 3) = "ASP" And EndStr = ".1" Then
Tageszeit = QuelleSS.Cells(7, 12).Value
ElseIf Right(TimeStr, 3) = "MSP" And EndStr = ".2" Then
Tageszeit = QuelleSS.Cells(8, 12).Value
Else: Tageszeit = QuelleSS.Cells(9, 12).Value
End If
WS_Count = ActiveWorkbook.Worksheets.Count
For I = 3 To WS_Count
If Left(ActiveWorkbook.Worksheets(I).Name, Len(Knoten)) = Knoten And
Right(ActiveWorkbook.Worksheets(I).Name, 2) = EndStr Then
Set Quelle = ActiveWorkbook.Worksheets(I)
Exit For
End If
Next I
' Suche in diesem Datenblatt nach...
With Quelle
' 1. der gesuchten Uhrzeit:
Set TimeCell = .Range("d134:d185").Find(Tageszeit)
' 2. dem Arm aus dem ausgebogen wird
Set temp1 = .Range("j11:ft11").Find(VonArm, LookAt:=xlWhole)
For I = 1 To 8
If temp1.Offset(0, -1).Value = "von Arm:" Then
Exit For
ElseIf I < 8 Then
Set temp1 = .Range("j11:ft11").FindNext(temp1)
Else: Zähldaten = "Von Arm nicht gefunden!"
Exit Function
End If
Next I
' Dem Arm in den eingebogen wird
Set temp2 = .Range(temp1, temp1.Offset(0, 43)).Find(NachArm, LookAt:=xlWhole)
For I = 1 To 5
If temp2.Offset(0, -1).Value = "nach Arm:" Then
Exit For
ElseIf I < 8 Then
Set temp2 = .Range(temp1, temp1.Offset(0, 43)).FindNext(temp2)
Else: Zähldaten = "Nach Arm nicht gefunden!"
Exit Function
End If
Next I
Set VMCell = .Range(temp2.Offset(3, -8), temp2.Offset(3, 2)).Find(VMittel)
Zähldaten = .Cells(TimeCell.Row, VMCell.Column).Value
End With
End Function