Board logo

標題: [發問] 如何搜尋特定日期 [打印本頁]

作者: acdx    時間: 2015-9-8 17:36     標題: 如何搜尋特定日期

A1~A20皆為日期格式(例如2015/4/15),如何搜尋特定月份?
例如2015年6月
作者: 准提部林    時間: 2015-9-8 17:54

回復 1# acdx


問題描述太簡略,說不定回覆者打的字都比您多!^^
提出多一些不同實例並模擬出所要的結果看看,
最好上附檔吧!
作者: ikboy    時間: 2015-9-8 19:30

樓主的Excel版本是2010,用普通的篩選即可
作者: ML089    時間: 2015-9-9 09:33

回復 1# acdx

你可以做輔助欄
例如
A1是日期
B2公式 =MONTH(A1)
公式下刷

用B欄就能篩選月份
作者: acdx    時間: 2015-9-10 14:54

本帖最後由 acdx 於 2015-9-10 14:56 編輯

[attach]21948[/attach]
我寫了下列程式來搜尋特定日期的資料
  1. Sub 篩選()
  2. Dim St, Col, Ed As Integer

  3. Set DateRange = Worksheets(1).Range("A1").CurrentRegion.Columns(1)
  4. St = Range("A2").Row
  5. Col = DateRange.End(xlToRight).Column
  6. Ed = DateRange.End(xlDown).Row
  7. DateRange.EntireRow.Hidden = False

  8. For i = St To Ed
  9.     If Year(Cells(i, 1)) <> 2009 Then
  10.         Rows(i).EntireRow.Hidden = True
  11.     End If
  12. Next i
  13. End Sub
複製代碼
但是這程式執行的速度遠低於使用Excel內建的篩選功能,該如何寫才能達到內建篩選功能的速度?
[attach]21946[/attach]
作者: 准提部林    時間: 2015-9-10 16:29

回復 5# acdx


1.逐列處理(隱藏.刪除...等動作),速度必定慢,
  若遇不得不逐列執行動作,通常要加 Application.ScreenUpdating = False,關閉螢幕更新
2.內建功能必然有其更優化的處理方法,所以,儘量利用內建功能來處理資料
3.篩選有時沒有最簡便的方法,例如本題A欄為〔日期〕格式,若想只針對〔年〕或〔月〕篩選,
  得使用〔輔助欄公式〕較有效益。
 
以下為使用〔儲存格聯集〕方法,一次性隱藏列,Union 與按 Ctrl 跳選儲存格方法相同,
但最多可聯集多少個儲存格,尚未測試其極限,參考即可:
  1. Sub 篩選()
  2. Dim xR As Range, xU As Range
  3. Cells.EntireRow.Hidden = False
  4. For Each xR In Range([A2], Cells(Rows.Count, 1).End(3))
  5.   If Year(xR) <> 2009 Then If xU Is Nothing Then Set xU = xR Else Set xU = Union(xU, xR)
  6. Next
  7. If Not xU Is Nothing Then xU.EntireRow.Hidden = True
  8. End Sub
複製代碼
 
作者: 准提部林    時間: 2015-9-10 17:01

回復 5# acdx


6樓程式遇大資料,速度還是太慢,以下運用〔陣列+輔助欄〕,速度應可快些:
1.先以陣列存放檢測結果
2.將檢測結果放在F欄(或閒置任一欄也可),
  利用〔到.特殊.常數.數字〕,選取有效數字儲存格,再予以隱藏
 
  1. Sub 篩選2()
  2. Dim Arr, i&
  3. Cells.EntireRow.Hidden = False
  4. Arr = Range([A2], Cells(Rows.Count, 1).End(3))
  5. For i = 1 To UBound(Arr)
  6.   If Year(Arr(i, 1)) <> 2009 Then Arr(i, 1) = 1 Else Arr(i, 1) = ""
  7. Next i
  8. With [F2].Resize(UBound(Arr))
  9.   .Value = Arr
  10.   On Error Resume Next
  11.   .SpecialCells(xlCellTypeConstants, 1).EntireRow.Hidden = True
  12.   .Clear
  13. End With
  14. End Sub
複製代碼
 
作者: acdx    時間: 2015-9-10 18:00

回復 7# 准提部林
請問Cells(Rows.Count, 1).End(3)--->代表的是?為何是End(3)?
作者: 准提部林    時間: 2015-9-10 18:41

回復 8# acdx


End(3) 即是 End(xlUp)
有時〔常數〕可使用〔代碼〕,進 VBE 說明檔看看,其實這說明檔很好用,有很多範例,是學習的好所在!




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)