2017-02-25 3 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'のようなエラー値が含まれている場合、VBAはエラーを ' maxwindsp'(それが何であれ)。したがって、OPには、If IsError(wcell.Value)Then Then(VBAはエラー値を含むセルで何を行うべきか)のようなエラー処理が含まれていなければなりません。 – Ralph

+2

あなたのループで 'For each wcell In warr.Cells'であなたはそれぞれの' wcell'(あなたの最初のIfでも)をチェックしています。しかし、あなたの2番目の場合、 'cell'に切り替えるのですか? –

答えて

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 

あなたの投稿があまりにも他のポイントのカップルをスローします。

  1. おそらく、開発中にモジュールから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 
    
  2. ですべての配列を持つのはなぜトラブル自分で?最初のループでWindDirの値にアクセスしていることを考えれば、そこで最大値をチェックするだけではどうですか?この方法で、あなたの全体の機能は、単純に次のようになります。Range修飾子(まだ範囲を修飾しながら、あなたの投稿コードに忠実な維持で私はむしろ不器用な試み)に関するComiternのポイント@

    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. 注意。すべてのコードを投稿するベスト

+0

Ambieありがとうございました。私の質問に対する完璧な答え。私はよりシンプルなあなたの提案されたコードを使用することを好みました! –

+0

問題ありません。あなたが答えに満足している場合は、この回答を「受け入れる」ことによって未回答の質問からこれを削除してください。 – Ambie

関連する問題