2017-03-23 1 views
0

열 A의 각 값에서 날짜를 알고 싶습니다.이 경우 VBA에서는 VLookup 함수를 사용하지만 값이 없으면 (= N/A) 코드가 멈 춥니 다.결과가 Nothing 일 때 Vlookup이 작동하지 않습니다.

이 오류는 어떻게 처리해야합니까?

Here's 코드 :

Sub lapse_Function() 

Dim wsAll As Worksheet 
Dim wsDb As Worksheet 

Dim lapse As Variant 
Dim startDate As Date 
Dim Lookup_Range As Range 
Dim ID_number As Object 

Set wsDb = Worksheets("Database") 
Set wsAll = Worksheets("All data") 

'Run function 
rowNo = 2 
Do Until IsEmpty(wsDb.Cells(rowNo, 2)) 
    'Set values 
    studyDate = DateValue("March 3, 2017") 

    Set Lookup_Range = wsAll.Range(wsAll.Cells(1, 1), wsAll.Cells(500, 3)) 
    Set ID_number = wsDb.Cells(rowNo, 2) 

    lapse = Application.WorksheetFunction.VLookup(ID_number, Lookup_Range, 3, False) 'Here is where the code stops. I have next the IF in case of error but it won't work 
    'Assing value 
    If IsError(lapse) Then 
     Cells(rowNo, 23).Value = "Less than 4 months" 'NOT WORKING 
    Else 
     If ((studyDate - lapse)/7) < 52 Then 
      Cells(rowNo, 23).Value = Round(((studyDate - lapse)/7), 0) & " weeks" 
     Else 
      Cells(rowNo, 23).Value = Round(((studyDate - lapse)/360), 1) & " months" 
     End If 
    End If 
    rowNo = rowNo + 1 
Loop 

End Sub 
+0

"코드 중지"란 무엇을 의미합니까? 오류 메시지가 나타나면 그 메시지는 무엇입니까? IsError()는'VLOOKKUP'이 반환하는 에러 * 값을 테스트 할 수 있지만 VBA 런타임 에러를 잡아 내지 않습니다. 그것을 위해 설계되지 않았습니다. –

+0

사용 : Application.VLookup. 대신 : Application.WorksheetFunction.VLookup – user3598756

+0

오류가 발생했을 때 실행을 계속하려면'On Error Resume Next'를 사용해야합니다. 실행 취소하려면 'On Error GoTo 0' 오류를 테스트하려면 If Err.Number <> 0 Then :'Reset Error : Err.Clear'. 또한'Dim lapse As Date : 경과 = CDate (... VLookUp ...)' – PatricK

답변

0

1) -) @ user3598756에 의해 명시된 트랩하기 위해 VLookup의 오류 If IsError(lapse) Then을 가진 후, 당신은 (대신 WorksheetFunctionApplication.VLookup를 사용할 필요가 .

2)가 - 나중에 CellsWorksheets와 정규화하지 않은 라인은 : Cells(rowNo, 23).Value = "Less than 4 months"

은 다음과 같아야합니다

wsDb.Cells(rowNo, 23).Value = "Less than 4 months" 

3) 대신 사용

If ((studyDate - lapse)/7) < 52 Then 

DateDiff 함수를 사용할 수 있으며 첫 번째 매개 변수는 "w" - 간격을 주로 나타냅니다.

  • 첫 번째 장소가 될 것입니다 :

    If DateDiff("w", lapse, studyDate) < 52 Then

  • 2 위 사용할 수

    wsDb.Cells(rowNo, 23).Value = DateDiff("m", lapse, studyDate) & " months"

업데이트 코드

'Run function 
rowNo = 2 
Do Until IsEmpty(wsDb.Cells(rowNo, 2)) 
    ' Set values 
    studyDate = DateValue("March 3, 2017") 
    Set Lookup_Range = wsAll.Range(wsAll.Cells(1, 1), wsAll.Cells(500, 3)) 
    Set ID_number = wsDb.Cells(rowNo, 2) 

    lapse = Application.VLookup(ID_number, Lookup_Range, 3, False) 
    ' Assign value 
    If IsError(lapse) Then 
     wsDb.Cells(rowNo, 23).Value = "Less than 4 months" 
    Else 
     If DateDiff("w", lapse, studyDate) < 52 Then 
      wsDb.Cells(rowNo, 23).Value = DateDiff("w", lapse, studyDate) & " weeks" 
     Else 
      wsDb.Cells(rowNo, 23).Value = DateDiff("m", lapse, studyDate) & " months" 
     End If 
    End If 
    rowNo = rowNo + 1 
Loop 
관련 문제