【发布时间】:2013-06-28 10:16:56
【问题描述】:
我正在尝试编写一个 UDF(用户定义函数)来创建非数字数据的平均值(我将其转换为数字形式,然后在最后再次返回)。如果我列出单个单元格,我可以让 UDF 工作;我得到一个#VALUE!如果我尝试引用一系列单元格,则会出错。可能会同时处理范围和单个单元格。
有什么想法吗?
到目前为止的代码如下。
Function avlvl(ParamArray av() As Variant)
Dim a As Integer
'creates an average ks3 level from data in format "5a"
a = 0
n = 0
total = 0
Do While a < UBound(av()) + 1
'ignore blank or zero cells
If av(a) = 0 Or av(a) = "" Then
a = a + 1
Else
'convert data into numeric value - split into level and sub level
level = Val(Left(av(a), 1))
sl = Right(av(a), 1)
If sl = "c" Then
sublevel = 0
ElseIf sl = "C" Then
sublevel = 0
ElseIf sl = "b" Or sl = "B" Then
sublevel = 1 / 3
ElseIf sl = "a" Or sl = "A" Then
sublevel = 2 / 3
Else
sublevel = 0
End If
'score is numeric value of the data
score = level + sublevel
'total is teh toatl of the cells so far
total = total + score
a = a + 1
n = n + 1
End If
Loop
ave = total / n
'reconvert into format level and sublevel (a,b,c)
averagelevel = Application.WorksheetFunction.RoundDown(ave, 0)
asl = ave - averagelevel
If asl < 0.17 Then
averagesublevel = "c"
ElseIf asl < 0.5 Then
averagesublevel = "b"
ElseIf asl < 0.84 Then
averagesublevel = "a"
ElseIf asl < 1 Then
averagelevel = averagelevel + 1
averagesublevel = "c"
Else
averagesublevel = "c"
End If
avlvl = averagelevel & averagesublevel
End Function
【问题讨论】:
-
我怀疑发生的事情是范围作为 Range 类型的单个对象传入,而您的代码试图将其视为数组传入。如果是这样,您需要测试 PamArray 元素的类型;如果第一个元素是 Range 类型,则将其分配给数组进行处理。另外,我是否正确理解您可能同时将范围和单个单元格传递给函数。
-
你知道我是怎么纠正的吗?
-
您应该将其元素分配给函数内部的另一个数组,而不是直接对 PamArray 进行操作。测试 PamArray 的每个元素的类型:如果是单个单元格,则直接将其放入新数组中;如果它是一个范围,您应该循环遍历它,将每个单元格的值分配给新数组。然后对新数组进行操作。
-
谢谢。这样就解决了。
标签: excel range user-defined-functions vba