我已经在excel VBA中通过我定义的函数使用了每个循环,但函数输出是#VALUE。我认为错误在我的循环中,如下所示:
谢谢你们的评论。我的功能代码如下:我更正了我发送的原始代码:
Public Function MaxWindDir(warr As Range) As Integer
Dim WindDir() As Integer
Dim maxwindsp As Integer
Dim wcell As Range
Dim i As Integer
Dim MaxDir As Integer
i = 0
maxwindsp = Application.Max(warr)
For Each wcell In warr
If wcell.Value = maxwindsp Then
WindDir(i) = Range("J" & wcell.Row).Value
i = i + 1
End If
Next wcell
If i = 1 Then
MaxWindDir = WindDir(0)
Else
MaxDir = WindDir(0)
For i = 0 To UBound(WindDir)
If WindDir(i) >= MaxDir Then
MaxDir = WindDir(i)
End If
Next i
MaxWindDir = MaxDir
End If
End Function
请帮我解决这个错误。
答案 0 :(得分:0)
发生错误是因为您的WindDir
数组未定义,因此行WindDir(i)...
将引发错误。
在循环中迭代地重新定义数组并不是很好的形式,但是代码中下面添加的ReDim Preserve
行显示了我的意思:
For Each wcell In warr
If wcell.Value = maxwindsp Then
ReDim Preserve WindDir(i)
WindDir(i) = Range("J" & wcell.Row).Value
i = i + 1
End If
Next wcell
您的帖子也会引发其他几点:
也许考虑在开发模块时从模块调用UDF。这样,任何错误都会更有意义地显示给您。如果您运行以下例程,将函数调用为已发布,则会立即突出显示未扩展的数组问题:
Public Sub RunMe()
Dim r As Range
Set r = Sheet1.Range("K2:K19") 'or whatever the range is
Debug.Print MaxWindDir(r)
End Sub
为什么要对阵列自己造成麻烦?鉴于您正在访问第一个循环中的WindDir
值,为什么不检查那里的最大值?这样,您的整个功能可能只是:
Public Function MaxWindDir(warr As Range) As Long
Dim wcell As Range
Dim maxWindSpd As Long
Dim windSpd As Long
Dim windDir As Long
maxWindSpd = Application.Max(warr)
For Each wcell In warr.Cells
windSpd = wcell.Value2
If windSpd = maxWindSpd Then
windDir = warr.Worksheet.Cells(wcell.Row, "J").Value2
If windDir >= MaxWindDir Then MaxWindDir = windDir
End If
Next
End Function
请注意@Comitern关于Range
限定词的观点(以及我在保持忠实于你发布的代码同时仍然符合范围时的笨拙尝试。)