2016-08-22 18 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