我正在尝试编写一个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
答案 0 :(得分:2)
正在发生的是范围作为Range类型的单个对象进入,并且您的代码试图将其视为以数组形式进入。
最好的方法是在函数体内创建一个新数组,然后将范围内的元素分配给新数组。您需要测试ParamArray元素的类型。如果一个元素是String类型,那么将它直接放在新数组中;如果一个元素是Range类型,则遍历它,将其单元格值分配给新数组。
然后你会对新阵列进行处理。
以下代码提供了传递范围以及单个单元格或值的机制。我没有提供你的代码,但已经说明了它的用途。
Function avlvl(ParamArray av() As Variant) As Variant
Dim a As Integer
Dim i As Long
Dim avArr()
Dim element As Variant
a = 0
i = 0
Do While a < UBound(av) + 1
If TypeName(av(a)) = "String" Then
avArr(i) = av(a)
i = i + 1
ElseIf TypeName(av(a)) = "Range" Then
For Each element In av(a)
ReDim Preserve avArr(0 To i)
avArr(i) = element
i = i + 1
Next
Else
avlvl = CVErr(xlErrValue)
Exit Function
End If
a = a + 1
Loop
i = 0
Do While i < UBound(avArr) + 1
'...
'now process the elements of avArr()
'...
i = i + 1
Loop
End Function
答案 1 :(得分:0)
如果你有一个不相交的单元格区域并且你想将它们传递给UDF,一种方法是创建一个Defined Name并将它作为单个参数传递给UDF。