Page 1 of 1

VBA การใช้ AdvancedFilter ครับ

Posted: Sat Feb 13, 2016 5:13 pm
by DhitiBank
สวัสดีอาจารย์และเพื่อนๆ ครับ

ผมพยายามจะเขียนโค้ดกรองข้อมูลดิบจากชีท temp2 เอามาไว้ใน temp3 โดยมีเกณฑ์ที่ต้องการกรองคือ

1. ระหว่างวันที่ที่กำหนด (วันที่ในคอลัมน์ A) ค่าวันที่กำหนดไว้ในโค้ดครับ
2. DocType คอลัมน์ D เอาเฉพาะ SL และ CN
3. DocStat คอลัมน์ E ไม่เอา 0 และ 3

โดยกำหนดเกณฑ์ไว้แล้วในโค้ด บรรทัดที่ 11 ถึง 20 แต่ติดปัญหาคือ กรองแล้วไม่ได้อะไรเลยครับ ผมต้องกำหนดเกณฑ์อย่างไรครับ (ลองกำหนดเกณฑ์แค่วันที่อย่างเดียว กรองได้ แต่พอเพิ่ม DocType กับ DocStat เข้าไปด้วยก็ไม่ได้อะไรมาเลยครับ)
โค้ดอยู่ใน module1 ตามด้านล่างนี้ครับ

Code: Select all

Public Sub NetSale()
    Dim dDay1#, dDay2#, lRow&
    
    dDay1 = CDbl(DateSerial(2016, 2, 3))
    dDay2 = CDbl(DateSerial(2016, 2, 10)) + 0.99991
    
    'collect source data
    With ThisWorkbook
        .Sheets(3).Activate
        .Sheets(3).Cells.Clear
        .Sheets(3).Range("a1:b1") = .Sheets(2).Range("a1")
        .Sheets(3).Range("c1:d1") = .Sheets(2).Range("d1")
        .Sheets(3).Range("e1:f1") = .Sheets(2).Range("e1")
        With .Sheets(3)
            .Range("a2") = ">=" & dDay1
            .Range("b2") = "<=" & dDay2
            .Range("c2") = "SL"
            .Range("d2") = "CN"
            .Range("e2") = "<>0"
            .Range("f2") = "<>3"
        End With
        
        .Sheets(2).UsedRange.AdvancedFilter Action:=xlFilterCopy, _
            CriteriaRange:=.Sheets(3).Range("a1:f2"), _
            CopyToRange:=.Sheets(3).Range("a3"), Unique:=False
        .Sheets(3).Rows("1:2").Delete shift:=xlUp
        lRow = .Sheets(3).Range("a" & Rows.Count).End(xlUp).Row
        
        'exit if not data found
        If lRow = 1 Then
            MsgBox "ไม่มีข้อมูลในช่วงวันที่ " & Format(dDay1, "d mmm yy") & _
                " ถึง " & Format(dDay2, "d mmm yy"), vbExclamation, "Not Found"
            GoTo suddenEnd
        End If
    End With
    
suddenEnd:
End Sub

Re: VBA การใช้ AdvancedFilter ครับ

Posted: Sat Feb 13, 2016 5:46 pm
by snasui
:D ตัวอย่างการปรับ Code ครับ

Code: Select all

Public Sub NetSale()
    Dim dDay1#, dDay2#, lRow&
    
    dDay1 = CDbl(DateSerial(2016, 2, 3))
    dDay2 = CDbl(DateSerial(2016, 2, 10)) + 0.99991
    
    'collect source data
    With ThisWorkbook
        .Sheets(3).Activate
        .Sheets(3).Cells.Clear
        .Sheets(3).Range("a1:b1") = .Sheets(2).Range("a1")
        .Sheets(3).Range("c1") = .Sheets(2).Range("d1")
        .Sheets(3).Range("d1:e1") = .Sheets(2).Range("e1")
        With .Sheets(3)
            .Range("a2:a3") = ">=" & dDay1
            .Range("b2:b3") = "<=" & dDay2
            .Range("c2") = "SL"
            .Range("c3") = "CN"
            .Range("d2:d3") = "<>0"
            .Range("e2:e3") = "<>3"
        End With
        
        .Sheets(2).UsedRange.AdvancedFilter Action:=xlFilterCopy, _
            CriteriaRange:=.Sheets(3).Range("a1:e3"), _
            CopyToRange:=.Sheets(3).Range("a4"), Unique:=False
        .Sheets(3).Rows("1:3").Delete shift:=xlUp
        lRow = .Sheets(3).Range("a" & Rows.Count).End(xlUp).Row
        
        'exit if not data found
        If lRow = 1 Then
            MsgBox "ไม่มีข้อมูลในช่วงวันที่ " & Format(dDay1, "d mmm yy") & _
                " ถึง " & Format(dDay2, "d mmm yy"), vbExclamation, "Not Found"
            GoTo suddenEnd
        End If
    End With
    
suddenEnd:
End Sub

Re: VBA การใช้ AdvancedFilter ครับ

Posted: Sat Feb 13, 2016 8:18 pm
by DhitiBank
:o ถ้าเป็น "หรือ" ต้องไว้คนละบรรทัดนี่เอง ขอบพระคุณอาจารย์มากครับ :thup: