【问题标题】:User input for date filter日期过滤器的用户输入
【发布时间】:2020-04-16 20:45:48
【问题描述】:

我有一些 VBA 代码将日期过滤器应用于数据集以进行进一步的工作。目前,日期过滤器是根据预定义的条件应用的:

Worksheets("PSE Data").Activate

    StartDate = DateSerial(Year(Date), Month(Date), Day(Date))
    EndDate = DateSerial(Year(Date), Month(Date) + 3, Day(Date))


    ActiveSheet.ListObjects("PSE_Data").Range.AutoFilter Field:=17, _
                                            Criteria1:=">=" & StartDate, _
                                            Operator:=xlAnd, _
                                            Criteria2:="<=" & EndDate
    ActiveSheet.ListObjects("PSE_Data").Range.AutoFilter Field:=6, _
                                            Criteria1:="M"

    With ActiveSheet.ListObjects("PSE_Data").Sort
    .SortFields.Add Key:= _
    Range("PSE_Data" & "[Sugg Start Date]"), _
    SortOn:=xlSortOnValues, _
    Order:=xlAscending, _
    DataOption:=xlSortNormal
    .Apply
    End With

我想要做的是用弹出框中的用户输入值替换 StartDate 和 EndDate。你能帮忙吗?

【问题讨论】:

    标签: excel vba msgbox


    【解决方案1】:

    这是一种典型的方式:

    Sub dural()
        Dim StartDate As Date, EndDate As Date
    
        With Application
            StartDate = CDate(.InputBox(Prompt:="enter startdate mm/dd/yyyy", Type:=2))
            EndDate = CDate(.InputBox(Prompt:="enter enddate mm/dd/yyyy", Type:=2))
            MsgBox StartDate & vbCrLf & EndDate
        End With
    End Sub
    

    【讨论】:

    • 谢谢!我还有几个问题: - 我想要日期格式 dd/mm/yyyy。我假设要更改为这种格式,我需要更改“类型”编号。是这样吗,如果是我需要设置什么类型。 - 如果用户以错误的格式输入日期,这将如何表现,我可以让它提示他们重试吗?
    • @dnaylor93 a Type of 2 将其作为String cDate() 在我的系统中假设为 m/d/yyyy。我不知道你的系统............实验并让我们知道............跨度>
    【解决方案2】:
    Dim StartDate, EndDate As Date
    
    StartDate = InputBox("Enter start date: ")
    EndDate = InputBox("Enter end date: ")
    

    【讨论】:

    • 这回答了问题,但您应该解释原因。还。注意编码Dim StartDate, EndDate As Date,只有EndDate被定义为Date。 StartDate 被声明为 Variant。应该是Dim StartDate as Date, EndDate As Date
    【解决方案3】:

    这是一个使用函数来获取和验证用户输入的示例。它使用Application.InputBox 提示用户输入,然后使用IsDate 检查有效日期。

    Option Explicit
    
    Sub test()
    
    'prompt user for start date
    Dim StartDate As Variant
    StartDate = GetUserInputDate("start")
    If StartDate = False Then Exit Sub 'user cancelled
    StartDate = CDate(StartDate)
    
    'prompt user for end date
    Dim EndDate As Variant
    EndDate = GetUserInputDate("end")
    If EndDate = False Then Exit Sub 'user cancelled
    EndDate = CDate(EndDate)
    
    ActiveSheet.ListObjects("PSE_Data").Range.AutoFilter Field:=17, _
                                                Criteria1:=">=" & StartDate, _
                                                Operator:=xlAnd, _
                                                Criteria2:="<=" & EndDate
    
    
    End Sub
    
    
    Function GetUserInputDate(ByVal promptPart As String) As Variant
    
        Dim temp As Variant
    
        Do
            temp = Application.InputBox("Enter " & promptPart & " date (ie. mm/dd/yyyy):", "Date?")
        Loop Until (temp = False) Or (IsDate(temp))
    
        GetUserInputDate = temp
    
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2011-08-23
      • 2022-09-23
      相关资源
      最近更新 更多