2017-02-25 115 views
0

我已经用于每个循环通过我在excel VBA中定义的函数,但函数输出是#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 

请帮我出这个错误的。

+0

最好发布所有的代码,我们更容易找到问题的核心 – CallumDA

+0

@CallumDA通常,我会同意你的看法。但在这种情况下,它可能与代码无关,而是单元格的“.Value”。如果'wcell.Value'包含错误值,例如'#REF!'或'#DIV/0!'或'#VALUE',那么'If wcell.Value = maxwindsp Then'将失败,因为VBA无法将错误与' maxwindsp'(不管那可能是什么)。因此,OP将不得不包含一些错误处理,如'If IsError(wcell.Value)Then'(VBA应该如何处理包含错误值的单元格)。 – Ralph

+2

在你的循环中'对于每个wcell在warr.Cells'中,你正在检查每个'wcell'(也在你的第一个If中)。然而,在你的第二个如果你切换到'细胞'? –

回答

0

发生此错误的原因是您的WindDir数组未发生错误,因此行WindDir(i)...将引发错误。

这不是很大的形式反复REDIMENSION一个循环中的数组,但增加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 

您的帖子引发了其他几个点的太:

  1. 也许可以考虑在开发它们时从模块调用UDF。这样,任何错误将更有意义地显示给你。如果您运行下面的程序,调用您的功能发布时,undimensioned阵列问题,可以立即将强调:

    Public Sub RunMe() 
        Dim r As Range 
    
        Set r = Sheet1.Range("K2:K19") 'or whatever the range is 
        Debug.Print MaxWindDir(r) 
    End Sub 
    
  2. 为什么自己找麻烦与阵列呢?鉴于您正在访问第一个循环中的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 
    
  3. 注@ Comitern的有关Range预选赛(和我在保持忠于你贴的代码,同时仍出线范围相当笨拙的尝试)点。

+0

谢谢Ambie。我的问题的完美答案。我更愿意使用您的建议代码更简单! –

+0

没问题。如果您对答案满意,请通过“接受”此答案从未答复的问题中删除此问题。 – Ambie