2016-08-22 44 views
0

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

下面是我到目前为止放在一起的简单测试代码,我确实这样做,以便它不会过滤如果该字段留空以便不是我的问题。

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 

真的很感谢任何帮助。

+0

只是一个想法入手:第一应用过滤器,然后检查如果仍然有可见的数据,并使用它来决定是否显示工作表“数据”或msgbox。 – Jochen

+0

@jochen,我们都这么想。这几乎是我编码的东西。 –

回答

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)

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

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 
+0

我收到调试器弹出窗口,并且没有找到单元格。 – Awill

+0

什么行? datatable1的地址是什么?它是否包含标题? –

+0

line:*如果DataRange.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count = 1那么*我假设它包含头引用整个数据表时,但我不确定。我试图通过过滤表中未找到的日期来测试它。 – Awill