在访问查询中调用VBA函数

Tea*_*lla 2 sql ms-access-2013

我正在尝试将8个不同查询的结果组合回一个查询中。所有要使用的查询都是查询的查询。这8个系列的4个查询将球员分为多少场,具体取决于他们打了几轮高尔夫球。每个系列中的最后一个查询将计算每个玩家的准确让分。

我尝试使用的代码可能无法执行操作。

功能代码如下:

Function EHC(PlayerID As Long) As Long

    Dim queT20 As Recordset
    Dim que3to6 As Recordset
    Dim que7or8 As Recordset
    Dim que9or10 As Recordset
    Dim que11or12 As Recordset
    Dim que13or14 As Recordset
    Dim que15or16 As Recordset
    Dim que17or18 As Recordset
    Dim que19or20 As Recordset

    Set queT20 = CurrentDb.OpenRecordset("Top20Count")
    queT20.FindFirst ("PlayerID =" & PlayerID)
    If queT20![PlayerID] >= 19 Then
        Set que19or20 = CurrentDb.OpenRecordset("P_19or20ExactHC")
        que19or20.FindFirst ("PlayerID =" & PlayerID)
        ExactHC = que19or20.Exact_HC
        que19or20.Close
        Set que19or20 = Nothing
    ElseIf queT20![PlayerID] >= 17 Then
        Set que17or18 = CurrentDb.OpenRecordset("P_17or18ExactHC")
        que17or18.FindFirst ("PlayerID =" & PlayerID)
        ExactHC = que17or18.Exact_HC
        que17or18.Close
        Set que17or18 = Nothing
    ElseIf queT20![PlayerID] >= 17 Then
        Set que15or16 = CurrentDb.OpenRecordset("P_15or16ExactHC")
        que15or16.FindFirst ("PlayerID =" & PlayerID)
        ExactHC = que15or16.Exact_HC
        que15or16.Close
        Set que15or16 = Nothing
    ElseIf queT20![PlayerID] >= 17 Then
        Set que13or14 = CurrentDb.OpenRecordset("P_13or14ExactHC")
        que13or14.FindFirst ("PlayerID =" & PlayerID)
        ExactHC = que13or14.Exact_HC
        que13or14.Close
        Set que13or14 = Nothing
    ElseIf queT20![PlayerID] >= 17 Then
        Set que11or12 = CurrentDb.OpenRecordset("P_11or12ExactHC")
        que11or12.FindFirst ("PlayerID =" & PlayerID)
        ExactHC = que11or12.Exact_HC
        que11or12.Close
        Set que11or12 = Nothing
    ElseIf queT20![PlayerID] >= 17 Then
        Set que9or10 = CurrentDb.OpenRecordset("P_9or10ExactHC")
        que9or10.FindFirst ("PlayerID =" & PlayerID)
        ExactHC = que9or10.Exact_HC
        que9or10.Close
        Set que9or10 = Nothing
    ElseIf queT20![PlayerID] >= 17 Then
        Set que7or8 = CurrentDb.OpenRecordset("P_7or8ExactHC")
        que7or8.FindFirst ("PlayerID =" & PlayerID)
        ExactHC = que7or8.Exact_HC
        que7or8.Close
        Set que7or8 = Nothing
    ElseIf queT20![PlayerID] >= 17 Then
        Set que3to6 = CurrentDb.OpenRecordset("P_3to6ExactHC")
        que3to6.FindFirst ("PlayerID =" & PlayerID)
        ExactHC = que3to6.Exact_HC
        que3to6.Close
        Set que3to6 = Nothing
    Else: ExactHC = 0
    End If
    queT20.Close
    Set queT20 = Nothing
End Function
Run Code Online (Sandbox Code Playgroud)

和SQL查询语句:

SELECT PlayerInfo.PlayerID, PlayerInfo.Display, EHC([PlayerInfo]![PlayerID]) AS ExactHandicap
FROM ((((((((PlayerInfo INNER JOIN Top20Count ON PlayerInfo.PlayerID = Top20Count.PlayerID) 
    INNER JOIN P_3to6ExactHC ON PlayerInfo.PlayerID = P_3to6ExactHC.PlayerID) 
    INNER JOIN P_7or8ExactHC ON PlayerInfo.PlayerID = P_7or8ExactHC.PlayerID) 
    INNER JOIN P_9or10ExactHC ON PlayerInfo.PlayerID = P_9or10ExactHC.PlayerID) 
    INNER JOIN P_11or12ExactHC ON PlayerInfo.PlayerID = P_11or12ExactHC.PlayerID) 
    INNER JOIN P_13or14ExactHC ON PlayerInfo.PlayerID = P_13or14ExactHC.PlayerID) 
    INNER JOIN P_15or16ExactHC ON PlayerInfo.PlayerID = P_15or16ExactHC.PlayerID) 
    INNER JOIN P_17or18ExactHC ON PlayerInfo.PlayerID = P_17or18ExactHC.PlayerID) 
    INNER JOIN P_19or20ExactHC ON PlayerInfo.PlayerID = P_19or20ExactHC.PlayerID
WHERE (((PlayerInfo.Display)=True));
Run Code Online (Sandbox Code Playgroud)

当我尝试运行此程序时,我收到一条错误消息Undefined function 'EHC' in expression。

我还尝试了使用IIF或SWITCH语句替换函数调用的相同查询。

我大致基于MS Access 2010排名查询中的文章中的函数调用的思想,比较了两列的唯一排名。

任何帮助将不胜感激,因为我只有这个问题有待解决,我希望我将接近完成这一自我强加的噩梦。

Gor*_*son 5

我在这里看到几个问题:

  1. 回复:“未定义的功能”错误-确保您的功能在标准VBA模块中。

  2. 确保模块Option Explicit在最顶部附近包含一个语句。

  3. 确保您的函数实际上对您的查询可见。最好将其明确声明为Public Function。

  4. 您的函数实际上并没有返回值。它需要EHC = ExactHC在最终End Function声明之前分配。

  5. 检查您的查询以查看是否确实需要所有这些INNER JOIN。我真的怀疑您这样做,因为您的EHC()函数会在计算精确差点的过程中从其他查询中提取所需的信息。

vba1.png


vba2.png