2014-11-26 17 views
0

Может ли кто-нибудь взглянуть на мой код и помочь мне узнать, что я сделал не так? Заранее спасибо!Ошибка определения приложения или объекта

Sub Price() 

Dim ilastrow As Long 

Dim i As Long 

ilastrow = Sheets(2).Cells(Rows.Count, 4).End(xlUp).Row 

For i = ilastrow To 2 Step -1 

Sheets(2).Cells(i, 10).Value = Application.WorksheetFunction.IfError(Application.WorksheetFunction.VLookup(Sheets(2).Cells(i, 4).Value, Sheets(1).Range("D2:F520"), 2, False), 0) 

Sheets(2).Cells(i, 11).Value = Application.WorksheetFunction.IfError(Application.WorksheetFunction.VLookup(Sheets(2).Cells(i, 4).Value, Sheets(1).Range("D2:F520"), 3, False), 0) 

Next i 

End Sub 
+1

Что линия ошибка происходит на? –

ответ

0

Попробуйте использовать метод оценки, например, :

Sheets(2).Cells(i, 10).Value = Evaluate("=IFERROR(VLOOKUP(D" & i & ",'" & Sheets(1).Name & "'!$D$2:$F$520,2,FALSE),0)") 

Кроме того, вы уверены, что листы (1) являются правым листом? Если вы добавляете/удаляете листы, индекс может потенциально измениться и этот лист больше не существует. По возможности вам следует ссылаться на имя листа или задавать рабочий лист переменной и работать с ним.

Например:

Dim ws1 As Worksheet, ws2 As Worksheet 

Set ws1 = Sheets("This Sheet") 
Set ws2 = Sheets("That Sheet") 

ws1.Cells(i, 10).Value = Evaluate("=IFERROR(VLOOKUP(D" & i & ",'" & ws2.Name & "'!$D$2:$F$520,2,FALSE),0)") 
0

Вы не можете использовать функцию рабочего листа IFERROR в Application.IfError в VBA. Поймать ошибку достаточно, чтобы вызвать ошибку при ее использовании. Ниже приведен неразрушающий метод проверки соответствия файла VLOOKUP перед его использованием для извлечения значения.

Sub Price() 
    Dim ilastrow As Long, i As Long 

    With Sheets(2) 
     ilastrow = .Cells(Rows.Count, 4).End(xlUp).Row 
     For i = ilastrow To 2 Step -1 
      .Cells(i, 10).Resize(1, 2) = 0 
      If CBool(Application.CountIf(Sheets(1).Columns("D"), .Cells(i, 4).Value)) Then 
       .Cells(i, 10).Value = Application.VLookup(.Cells(i, 4).Value, Sheets(1).Range("D2:F520"), 2, False) 
       .Cells(i, 11).Value = Application.VLookup(.Cells(i, 4).Value, Sheets(1).Range("D2:F520"), 3, False) 
       'alternate method 
       '.Cells(i, 10).Resize(1, 2) = Sheets(1).Cells(Application.Match(.Cells(i, 4).Value, Sheets(1).Range("D2:D520"), 0) + 1, 5).Resize(1, 2).Value 
      End If 
     Next i 
    End With 

End Sub 
1

Ваш код будет проще обслуживать и читать, если вы используете несколько переменных.

Кроме того, вы можете отказаться от WorksheetFunction и проверить возвращаемое значение с помощью IsError()

Sub Price() 

Dim ilastrow As Long 
Dim i As Long, v, res, rng As Range 

    ilastrow = Sheets(2).Cells(Rows.Count, 4).End(xlUp).Row 

    Set rng = Sheets(1).Range("D2:F520") 

    For i = ilastrow To 2 Step -1 

     With Sheets(2).Rows(i) 

      v = .Cells(4).Value 

      res = Application.VLookup(v, rng, 2, False) 
      .Cells(10).Value = IIf(IsError(res), 0, res) 

      res = Application.VLookup(v, rng, 3, False) 
      .Cells(11).Value = IIf(IsError(res), 0, res) 

     End With 

    Next i 

End Sub 
+0

@ Jeeped - да, это так. Исправлена. Спасибо за хедз-ап. –

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