2016-08-12 4 views
0

VBAでFORループを使用してシートをループし、各範囲に基づいて値を決定するためにVLookupを使用しようとしています。基本的にシートはI 14の範囲を有する場合に設定し、各範囲は、このように設定する2列(日付及び値)である。 Sample DataVBAのVLookupが最初のパス後にループに失敗する

このコードは、各範囲をループし、値を返すためにVLOOKUPを行う、または値がない場合は-1を返します。

私が抱えている問題は、データの最初の行で動作しますが、その後のすべての行は-1を返しています。

Sub Format(inSheet As String, outSheet As String, lastAvail as Date, maxRows as Long) 
Do While curDate <= lastAvail 
    For x = 2 To (maxRows - 1) * 2 Step 2 
     ' Get value of current data series 
     Sheets(inSheet).Activate 
     Range(Cells(8, x - 1), Cells(8, x)).Select 
     Range(Selection, Selection.End(xlDown)).Select 
     Set lookupRange = Selection 
     val = Application.VLookup(curDate, Worksheets(inSheet).Range(lookupRange.Address), 2, False) 
      Sheets(outSheet).Activate 
      If IsError(val) Then 
       Cells(curRow, x/2 + 1).Value = -1 
      ElseIf IsNumeric(val) Then 
       Cells(curRow, x/2 + 1).Value = val 
      Else 
       Cells(curRow, x/2 + 1).Value = Null 
      End If 
    Next 

    curDate = DateAdd("m", 1, curDate) 
    Cells(curRow, maxRows + 1).Value = curDate - 1 
    curRow = curRow + 1 
    val = "" 
Loop 
+1

ループ内で何が起こっているか確認するためにステップアップしましたか? – PartyHatPanda

+0

私は100%は確信していませんが、あなたのデータサンプルは同じ月(1月)の唯一の日の集合ですが、 'curDate = DateAdd(" m "、1、curDate) ? –

+0

また、[.Select'](https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros)を避けるのが最良です。これは一般的に役立ちます。 – BruceWayne

答えて

-1

あなたの助けみんなのおかげでは、それは私がDateAddでCURDATEをインクリメントするとき、それはそうVLookupは、それが実際のデータをマッチングだと認識していないフォーマットを変更することが判明しました。私はVLookupの直前にcurDateをLongに変換し、すべてが機能しました。

関連する問題