2016-12-07 19 views
1

180日以上のレコードを削除しようとしています。日付は列Fにあります。これを実行すると何も起こりません。私はそれがDate()関数と関係していると思っています。Excel VBA:古いレコードを削除する

Sub ClearOldData() 
Application.ScreenUpdating = False 
Sheets("Data").Select 
Dim LastRow As Long 
With ActiveSheet 
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
End With 
For i = 2 To LastRow 
    Dim recdate As Date 
    recdate = Cells(i, "F").Value 
    If DateDiff(d, Date, recdate) > 179 Then 
     ws.Rows(i).Delete 
    End If 
Next i 
Application.ScreenUpdating = True 
End Sub 
+3

行を削除するときは、行のインデックスが干渉しないように、下から上に移動することをお勧めします。 'For i = LastRow to 2 Step -1' –

+0

良い点。私はその変更を行った。しかし、手元の問題に対処していません。 – superblowncolon

+1

Timには、forループを 'For i = LastRow to 2 Step -1'として下から上に移動するだけでなく、' ws'オブジェクト(おそらくワークシートへの参照)を使用していますが、あなたは決してそれをどこにでも置かない。 'Debug.Print recdate&" "&Date&" "&DateDiff(" d "、Date、recdate)'をループの先頭に追加して、正確に何が計算されているかを確認することもできます。 – Dave

答えて

3

VBA Date/Timeは、1から始まる数値で、#1/1/1900#に相当します。

日付/時刻=

  • 1日= 1
  • 1時間値1/24
  • 1分= 1/24/60
  • 1秒= 1月24日/ 60/60

常に最後の行/項目から最初の行に削除します。 Compare cells to delete rows, value is true but not deleting rowsへの私の答えはなぜかを示しています。


DateDiff("d", Date, recdate) > 179Int(Date - recdate) > 179は同等です。

Sub ClearOldData() 
    Application.ScreenUpdating = False 
    Dimi As Long 

    With Sheets("Data") 

     For i = 2 To LastRow Step -1 
      If Int(Date - Cells(i, "F").Value) > 179 Then 
       .Rows(i).Delete 
      End If 
     Next i 

    End With 
    Application.ScreenUpdating = True 
End Sub 
関連する問題