Hi,
du kannst mal folgendes versuchen:
Function fcDomWert(Expression As String, Domain As String, _
Optional Criteria As String, _
Optional ltDomArt As ltDomWert = ltDLookup) As Variant
Dim strSQL As String
Dim rs As DAO.Recordset
rs.move 700000,1
Select Case ltDomArt
Case 0: strSQL$ = "SELECT " & Expression$ & " FROM " & Domain$
Case 1: strSQL$ = "SELECT COUNT(*) FROM " & Domain$
Case 2: strSQL$ = "SELECT MAX(" & Expression$ & ") FROM " & Domain$
Case 3: strSQL$ = "SELECT MIN(" & Expression$ & ") FROM " & Domain$
Case 4: strSQL$ = "SELECT FIRST(" & Expression$ & ") FROM " & Domain$
Case 5: strSQL$ = "SELECT LAST(" & Expression$ & ") FROM " & Domain$
Case 6: strSQL$ = "SELECT SUM(" & Expression$ & ") FROM " & Domain$
Case 7: strSQL$ = "SELECT AVG(" & Expression$ & ") FROM " & Domain$
End Select
If Nz(Criteria$, "") <> "" Then strSQL$ = strSQL$ & " WHERE " & Criteria$
Set rs = CurrentDb.OpenRecordset(strSQL$, dbOpenForwardOnly)
If rs.EOF Then
fcDomWert = Null
Else
fcDomWert = rs.Fields(0)
End If
' Debug.Print fcDomWert 'Nur zum Testen
rs.Close
Set rs = Nothing
End Function
Ich glaub aber eher nicht, dass es funktioniert, aber du kannst natürlich auch die Fälle "manuell" durchgehen:
Function fcDomWert(Col&, Table$, Criteria$, Optional ByVal start& = 700000) As Long
Dim rs As DAO.Recordset
Dim i&
Set rs = CurrentDb.OpenRecordset(Table, dbOpenForwardOnly)
With rs
.Move start, 1
While Not rs.EOF
If .fields(Col) = Criteria Then
i = i + 1
End If
.movenext
Wend
.Close
End With
fcDomWert = i
Set rs = Nothing
End Function
Das optionale Parameter "Start" gibt die erste Zeile an.
Da ich die Beispiele nicht getestet habe und mich nicht viel mit Access beschäftige, wird das vermutlich nicht auf anhieb klappen. Bin mir auch nicht sicher ob der "Move" Befehl so klappt. Kannst aber ja mal versuchen darauf aufzubauen...
Gruß
Till
|