userform数据过滤器,如果没有数据则取消

时间:2016-08-22 15:18:48

标签: excel-vba excel-2010 vba excel

我正在尝试创建一个用户窗体来过滤/显示符合输入条件的工作表中的数据。 我已成功输入用户名和日期范围的字段,但是如果没有要显示的数据,我无法弄清楚如何创建硬停止。 例如,条件是没有数据的用户名或日期,而不是过滤数据表并且不显示任何内容,我希望取消操作,我可能会弹出一个msgbox。

这是我到目前为止所用的简单测试代码,我确实拥有它,以便在字段留空时不会过滤,这不是我的问题。

Private Sub CommandButton1_Click()
Dim DataRange As Range
Set DataRange = Range("datatable1")
Sheets("data").Visible = True
Sheets("data").Select


 If ComboBox1.Value = "" Or ComboBox1.Value = Null Then
AutoFilter = False
Else: DataRange.AutoFilter Field:=9, Criteria1:=ComboBox1.Value
End If

datefilter:
If TextBox1.Value = "" And TextBox2.Value = "" Then
AutoFilter = False
ElseIf TextBox2.Value = "" Then
DataRange.AutoFilter Field:=8, Criteria1:=">=" & TextBox1.Value, Operator:=xlAnd
ElseIf TextBox1.Value = "" Then
DataRange.AutoFilter Field:=8, Criteria1:="<=" & TextBox2.Value, Operator:=xlAnd
 Else: DataRange.AutoFilter Field:=8, Criteria1:=">=" & TextBox1.Value _
             , Operator:=xlAnd, Criteria2:="<=" & TextBox2.Value

End If
Unload Me


End Sub

真的很感激任何帮助。

1 个答案:

答案 0 :(得分:1)

我认为这可以满足您的需求。它应用非空白过滤器,如果没有数据可见,则关闭过滤器并显示消息:

Private Sub CommandButton1_Click()
Dim DataRange As Range

Set DataRange = Sheets("data").Range("datatable1")
Sheets("data").Visible = True
Sheets("data").Select

If ComboBox1.Value <> "" Then
    DataRange.AutoFilter Field:=9, Criteria1:=ComboBox1.Value
End If

If TextBox1.Value <> "" Then
    DataRange.AutoFilter Field:=8, Criteria1:=">=" & TextBox1.Value
End If

If TextBox2.Value <> "" Then
    DataRange.AutoFilter Field:=8, Criteria1:="<=" & TextBox2.Value
End If

If DataRange.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then
    'turn off filter
    DataRange.AutoFilter
    MsgBox "No matching data"
End If
Unload Me
End Sub

编辑:修改以使用结构化表(VBA ListObject)

在我们的评论讨论后,听起来像你的数据是在一个结构化的表格中。您可以通过单击数据中的单元格来确认。 “表格工具/设计”选项卡将显示在右侧的功能区中。该选项卡控件的最左侧是一个带有表名的框,在本例中为&#34; DataTable1。&#34;

enter image description here

正如您所注意到的,Excel会自动创建一个具有相同名称的范围,但它只包含数据,而不是标题。上面的代码失败了,因为没有返回任何内容的过滤器没有可见的数据单元格,而如果包含标题,它将有一行可见单元格,即标题行。

下面的代码设置对整个表的引用,对它应用自动过滤器并检查是否只有一个可见行:

Private Sub CommandButton1_Click()
Dim loDataTable1 As ListObject

Set loDataTable1 = Sheets("data").ListObjects("DataTable1")
Sheets("data").Visible = True
Sheets("data").Select

If ComboBox1.Value <> "" Then
    loDataTable1.Range.AutoFilter Field:=9, Criteria1:=ComboBox1.Value
End If

If TextBox1.Value <> "" Then
    loDataTable1.Range.AutoFilter Field:=8, Criteria1:=">=" & TextBox1.Value '
End If

If TextBox2.Value <> "" Then
    loDataTable1.Range.AutoFilter Field:=8, Criteria1:="<=" & TextBox2.Value '
End If

If loDataTable1.ListColumns(1).Range.SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then
    'turn off filter
    loDataTable1.Range.AutoFilter
    loDataTable1.ShowAutoFilter = True
    MsgBox "No matching data"
End If
Unload Me
End Sub