宏查找用户输入日期范围并删除范围外的所有内容

时间:2015-02-13 12:19:20

标签: date excel-vba range user-input vba

想知道是否有人可以帮助我开发一个简单的用户界面宏。

我有一组数据,第一列(A)是日期。日期范围可以是任意范围,因此可以从任何开始日期到结束日期(大多数时间是6/8周)。让我们说,为了论证,日期范围从2014年12月31日18:00到2015年2月9日18:00(注意日期是dd / mm / yyyy的英国格式)。我想要询问用户他们去的开始和结束日期范围 - 比如2015年1月1日到2015年1月31日。一旦他们选择了范围,宏应该删除所有日期范围之前的所有内容(并向上移动单元格)并删除所选日期范围之后的所有内容。日期范围以10分钟为增量。

我已经编写了一些代码来开始:

Public Sub DateRngInput()

Dim startDate As String
Dim endDate As String
Dim sRow As Long
Dim eRow As Long
Dim lastRow As Long

lastRow = Cells(Rows.Count, 1).End(xlUp).Row
startDate = Left(Worksheets("Template").Cells(1, 1), 10)
endDate = Left(Worksheets("Template").Cells(lastRow, 1), 10)

sDate = InputBox("Choose Start date (dd/mm/yyyy)" & vbNewLine & vbNewLine & "Data range starts at " & startDate)
eDate = InputBox("Choose End date (dd/mm/yyyy)" & vbNewLine & vbNewLine & "Data range ends at " & endDate)

'On Error Resume Next
sRow = Worksheets("Template").Range("$A$1:$A" & lastRow).Find(sDate, LookAt:=xlPart).Row
eRow = Worksheets("Template").Range("$A$1:$A" & lastRow).Find(eDate, SearchDirection:=xlPrevious, LookAt:=xlPart).Row

MsgBox ("Your date range is from: " & vbNewLine & sDate & " at Row " & sRow & vbNewLine & "To " & vbNewLine & eDate & " at Row " & eRow)

End Sub

宏错误出现在以下行,运行时错误“91”:

sRow = Worksheets("Template").Range("$A$1:$A" & lastRow).Find(sDate, LookAt:=xlPart).Row

非常感谢任何帮助!

感谢。

1 个答案:

答案 0 :(得分:0)

假设我们有以下数据:

enter image description here

请注意,材料甚至没有排序!我们希望仅保留2015年2月1日至2015年2月15日期间的数据。

我们将从底部向上移动。我们删除了日期限制之外的所有行

Sub DateKleaner()
    Dim early As Date, late As Date, N As Long
    Dim dt As Date

    early = DateSerial(2015, 2, 1)
    late = DateSerial(2015, 2, 15)
    N = Cells(Rows.Count, "A").End(xlUp).Row

    For i = N To 1 Step -1
        dt = Cells(i, 1).Value
        If dt > late Or dt < early Then
            Cells(i, 1).EntireRow.Delete
        End If
    Next i
End Sub

我们将留下:

enter image description here

修改#1:

以下是一些要求用户提供日期的代码:

Sub DateKleaner()
    Dim early As Date, late As Date, N As Long
    Dim dt As Date

    early = CDate(Application.InputBox(Prompt:="Please enter start date:", Type:=2))
    late = CDate(Application.InputBox(Prompt:="Please enter end date:", Type:=2))
    MsgBox early & vbCrLf & late

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

    For i = N To 1 Step -1
        dt = Cells(i, 1).Value
        If dt > late Or dt < early Then
            Cells(i, 1).EntireRow.Delete
        End If
    Next i
End Sub

当然,您可能会使用自己的 UserForm 来完成同样的事情。