[英]excel VBA For each loop for range error #VALUE
我已經在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
請幫我解決這個錯誤。
發生錯誤是因為您的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
限定符的觀點(以及我相當笨拙的嘗試,即忠實於您發布的代碼,同時仍然限定范圍)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.