我真的是VBA的新手。我为Access VBA提供了一个相当复杂的函数,它遍历一个表,执行一系列计算和条件语句,并返回一个值。当我运行该函数并使用“Debug.Print”来获取函数值时,它准确地显示出它在“即时”窗口中应该显示的内容。但是,当我尝试对同一个表上的Access查询调用该函数时,该查询仅返回循环中的最后一个值。
我构建了一个简单得多的循环函数来尝试找出我做错了什么(见下文),同样的事情也发生了-在“即时”窗口中更正了值,只在查询的表达式中返回了最后一个值。谁能告诉我我犯了什么明显的错误?如果我可以在这里修复它,我应该能够在真实的项目中修复它。非常感谢您的帮助!
Function TestID()
Dim d As Database
Dim r As Recordset
Dim id As Field
Set d = CurrentDb()
Set r = d.OpenRecordset (“tblAllocation”)
r.MoveFirst
r.MoveLast
r.MoveFirst
Do Until r.EOF
Set id = r.Fields(“IDAllocation”)
TestID = id
Debug.Print TestID ‘This lists all the correct values in the Immediate Window'
r.MoveNext
If r.EOF Then Exit Do
Loop
r.Close
Set r = Nothing
End Function
发布于 2018-10-29 23:04:23
该函数将只返回一个的值。
您将为Do
循环的每次迭代打印分配给TestID
符号的值,但该值仅在下一次循环迭代时被覆盖,函数不会返回该值。
如果您希望返回多个值,请考虑构建并返回一个值数组,或者将这些值附加到另一个表中-尽管这似乎是多余的,因为您是从现有的表/查询中获取这些值的。
发布于 2018-10-30 06:35:39
要为每个输入行返回不同的值,您的函数需要使用输入表/查询中的一个或多个参数。
例如。
Function TestID(ID As Long, someField As Double) As Double
' do calculations on parameters here
TestID = CalcResult
End Function
并将列值作为查询中的参数传递,例如
SELECT foo, bar, TestID([ID], [someField]) AS Calculation
FROM myTable
https://stackoverflow.com/questions/53052629
复制