Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba For循环使用日期编译错误:语法错误_Vba_Excel - Fatal编程技术网

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不将单元格内容识别为日期,而将字符串识别为日期时,可能会出现问题。在这种情况下,根据实际的
字符串
,应编写专用代码将其转换为
日期