【问题标题】:Hide rows based on Date input根据日期输入隐藏行
【发布时间】:2015-05-12 09:49:52
【问题描述】:

我有一个工作表Data24h,其中填充了按日期排序的数据。

我想为用户创建仅显示特定日期的数据的功能。

所以我创建了一个UserForm,用户在textbox1 中输入一个日期,然后我希望程序隐藏不包含在日期间隔中的每一行。

隐藏功能似乎起作用,但条件不起作用。如果我将今天的日期作为 YYMMDD 作为输入,它仍将显示所有日期。

我是一般编程的新手,尤其是 VBA,如果问题有点含糊,我很可能是代码看起来像 #!!#@。

Private Sub CommandButton1_Click()
    Datum = TextBox1.Value
    Sheets("Data24h").Select
    BeginRow = "" 
    EndRow = 100 
    ChkCol = 3 

    For RowCnt = BeginRow To EndRow
        If Cells(RowCnt, ChkCol).Value >= Datum Then
            Cells(RowCnt, ChkCol).EntireRow.Hidden = True
        Else
            Cells(RowCnt, ChkCol).EntireRow.Hidden = False
        End If
    Next RowCnt

    Columns("A").Select 
    Unload Me 
    Återställ1.Show 
End Sub

所以我尝试使用 Autofilter 但仍然无法管理。现在我在“最后一个”自动筛选行中收到错误 1004。据我了解,我收到此错误是因为自动过滤器认为范围为空?

编辑:我做到了!自动过滤器解决了它!我只是错过了 := 在字段中。感谢大家的努力。

Private Sub CommandButton1_Click()

Dim Datum As Date
Dim Datum_l As Long

Sheets("Data24h").Select

Datum = CDate(Me.TextBox1.Value)

With Data24h
    AutoFilterMode = False
    Selection.Range("A2:A100").AutoFilter
    Selection.Range("A2:A100").AutoFilter Field = 1, Criteria1:=">=" & Datum

End With

【问题讨论】:

  • 你的声明在哪里?你试过调试吗?
  • 使用Autofilter 将是一个非常简单的方法。它可以按特定日期(今天、昨天、3 月 1 日)或日期范围(上个月、本季度、3 月 1 日至 3 月 14 日)过滤您的数据。
  • 单元格和列的集合在这里并没有立即显示出轴承或引用(除非它们在方法之外声明)。您可能想尝试添加 THISWORKBOOK.WORKSHEETS("SHEET1").CELLS 而不仅仅是 CELLS。列也是如此。另外,你不能在这里使用 Excel 的内置过滤 - 你需要 VBA 吗?
  • 我一直在研究 Autofilter 但也无法让它工作。也许这更好?在最坏的情况下,我将使用内置过滤,但我想这会迫使程序的操作员能够过滤它?

标签: excel vba


【解决方案1】:

首先为基准变量添加一个声明 (Dim Datum As Date)
Next 将日期改写为 Datum = CDate(TextBox1.Value)

这只是为了让您入门。它可以更好地比较文本框中的值和单元格中的值(假设单元格中的值是真实日期)

【讨论】:

  • 谢谢! CDate 似乎是正确的方法,另一张表中的单元格格式为日期。但是比较还是不行。
【解决方案2】:

试试这个代码,我添加了CDate() 函数来将数据转换为类型化的日期可能会缓解这个问题,但你可能需要检查人们可以输入到您的文本框中的输入值。

Private Sub CommandButton1_Click()
    Dim Datum As Date, _
        BeginRow As Integer, _
        EndRow As Double, _
        ChkCol As Integer, _
        Ws As Worksheet

    Set Ws = Sheets("Data24h")
    Datum = CDate(Me.TextBox1.Value)
    BeginRow = 1
    EndRow = Ws.Range(Rows.Count).End(xlUp).Row
    ChkCol = 3

    For RowCnt = BeginRow To EndRow
        If CDate(Ws.Cells(RowCnt, ChkCol).Value) >= Datum Then
            Ws.Rows(RowCnt).EntireRow.Hidden = True
        Else
            Ws.Rows(RowCnt).EntireRow.Hidden = False
        End If
    Next RowCnt

    'Columns("A").Select
    Unload Me
    Återställ1.Show
End Sub

【讨论】:

  • 感谢您的回答!我认为 Cdate() 是正确的方法,但我仍然无法让它工作。工作表 Data24h 中的单元格定义为 Date 。将基准打印到单元格中时,它以 YYYY-MM-DD 格式显示为输入日期,但输入值与现有单元格之间的比较似乎仍然不起作用。
  • 最好的办法是在文本框旁边的标签中提供一些您想要的格式的详细信息,因为日期可以以多种不同的方式进行格式化!您是否尝试过在文本框中使用格式清晰的日期?
  • 我希望操作员以 YYYY-MM-DD 格式给出日期。虽然我还没有定义它,但我的文本框看起来就像这样: Private Sub TextBox1_Change() End Sub Edit: 设法快速按下返回。好像我无法在此评论中添加任何代码?对于那个很抱歉。问题是我没有定义我想要从文本框中输入什么样的输入吗?
  • 检查是否有约会最简单的方法是使用IsDate() 函数,之后它会更重。为了让使用您的工具的人更加敏感,请在靠近您的TextBoxLabel 中指定您想要的格式。要进行调试,请使用 MsgBoxChr(13) 而不是 Excel 中可能会重新格式化您的数据的单元格,因此将两者都显示在其中,并用 Chr(13) 分隔。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 2020-04-30
  • 2020-05-29
  • 1970-01-01
  • 2017-06-27
相关资源
最近更新 更多