用户定义的函数返回#Value
Posted
技术标签:
【中文标题】用户定义的函数返回#Value【英文标题】:User Defined Function Returning #Value 【发布时间】:2016-03-15 14:26:51 【问题描述】:我遇到了一种情况,需要我对一组 Vlookups 的结果进行平均。我不知道如何使用公式来实现这一点,而且 *** 上的其他人似乎也没有任何想法。
所以我决定编写一个函数来为我完成这项工作。不幸的是,它返回“#VALUE!”错误,我不知道为什么!该函数在使用 msgbox 测试时工作正常。我在下面注释了我的代码:
Option Explicit
Public Function AvgVlookup(Target_Array As String, Lookup_Array As String, Column_Index As Long) As Double
Dim Result As Double
Dim Total As Double
Dim Counter As Long
Dim TargetRange As Range
Dim LookupRange As Range
Dim Cell As Range
' Remove Absolute Indicator
Target_Array = Replace(Target_Array, "$", "")
Lookup_Array = Replace(Lookup_Array, "$", "")
' Convert String to Range
Set TargetRange = Range(Left(Target_Array, InStr(1, Target_Array, ":") - 1), Mid(Target_Array, InStr(1, Target_Array, ":") + 1))
Set LookupRange = Range(Left(Lookup_Array, InStr(1, Lookup_Array, ":") - 1), Mid(Lookup_Array, InStr(1, Lookup_Array, ":") + 1))
' Set Variables to 0
Counter = 0
Total = 0
' For each cell in defined array
For Each Cell In TargetRange
' Vlookup the cell and save lookup value to Result variable
Result = Application.WorksheetFunction.vlookup(Cell, LookupRange, Column_Index, "False")
' Update variables used to calculate average
Total = Total + Result
Counter = Counter + 1
Next Cell
' Perform calculation
AvgVlookup = Total / Counter
End Function
Sub test()
MsgBox AvgVlookup("A5:A8", "G5:H8", 2)
End Sub
有什么想法吗?
谢谢!
【问题讨论】:
您是否在函数中放置了一个换行符并逐行遍历它以准确评估错误发生的位置? 嗨,斯科特。代码本身没有错误。我可以通过 test sub 运行它,它会准确地将我想要的结果返回到 msgbox。它只是在我出于某种原因输入的单元格中返回此错误。 代码本身没有错误 ...然后... 只是在单元格中返回此错误 ...所以有如果代码没有将值返回到单元格,则必须与代码有关。如果您在代码中放置一个断点,然后在它所在的单元格中点击F2
,您可以逐行查看它返回错误消息的原因。但我认为@ScottCraner 有你照顾 :)
【参考方案1】:
两件事:
首先,您设置范围的方式有点长,可以将其截断为简单:
Set TargetRange = Range(Target_Array)
去掉$
后不需要解析字符串。
其次,您需要进行错误检查,以防目标范围内的值之一不在查找范围内。
整个代码:
Public Function AvgVlookup(Target_Array As String, Lookup_Array As String, Column_Index As Long) As Double
Dim Total As Double
Dim Counter As Long
Dim TargetRange As Range
Dim LookupRange As Range
Dim Cell As Range
' Remove Absolute Indicator
Target_Array = Replace(Target_Array, "$", "")
Lookup_Array = Replace(Lookup_Array, "$", "")
' Convert String to Range
Set TargetRange = Range(Target_Array)
Set LookupRange = Range(Lookup_Array)
' Set Variables to 0
Counter = 0
Total = 0
' For each cell in defined array
For Each Cell In TargetRange
' Vlookup the cell and save lookup value to Result variable
Dim Result
Result = Application.VLookup(Cell, LookupRange, Column_Index, "False")
If IsNumeric(Result) Then
Total = Total + Result
Counter = Counter + 1
End If
Next Cell
' Perform calculation
AvgVlookup = Total / Counter
End Function
要从工作表调用上述函数,您需要像这样调用它:=AvgVlookup("A5:A8", "G5:H8", 2)
但这不是很有帮助。如果您将输入更改为范围:
Public Function AvgVlookup(TargetRange As Range, LookupRange As Range, Column_Index As Long) As Double
Dim Result As Double
Dim Total As Double
Dim Counter As Long
Dim Cell As Range
' Set Variables to 0
Counter = 0
Total = 0
' For each cell in defined array
For Each Cell In TargetRange
' Vlookup the cell and save lookup value to Result variable
Dim t
t = Application.VLookup(Cell, LookupRange, Column_Index, "False")
If IsNumeric(t) Then
Total = Total + t
Counter = Counter + 1
End If
Next Cell
' Perform calculation
AvgVlookup = Total / Counter
End Function
那么你可以简单地称它为=AvgVlookup($A$5:$A$8,$G$5:$H$8,2)
。这样,您只需突出显示正确的范围,它就会起作用。当您要输入的是一个范围时,尝试将字符串转换为范围的输入也更少。
【讨论】:
嗨,斯科特,您的修改适用于我发布的测试子。很高兴知道我可以缩短我的代码,但它仍然产生了#Value!在工作表中使用时出错。如果这对你有用,那么我不确定它为什么会为我产生错误。 没有看到你的数据很难说。它对我有用。 @IIIBarcodeIII 抱歉,您说您在工作表中使用它?那么我们需要改变一些事情。你稍等一会儿。 @IIIBarcodeIII 谢谢 Scott,我的工作日快结束了。在我去之前我需要处理一些事情,所以我明天会测试修改并回复你。谢谢你的帮助!看起来我在正确的轨道上,但过于复杂了。以上是关于用户定义的函数返回#Value的主要内容,如果未能解决你的问题,请参考以下文章