2015-11-30 31 views
0

我嘗試通過表單(Periode)上的組合框來讓人們選擇2個日期來在特定時間段內搜索數據。所選日期被用作在數據內搜索的選擇標準。我通過這段代碼:正確接管日期以選擇搜索條件

Private Sub Datumok_Click() 
Dim AA1 As String 
Dim AA2 As String 
Dim AA3 As String 
Dim AA4 As String 
Dim AA5 As String 
Dim AA6 As String 
Dim LastRow As Single 

AA1 = Me.dag1.Value 
AA2 = Me.maand1.Value 
AA3 = Me.jaar1.Value 
AA4 = Me.dag2.Value 
AA5 = Me.maand2.Value 
AA6 = Me.jaar2.Value 

Application.ScreenUpdating = False 

Sheets("Feuil2").Select 
LastRow = Cells(Rows.Count, "a").End(xlUp).Row 
Sheets("Start").Range("F7") = AA2 & "-" & AA1 & "-" & AA3 
Sheets("Start").Range("G7") = AA5 & "-" & AA4 & "-" & AA6 
Sheets("Start").Range("F8") = AA1 & "-" & AA2 & "-" & AA3 
Sheets("Start").Range("G8") = AA4 & "-" & AA5 & "-" & AA6 
Unload Periode 
Sheets("Feuil2").Select 
ActiveSheet.AutoFilterMode = False 
Range(Cells(1, 1), Cells(LastRow, 10)).Select 
Selection.AutoFilter 
ActiveSheet.Range(Cells(2, 3), Cells(LastRow, 3)).AutoFilter Field:=3,      ActiveSheet.Range(Cells(2, 3), Cells(LastRow, 3)).AutoFilter Field:=3, Criteria1:=">=" & Sheets("Start").Range("F8"), Operator:=xlAnd, Criteria2:="<=" & Sheets("Start").Range("G8") 
Cells(1, 1).Select 
Sheets("Start").Select 
Cells(8, 5).Value = "Ok" 

'Wel blad updaten 
Application.ScreenUpdating = True 
End Sub 

有點討厭的代碼也許。選擇放到一個單元格中,這兩個單元格用作選擇標準。 有時候,vba或Excel不會接管日期,但是當我在過濾器中手動執行時,它會工作。有人知道如何改進代碼,它始終有效嗎?

+1

請閱讀[如何問](http://stackoverflow.com/help/how-to-ask)。在這篇文章中你甚至都沒有提出任何問題! –

+0

爲什麼在F7,G7,F8和G8中使用兩種不同格式的日期? – ZygD

+0

好問題。這是英國日期(用於過濾器)和(荷蘭)日期顯示給用戶的區別。 – Helfenstein

回答

1

好的第一步是消除所有.Select聲明並直接處理所需的對象。

下一步是刪除代碼中的3個(我認爲).AutoFitler聲明並僅使用一個聲明。我已經重構了一下你的代碼(並且放了一些註釋,以便我可以顯示我對代碼的解釋)。

Private Sub Datumok_Click() 

Dim AA1 As String 
Dim AA2 As String 
Dim AA3 As String 
Dim AA4 As String 
Dim AA5 As String 
Dim AA6 As String 
Dim sSE As String 
Dim sEE As String 
Dim LastRow As Single 

'start date 
AA1 = Me.dag1.Value 'day 
AA2 = Me.maand1.Value 'month 
AA3 = Me.jaar1.Value 'year 

'end date 
AA4 = Me.dag2.Value 'day 
AA5 = Me.maand2.Value 'month 
AA6 = Me.jaar2.Value 'year 

Application.ScreenUpdating = False 

With Sheets("Start") 
    .Range("F7") = AA2 & "-" & AA1 & "-" & AA3 
    .Range("G7") = AA5 & "-" & AA4 & "-" & AA6 
    .Range("F8") = AA1 & "-" & AA2 & "-" & AA3 
    sSE = .Range("F8").Value2 
    .Range("G8") = AA4 & "-" & AA5 & "-" & AA6 
    sEE = .Range("G8").Value2 
End With 

Unload Periode 

With Sheets("Feuil2") 

    .AutoFilterMode = False 
    LastRow = .Cells(.Rows.Count, "a").End(xlUp).Row 

    'filters columns A(1) through J(10) ... adjust based on your needs 
    .Range(Cells(1, 1), Cells(LastRow, 10)).AutoFilter Field:=3, Criteria1:=">=" & sSE, Operator:=xlAnd, Criteria2:="<=" & sEE 

End With 

With Sheets("Start") 
    .Select 
    .Cells(8, 5).Value = "Ok" 
End With 

'Wel blad updaten 
Application.ScreenUpdating = True 

End Sub 
+0

你爲什麼使用with/end和part?其餘的你是對的。唯一奇怪的是,sSE是一個數字(42005),sEE是一個日期(30/11/2015),我無法弄清楚爲什麼(據我所知,兩個單元格在Excelsheet上都是日期格式)。 – Helfenstein

+0

'帶塊'允許更快的處理(並且更容易讀取IMO碼)。數字'42005'只是Excel日期值格式中的日期。日期'30/11/2015'在美國的日期不被識別,所以根據您的地區設置,它可能不會將其識別爲實際日期(這只是給您的字符串)。 –

+0

sSE = CDate(.Range(「F8」)。Value2) sEE = CDate(.Range(「G8」)。Value2) 更正日期部分,但過濾器會拋出'1004'錯誤。 – Helfenstein