Функция VBA возвращает # ЗНАЧЕНИЕ! - PullRequest
0 голосов
/ 24 июня 2011

Я запутался, почему следующий код работает в одном случае, а затем не работает в другом.Следующее дает # ЗНАЧЕНИЕ!ошибка.

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

Функция завершения`

1 Ответ

3 голосов
/ 24 июня 2011

Вы хотите Set ссылку на Range, потому что Range является объектом:

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

Также, MsgBox ожидает аргумент типа String, так что вы можете 'т MsgBox а Range вот так.Вы должны указать, какое свойство Range вы хотите отобразить, и я предполагаю, что вы хотите отобразить его адрес:

MsgBox Search_Range.Address

А, кроме того, свойство по умолчанию Range равно Value, поэтому MsgBox Search_Range сработало бы, если бы Search_Range была ссылкой на одну ячейку ... но в вашем случае Search_Range.Value возвращает массив Variant из 597 элементов, и это не может быть неявно приведенодо String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...