Vba 根据将单元格与用户输入的日期进行比较并跳过空白单元格来删除行

Vba 根据将单元格与用户输入的日期进行比较并跳过空白单元格来删除行,vba,excel,Vba,Excel,我正在寻找一种根据员工的终止日期删除行的方法。我不希望删除空白单元格,因为这些员工仍处于活动状态。我有一个弹出的文本框,询问日期,然后显示输入的日期。然后,它应该在G列中搜索输入日期之前的任何日期,并删除这些行,跳过任何空白行。 我一直在到处寻找一种方法来做到这一点,但我不能让宏停止删除每一行,但标题。日期在G列,大约有46行,但这可能会改变 Sub DateSelectandClean() ' ' DateSelectandClean Macro ' User ente

我正在寻找一种根据员工的终止日期删除行的方法。我不希望删除空白单元格,因为这些员工仍处于活动状态。我有一个弹出的文本框,询问日期,然后显示输入的日期。然后,它应该在G列中搜索输入日期之前的任何日期,并删除这些行,跳过任何空白行。 我一直在到处寻找一种方法来做到这一点,但我不能让宏停止删除每一行,但标题。日期在G列,大约有46行,但这可能会改变

Sub DateSelectandClean()
    '
    ' DateSelectandClean Macro
    ' User enters date and spreadsheet deletes everything prior to that date, ignoring empty cells.

Application.ScreenUpdating = False

Dim W2Year As Date, N As Long
Dim dt As Date

W2Year = CDate(Application.InputBox(Prompt:="Please enter W2 Year as xx/xx/xxxx Date:", Type:=2))
MsgBox W2Year


N = Cells(Rows.Count, "G").End(xlUp).Row


For i = N To 2 Step -1
dt = Cells(i, 1).Value
    If (Cells(i, 1).Value <> "" And dt < W2Year) Then
        Cells(i, 1).EntireRow.Delete
    End If

Next i
Application.ScreenUpdating = True

End Sub
Sub-DateSelectandClean()
'
'日期选择和清除宏
'用户输入日期,电子表格删除该日期之前的所有内容,忽略空单元格。
Application.ScreenUpdating=False
尺寸W2年为日期,N年为长度
Dim dt作为日期
W2年=日期(Application.InputBox(提示:=“请输入W2年作为xx/xx/xxxx日期:”,类型:=2))
MsgBox W2年
N=单元格(Rows.Count,“G”)。结束(xlUp)。行
对于i=N到2步骤-1
dt=单元(i,1)。数值
如果(单元格(i,1).值“”和dt

您的代码可能在空白日期出现问题。
如果
,我将
分开,这样它就不会在日期继续验证。
e、 g.
如果“

尝试以下方法,但不要做太多更改:

Sub DateSelectandClean()

' DateSelectandClean Macro
' User enters date and spreadsheet deletes everything prior to that date, ignoring empty cells.

    Application.ScreenUpdating = False
    Dim dateCol, iRow
    Dim W2Year As Date, N As Long
    Dim dt As String

    W2Year = CDate(Application.InputBox(Prompt:="Please enter W2 Year as dd/mm/yyyy Date:", Type:=2))
    MsgBox W2Year

    N = Cells(Rows.Count, "G").End(xlUp).Row
    dateCol = 7
    For iRow = N To 2 Step -1
        dt = Cells(iRow, dateCol).Value
        If (Cells(iRow, dateCol).Value <> "") Then
            If (CDate(dt) < CDate(W2Year)) Then
                Cells(iRow, dateCol).EntireRow.Delete
            End If
        End If
    Next

    Application.ScreenUpdating = True

End Sub
Sub-DateSelectandClean()
'日期选择和清除宏
'用户输入日期,电子表格删除该日期之前的所有内容,忽略空单元格。
Application.ScreenUpdating=False
伊洛
尺寸W2年为日期,N年为长度
作为字符串的Dim dt
W2Year=CDate(Application.InputBox(提示:=“请输入W2年作为dd/mm/yyyy日期:”,类型:=2))
MsgBox W2年
N=单元格(Rows.Count,“G”)。结束(xlUp)。行
dateCol=7
对于iRow=N到2步骤-1
dt=单元格(iRow,dateCol).Value
如果(单元格(iRow,dateCol).Value“”),则
如果(CDate(dt)
主要问题是您正在检查“A”列中的日期信息,并基于此删除。如果日期在“G”中,则应选中
单元格(x,7)
,而不是
单元格(x,1)

Sub-DateSelectandClean()
'
'日期选择和清除宏
'用户输入日期,电子表格删除该日期之前的所有内容,忽略空单元格。
Application.ScreenUpdating=False
Dim W2年为日期,最后一行为长,i为长,dateCol为长
Dim dt作为日期
G列的dateCol=7'
当W2Year=“00:00:00”时执行
W2年=格式(Application.InputBox(提示:=“请输入W2年作为xx/xx/xxxx日期:”,类型:=2),“mm/dd/yyyy”)
MsgBox W2年
环
lastRow=单元格(Rows.Count,dateCol).End(xlUp).Row
对于i=最后一行到2步骤-1
'如果单元格(i,dateCol).Value为“”,则
如果是IsDate(单元格(i,dateCol)),则
dt=CDate(格式(单元格(i,dateCol).Value,“mm/dd/yyyy”))

如果日期在G列(或
7
),您不想做
单元格(i,7)
?不是
1
(哪一列是A列)?您有一个总是有值的列吗?@BruceWayne-我试过了,但我会再试一次。@BruceWayne-我发现dt=单元格(I,7)的类型不匹配。值G列中的数据是什么样的?是否有日期和其他信息?我在dt=Cells(iRow,dateCol)处得到一个运行时错误“1004”。值您是否使用Excel 2016?我的正在按预期工作。我在“Cells(iRow,dateCol).EntireRow.Delete”处发现类型不匹配。现在尝试将其替换为“Rows(iRow).EntireRow.Delete”这似乎越来越近了。按原样运行它将G列中的所有日期保留在输入日期之前。如果我将if语句更改为“if(Cells(I,dateCol).Value”“和dt>W2Year),那么…”它将保留所有空格,而不保留其他内容。@tweeks-检查我的编辑。它应该按照您的要求工作-删除G列中日期早于用户输入日期的任何行。它也会忽略空白单元格。我试过几次编辑,结果与我之前的评论相同。如果这有什么区别的话,我就在Excel 2010上。@tweeks-“按原样运行,它会将G列中的所有日期保持在输入日期之前。”-是的,这不是你想要的吗?或者是否还要删除任何空白单元格行?不,我需要它来删除日期早于输入日期的行。如果输入8-1-2007,则应删除该日期及之前的所有行。输入日期之后的任何日期以及所有空白都应保留。当我运行上面的代码01-01-2008时,剩下的日期为2005到2015,所有空白区都被删除了。
Sub DateSelectandClean()
'
' DateSelectandClean Macro
' User enters date and spreadsheet deletes everything prior to that date, ignoring empty cells.

Application.ScreenUpdating = False

Dim W2Year As Date, lastRow As Long, i As Long, dateCol As Long
Dim dt      As Date

dateCol = 7                  ' for column G

Do While W2Year = "00:00:00"
    W2Year = Format(Application.InputBox(Prompt:="Please enter W2 Year as xx/xx/xxxx Date:", Type:=2), "mm/dd/yyyy")
    MsgBox W2Year
Loop

lastRow = Cells(Rows.Count, dateCol).End(xlUp).Row

For i = lastRow To 2 Step -1
    'If Cells(i, dateCol).Value <> "" Then
    If IsDate(Cells(i,dateCol)) Then
        dt = CDate(Format(Cells(i, dateCol).Value, "mm/dd/yyyy"))
        If dt <= W2Year Then
            Cells(i, dateCol).EntireRow.Delete
        End If
    End If
Next i
Application.ScreenUpdating = True
End Sub