2015-06-24 3 views
1

Я пытаюсь написать функцию, которая возвращает значение определенной ячейки, расположенной в том же столбце, что и аргумент, который я даю в аргументе, (lig = номер строки, col = номер столбца), но каждый раз, когда я запускаю его, я получаю ошибку «1004" , вот мой код:VBA Ошибка 1004 в функции

Function week(lig As Integer, col As Integer) As Integer 
    Dim i As Integer 
    i = 0 
    Do Until Cells(lig - i, 1) = "Row labels" 
     i = i + 1 
    Loop 
    week = Cells(lig - i, col) 
End Function 

строка, в которой появляется ошибка:

Do Until Cells(lig - i, 1) = "Row labels" 

Я знаю, что проверить значение ячеек, содержащее целые числа, прежде чем перейти к этому, я подозреваю ошибку типа, но я не могу это исправить. Может ли кто-нибудь понравиться Помогите ?

ответ

0

я = 0 вызовет ошибку, как клетки (0,1) не существует в листе вы можете также пункт выхода на, если ваш логика никогда не будет найдена, так как вы получите ошибку, когда попадете в конец листа. Если вы пройдете этот lig = 1, вы также получите ошибка (как освети - я (1-1) привело бы к 0), так что вы также можете обрабатывать этот сценарий

Function week(lig As Integer, col As Integer) As Integer 
    Dim i As Integer 
    i = 1'Changed to 1 
    Do Until Cells(lig - i, 1) = "Row labels" 
     i = i + 1 
     if i > 1000000 then exit do 'Exit clause 
    Loop 
    if i < 1000000 then 
     week = Cells(lig - i, col) 
    else 
     week = 0'Handle 0's in calling code 
    end if 
End Function 
+0

Спасибо, он действительно пытался достичь не существующей ячейки. – Sachasai

+0

вы также можете обрабатывать col = 0, поскольку это также вызовет ошибку – 99moorem

1

Ошибка не является ошибкой типа. Проблема в том, что вы пытаетесь получить доступ к ячейке, которая не существует. Очевидно, что ваш цикл не достигает ячейки, содержащей значение «метки Row» и в конечном итоге пытается получить доступ к ячейкам (0,1), что вызывает ошибку 1004. Что до этого происходит - вы не предоставили достаточно подробностей для сказать.

1

Я подозреваю, что значение в ячейке на самом деле «Row Labels» или «Подписать строки» или строки метки "или что-то еще, что на самом деле не соответствует точно Попробуйте это:.

Do Until Trim(Ucase(Cells(lig - i, 1))) = "ROW LABELS" 

Или если вы просто хотите, чтобы остановить в строке одно использование этого:.

Do Until lig - i = 1 
0

Вы хотели бы рассмотреть вопрос переписывания следующим образом, я думаю, это яснее.

Function week(lig As Integer, col As Integer) As Integer 

    Dim i As Integer 

    ' Thsi function will return 0 if no row with the text is found 
    week = 0 

    For i = lig To 1 Step -1 

     If Cells(i, 1) = "Row labels" Then 
      week = Cells(i, col) 
      Exit For 
     End If 

    Next i 


End Function 

' EVEN BETTER USE THIS (or similar)! 

Function week(MyCell As Range) As Integer 

    Dim i As Integer 

    week = 0 

    For i = MyCell.Row To 1 Step -1 

     If MyCell.Parent.Cells(i, 1) = "Row labels" Then 
      week = MyCell.Parent.Cells(i, MyCell.Column) 
      Exit For 
     End If 

     ' Note 
     ' MyCell.Parent. returns the sheet containing the cell 
     ' Just using Cells(i, 1) (wihtout preceeding with "MyCell.Parent." will pick up 
     ' cells on the currently active sheet, which may not be the sheet with the cell! 
     ' 

    Next i 


End Function 
Смежные вопросы