2013-08-29 5 views
1

Я пытаюсь сохранить диапазон от другого листа до переменной, а затем сравнить его с ячейкой. У меня есть этот код:Как установить диапазон в переменную?

Function collectUtfall(A1 As String, Ax As String) 
Dim rng As Variant 
Dim sum as Integer 

sum = 0 

Set rng = Sheets("Utfall").Range("N2").Value <------- This line 

If rng = Ax Then 
     sum = sum + 10 
     Else: sum = 33 

End If 

collectUtfall = sum 
End Function 

Проблема заключается в том, что он действует не так, как я надеялся. Я получаю ошибку #Value, и я сузил ее до строки, помеченной в коде. Если я удалю эту строку, я не получу ошибку, но, конечно, результат будет равен 0.

Я попытался сгладить, так как Range также не работает.

В чем может быть проблема?

EDIT: Оригинальная проблема решена, но встречается с другой. Если я использовал этот код (небольшие изменения), я снова получаю ту же ошибку. Я неправильно использую смещение или где проблема сейчас?

Function collectUtfall(A1 As String, Ax As String) 
Dim rng As Variant 
Dim sum As Integer 

sum = 0 

rng = Sheets("Utfall").Range("M2:O272").Value 

If rng.Offset(0, 1) = Ax Then 
    sum = sum + 10 
    Else: sum = 33 

End If 


collectUtfall = sum 
End Function 
+0

Вы должны чтить ответ на предыдущий вопрос, отметив, что, как правильно и сделать новый вопрос. 'Offset' - метод' Range'. Удалите '.Value' и все должно работать нормально. –

+0

Хорошо, извините. Не был уверен в том, должен ли я начать новый вопрос или нет. Сделаю в следующий раз! – andysando

ответ

3

С кодом есть несколько проблем.

Рекомендую вам начать изучать, что Set используется для и когда.

Difference between Dim and Set     - обеспечивается Doug Glancy

Кроме того, проверьте what datatypes to chose для ваших переменных и почему. Посмотрите их ограничения и пример использования.

Узнать how to work with Ranges. Когда использовать .Value и когда нет. При указании переменной на одну ячейку и на несколько ячеек.

Узнать об how to loop над ассортиментом.

Прочитайте немного о выделении кода.

и после этого вы сможете написать свой собственный:

Function collectUtfall(A1 As String, Ax As String) 

    Dim rng As Range 
    Dim sum As Long: sum = 0 

    Set rng = Sheets("Utfall").Range("M2:O272") 

    Dim cell As Range 
    For Each cell In rng 
     If StrComp(cell.Offset(0, 1).Text, Ax, vbTextCompare) = 0 Then 
      sum = sum + 10 
     Else 
      sum = 33 
     End If 
    Next 

    collectUtfall = sum 
End Function 
+1

Большое спасибо, работали как ничто другое! – andysando

3

"Set" не используется в Set rng =; убери это.

rng = Sheets("sheet1").Range("N2").Value

+0

Вау, это было просто. Благодаря! Для справок в будущем, когда требуется Set? – andysando

+3

Вы используете * Set * при назначении ссылки на * объект *. Например: 'Dim c as Range: Set c = Range (" A1 ")'. В коде вы назначаете rng значению *. – Joe

+3

Вы можете узнать больше в Интернете. Вот старт: http://stackoverflow.com/questions/3872339/what-is-the-difference-between-dim-and-set-in-vba. –

0

Вы можете иметь противоречивые типы данных. Если Ax является строкой типа, вы должны сравнить строку с ней. Вы можете определить rng как строку (dim rng as string) или сделать cstr:

If CStr(Rng) = Ax Then 
Смежные вопросы