2017-03-23 11 views
0

列Aの各値から日付を知りたいのですが、これはVBAでVLookup関数を使用していますが、値が見つからない場合(= N/A)コードが停止します。結果がN/Aの場合、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'を実行します。また、 ''日付を遅くする:lapse = CDate(... VLookUp ...) ' – PatricK

答えて

0

1) - VLookupのエラーをトラップするためにはIf IsError(lapse) Thenとした後、あなたの代わりにWorksheetFunctionApplication.VLookupを使用する必要があります(@のuser3598756で述べたように) 。

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

  • 二位あなたが使用することができます

    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 
関連する問題