簡體   English   中英

Excel VBA日期時間篩選器隱藏除頂行以外的所有行

[英]Excel VBA Datetime Filter Hides All Rows Except Top Row

我每周都有不斷增長的數據集,並且僅需過濾過去7天的內容(每周從上周11:00 am更新)。 我想通過VBA自動化整個過程,但是正在努力使日期時間自動篩選器正常工作。 日期時間列看起來像這樣(dd-mm-yyyy時間):

日期時間列

我在VBA中使用以下代碼設置了自動過濾器:

Dim d1, d2, m1, m2, y1, y2 As Integer
Dim dt1, dt2 As String
d1 = Day(Date - 7)
d2 = Day(Date)
m1 = Month(Date)
y1 = Year(Date)
dt1 = d1 & "." & m1 & "." & y1
dt2 = d2 & "." & m1 & "." & y1

ActiveSheet.Range("$A$1:$CZ$99999").AutoFilter Field:=57, Criteria1:= _
    ">=" & dt1 & " 11:00", Operator:=xlAnd, Criteria2:="<=" & dt2

如果我讓代碼在工作表上運行,它將應用過濾器,但除第一行外,整個工作表都為空白,如下所示:

奇怪的空白結果

現在,當我在EXCEL中手動輸入自動過濾器功能以檢查應用了哪種過濾器時,它會完全按照我的意願顯示該過濾器,並在按下“確定”后將其實際應用並顯示正確的值:

篩選器正確

因此,代碼確實插入了正確的過濾器,但是將所有單元格留空,直到我在過濾器功能中手動按下“確定”為止。 如何解決此問題,以便代碼正確應用自動過濾器並自動顯示值?

我發現此問題似乎與EXCEL國家/地區版本有關。 我在德國的excel上,設置為英語。 但是我不知道這意味着什么以及如何解決該問題。

先謝謝您的幫助。

dt1 = d1 & "." & m1 & "." & y1
dt2 = d2 & "." & m1 & "." & y1

這些不是Date 您無法將它們與Date進行比較。

ActiveSheet.Range("$A$1:$CZ$99999").AutoFilter Field:=57, Criteria1:= _
    ">=" & dt1 & " 11:00", Operator:=xlAnd, Criteria2:="<=" & dt2

現在,這將嘗試過濾等於String"5.7.2019 11:00" 等於String"12.7.2019" Date值。 由於"5.7.2019 11:00"不等於"12.7.2019" ,因此永遠不會為True 由於Date值不是String值,因此True會更小

手動打開“過濾器”菜單時,它包含文本"12.7.2019""5.7.2019 11:00" 當您單擊“確定”時,它將解析這些內容,識別出它們應該是日期,然后將其轉換為Date 這樣就可以了。

您需要做的是在使用String之前將String轉換為Dates 我們還需要解決Microsoft Office以美國為中心的習慣,認為``12.7.2019''的意思是``2019年12月7 ''而不是``2019年7月12 '':

'VBA uses the same memory for Integer and Long, so always use Long
Dim d1 As Long, d2 As Long, m1 As Long, m2 As Long, y1 As Long, y2 As Long
'EVERY item on the row needs to be declared, not just the last one
'Any items without an "As" will default to Variant
Dim dt1 As Date, dt2 As Date

'Date is a horrible choice for a Variable name, because it is a built in Type
d1 = Day(Date - 7)
d2 = Day(Date)
m1 = Month(Date)
y1 = Year(Date)
'You forgot m2 and y2.  Very important on the 3rd January
m2 = Month(Date-7)
y2 = Year(Date-7)

'
dt1 = DateSerial(y1, m1, d1)
dt2 = DateSerial(y2, m2, d2)

'Why not just use entire columns "$A:$CZ"?
ActiveSheet.Range("$A$1:$CZ$99999").AutoFilter Field:=57, Criteria1:= _
    ">=" & cDbl(dt1 + TimeSerial(11,0,0)), Operator:=xlAnd, Criteria2:="<=" & cDbl(dt2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM