2011-06-24 10 views
0

次のコードが1つのインスタンスで動作し、別のインスタンスで失敗する理由が混乱しています。次は#VALUE!エラー。#VALUEを返すVBA関数!

Function RateFetcher(Plan_Text As String, Zip_Text As String, Sex As String, Tabacco_Use As String, Age As Integer, State As String) 

Dim Plan As String 
Plan = StrConv("Plan " + Plan_Text, vbLowerCase) 

Dim ProperState As String 
ProperState = StrConv(State, vbProperCase) 

Dim Search_Range As Range 
Search_Range = Worksheets(ProperState).Range("A4:A600") 
MsgBox (Search_Range) 

Dim Location As String 

For Each c In Search_Range 
    If StrConv(c.Value, vbLowerCase) = Plan And c.Offset(1, 0) = Zip_Text Then 
     Location = c.Address 
    End If 
Next c 

Dim Sex_Tab_Offset As Integer 

Dim Combined As String 

Combined = Sex + Tabacco_Use 

If Combined = "F NO" Then 
    Sex_Tab_Offset = 1 
ElseIf Combined = "M NO" Then 
    Sex_Tab_Offset = 2 
ElseIf Combined = "F YES" Then 
    Sex_Tab_Offset = 3 
Else 
    Sex_Tab_Offset = 4 
End If 

Dim Age_Offset As Integer 
Age_Offset = Age - 65 

RateFetcher = Worksheets(ProperState).Range(Location).Offset(Age_Offset, Sex_Tab_Offset).Value 
End Function 

一方、これは動作します。違いは、私がSearch_Rangeを明示的に定義していることですが、最初の例の柔軟性を持たせたいので、検索する各範囲を定義する必要がないためです。検索する範囲はState_name!$A$4:$A$500です。

Function RateFetcher(Search_Range As Range, Plan_Text As String, Zip_Text As String, Sex As String, Tabacco_Use As String, Age As Integer, State As String) 

Dim Plan As String 
Plan = StrConv("Plan " + Plan_Text, vbLowerCase) 

Dim ProperState As String 
ProperState = StrConv(State, vbProperCase) 

'Dim Search_Range As Range 
'Search_Range = Worksheets(ProperState).Range("A4:A600") 

Dim Location As String 

For Each c In Search_Range 
    If StrConv(c.Value, vbLowerCase) = Plan And c.Offset(1, 0) = Zip_Text Then 
     Location = c.Address 
    End If 
Next c 

Dim Sex_Tab_Offset As Integer 

Dim Combined As String 

Combined = Sex + Tabacco_Use 

If Combined = "F NO" Then 
    Sex_Tab_Offset = 1 
ElseIf Combined = "M NO" Then 
    Sex_Tab_Offset = 2 
ElseIf Combined = "F YES" Then 
    Sex_Tab_Offset = 3 
Else 
    Sex_Tab_Offset = 4 
End If 

Dim Age_Offset As Integer 
Age_Offset = Age - 65 

RateFetcher = Worksheets(ProperState).Range(Location).Offset(Age_Offset, Sex_Tab_Offset).Value 

`

エンド機能 `

+0

まず、デバッガでコードをステップ実行して、エラーが発生している箇所を確認します。次に参照してください:http://stackoverflow.com/questions/349613/what-does-the-keyword-set-actually-do-in-vba – jtolle

答えて

3

あなたがSetにしたいRangeためRangeへの参照がオブジェクトである:

Dim Search_Range As Range 
Set Search_Range = Worksheets(ProperState).Range("A4:A600") 

また、MsgBoxはタイプStringの引数が期待、そうすることはできませんMsgBox a Rangeそうですね。あなたはRange表示したい、と私はあなたがそのアドレスを表示したい推測しているのどのプロパティを言っている:

MsgBox Search_Range.Address 

Aaの脇に、RangeのデフォルトプロパティはValueので、MsgBox Search_Rangeが働いているだろうSearch_Rangeが1つのセルへの参照だった場合... Search_Range.Valueは597要素のVariant配列を返しますが、これを暗黙的にStringに強制することはできません。

+0

@tshauckまた、あなたの_FOR EACH_に_EXIT FOR_文が必要であることに注意してくださいループ。それ以外の場合は、不必要に範囲の最後まで実行したり、複数の条件が満たされている場所varを上書きしたりします。 – ray

関連する問題