Sql 在Access查询中调用VBA函数

Sql 在Access查询中调用VBA函数,sql,ms-access-2013,Sql,Ms Access 2013,我正在尝试将8个不同查询的结果合并回一个查询中。所有要使用的查询都是查询中的查询中的查询。这8个系列共4个查询将根据球员打了多少轮高尔夫球而将他们分开。每个系列中的最后一个查询计算每个玩家的确切障碍 我试图做的事情可能不可能与我使用的代码 功能代码如下: 函数EHC(PlayerID为Long)为Long Dim queT20作为记录集 Dim que3to6作为记录集 Dim que7or8作为记录集 Dim QUE9或10作为记录集 Dim QUE11或12作为记录集 Dim QUE13或1

我正在尝试将8个不同查询的结果合并回一个查询中。所有要使用的查询都是查询中的查询中的查询。这8个系列共4个查询将根据球员打了多少轮高尔夫球而将他们分开。每个系列中的最后一个查询计算每个玩家的确切障碍

我试图做的事情可能不可能与我使用的代码

功能代码如下:

函数EHC(PlayerID为Long)为Long
Dim queT20作为记录集
Dim que3to6作为记录集
Dim que7or8作为记录集
Dim QUE9或10作为记录集
Dim QUE11或12作为记录集
Dim QUE13或14作为记录集
Dim QUE15或16作为记录集
Dim QUE17或18作为记录集
Dim QUE19或20作为记录集
Set queT20=CurrentDb.OpenRecordset(“Top20Count”)
queT20.FindFirst(“PlayerID=“&PlayerID”)
如果20![PlayerID]>=19那么
Set que19or20=CurrentDb.OpenRecordset(“P_19or20ExactHC”)
que19or20.FindFirst(“PlayerID=“&PlayerID”)
ExactHC=Que19或20.ExactHC
问题19或20.关闭
设置que19or20=无
艾尔塞夫·奎特20![PlayerID]>=17那么
Set que17or18=CurrentDb.OpenRecordset(“P_17or18ExactHC”)
que17or18.FindFirst(“PlayerID=“&PlayerID”)
ExactHC=Que17或18.ExactHC
Que17或18.关闭
设置que17or18=无
艾尔塞夫·奎特20![PlayerID]>=17那么
Set que15or16=CurrentDb.OpenRecordset(“P_15or16ExactHC”)
que15or16.FindFirst(“PlayerID=“&PlayerID”)
ExactHC=Que15或16.ExactHC
Que15或16.关闭
设置que15or16=无
艾尔塞夫·奎特20![PlayerID]>=17那么
Set que13or14=CurrentDb.OpenRecordset(“P_13or14ExactHC”)
que13or14.FindFirst(“PlayerID=“&PlayerID”)
ExactHC=Que13或14.ExactHC
Que13或14.关闭
设置que13or14=无
艾尔塞夫·奎特20![PlayerID]>=17那么
Set que11or12=CurrentDb.OpenRecordset(“P_11or12ExactHC”)
que11or12.FindFirst(“PlayerID=“&PlayerID”)
ExactHC=que11或12.ExactHC
问题11或12.关闭
设置que11or12=Nothing
艾尔塞夫·奎特20![PlayerID]>=17那么
Set que9or10=CurrentDb.OpenRecordset(“P_9or10ExactHC”)
que9or10.FindFirst(“PlayerID=“&PlayerID”)
ExactHC=Que9或10.ExactHC
问题9或10。关闭
设置que9or10=无
艾尔塞夫·奎特20![PlayerID]>=17那么
Set que7or8=CurrentDb.OpenRecordset(“P_7or8ExactHC”)
que7or8.FindFirst(“PlayerID=“&PlayerID”)
ExactHC=que7or8.ExactHC
问题7或8.关闭
设置que7or8=无
艾尔塞夫·奎特20![PlayerID]>=17那么
Set que3to6=CurrentDb.OpenRecordset(“P_3to6ExactHC”)
que3to6.FindFirst(“PlayerID=“&PlayerID”)
ExactHC=que3to6.ExactHC
问题3到6。结束
将que3to6设置为空
其他:ExactHC=0
如果结束
问题20.结束
设置queT20=无
端函数
以及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));
当我尝试运行此操作时,我在表达式中得到一条错误消息,即
未定义函数“EHC”

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

我大致基于中文章中函数调用的思想


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

我在这里看到几个问题:

  • 回复:“未定义函数”错误-确保函数位于标准VBA模块中

  • 确保模块顶部附近包含一条
    Option Explicit
    语句

  • 确保您的函数实际上对查询可见。最好将其显式声明为
    公共函数

  • 函数实际上并不返回值。它需要在最后的
    结束函数
    语句之前分配
    EHC=ExactHC

  • 检查您的查询,看看您是否真的需要所有这些内部联接。我真诚地怀疑您是否这样做,因为您的
    EHC()
    函数将在计算确切障碍的过程中从其他查询中提取所需的信息



  • 谢谢您的意见。我现在在
    ExactHC=que19or20.Exact\u HC
    行上发现一个
    编译错误:找不到方法或数据成员。我为变量
    ExactHC
    添加了一个模糊语句,因为我在修复您指出的其他内容时意识到没有。它正在查看的查询的SQL语句是
    SELECT P_19or20RforHC.PlayerID,Avg(P_19or20RforHC.PlayedTo)为[Avg],Round([Avg]*0.93,1)为P_19or20RforHC组中P_19or20RforHC.PlayerID顺序为P_19orhc.PlayerID。有什么想法吗?我已经解决了代码的问题,你对连接的看法是正确的。代码应为
    ExactHC=que19or20![Exact_HC]
    。但是我仍然得到一个
    未定义的函数
    错误。在解决这个问题的过程中,我提出了一些其他代码,但基于相同的原理,从头开始进行计算,运行良好,速度很快,但几秒钟后重新运行,不会停止。我可能会把这个问题作为另一个问题贴出来。