Vba For循环使用日期编译错误:语法错误
我正在尝试运行一个脚本,该脚本将浏览特定列的所有行。然后将这些列中的日期与设置的日期进行比较。如果日期大于,则删除该行。我得到的错误称为编译错误:语法错误Vba For循环使用日期编译错误:语法错误,vba,excel,Vba,Excel,我正在尝试运行一个脚本,该脚本将浏览特定列的所有行。然后将这些列中的日期与设置的日期进行比较。如果日期大于,则删除该行。我得到的错误称为编译错误:语法错误 Sub removewrongyear() Dim i As Integer For i = 2 To 635475 If Data.Cells(i,20).Value > DATE(2018,12,31) Then Rows(i).EntireRow.Delete Next i End Sub 你需要像@braX所说的那样后退一
Sub removewrongyear()
Dim i As Integer
For i = 2 To 635475
If Data.Cells(i,20).Value > DATE(2018,12,31) Then
Rows(i).EntireRow.Delete
Next i
End Sub
你需要像@braX所说的那样后退一步。指定的数字也超过了变量类型的容量。在VBA中,ingeter值始终将变量声明为
Long
,这是一种很好的做法
“数据”范围没有设置。我将其替换为对活动工作表的引用。
变量YearA也未指定。我给它赋值为2018。Date函数使用不正确,您打算使用DateSerial
始终将选项Explicit
放在代码顶部以捕获错误。这里真的有很多
Option Explicit
Sub removeWrongYear()
Dim i As Long, yearA as Long
yearA = 2018
With ActiveSheet
For i = 635475 to 2 Step -1
If .Cells(i,20).Value > DateSerial(yearA,12,31) Then .Rows(i).EntireRow.Delete
Next i
End With
End Sub
这是一个基于数组的快速版本,一次删除所有行:
Option Explicit
Option Base 1 'row and column index will match array index
Sub removeWrongYear()
Dim i As Long, yearA As Long, rowsCnt As Long
Dim rowsToDelete As Range
Dim vData As Variant
yearA = 2018
With ActiveSheet
'1st to 635475 row, 20th column
vData = Range(.Cells(1, 20), .Cells(635475, 20))
For i = UBound(vData) To 2 Step -1
If vData(i, 1) > DateSerial(yearA, 12, 31) Then
rowsCnt = rowsCnt + 1
If rowsCnt > 1 Then
Set rowsToDelete = Union(rowsToDelete, .Rows(i))
ElseIf rowsCnt = 1 Then
Set rowsToDelete = .Rows(i)
End If
End If
Next i
End With
If rowsCnt > 0 Then
Application.ScreenUpdating = False
rowsToDelete.EntireRow.Delete
Application.ScreenUpdating = True
End If
End Sub
删除行时,您需要后退一步。什么是
YearA
?您要做的是通过自动筛选更好地完成。@JohnyL抱歉,YearA是我在脚本的另一部分中确定的当前年份,我将编辑到2018年,以免混淆。确定。那么,什么是数据
?计划表名称?我在比较日期时遇到问题,因为它们的格式不同,一个格式为2018年1月27日,另一个格式为2017年12月31日。是否有一种方法可以转换这些日期。您可以在日期比较附近放置一个断点,然后将鼠标悬停在上方,查看比较日期的格式。通常在VBA中,所有日期都是可比较的,因为它表示Long
值。当VBA不将单元格内容识别为日期,而将字符串识别为日期时,可能会出现问题。在这种情况下,根据实际的字符串
,应编写专用代码将其转换为日期
。