Lọc hàng trùng có điều kiện theo ngày

Liên hệ QC

trangnh185

Thành viên mới
Tham gia
23/2/12
Bài viết
4
Được thích
0
chào các bác!
em có cái bảng tính này gồm 1 sheet là nhập hàng, 1 sheet là bán hàng, yêu cầu là làm thế nào để tính được các mã hàng đó từ ngày nhập đầu tiên đến ngày bán cuối cùng là bao nhiêu ngày để biết đc hàng nào bán nhanh mã nào bán chậm ạ. em cảm ơn các bác nhiều
 

File đính kèm

Định làm cho bạn tham khảo bằng VBA, nhưng nhìn lại các cột ghi ngày tháng thì hỡi ôi!

Một số thì theo hệ Mẽo; Còn lại thì theo hệ bọn Fáp (???)

Tạm chờ ý tưởng của bạn vậy!
 
hic, cái này là chiết xuất từ phần mềm ra mà chả hiểu sao nó lại bị thế, mình toàn phải thủ công ngồi đổi từng ngày 1, chưa có giải pháp nào cả. theo gợi ý đc giao thì thấy bảo lấy ngày nhập đầu tiên và ngày bán cuối cùng trừ đi nhau, thằng nào lớn thì chậm, thằng nào bé thì nhanh. cơ mà em dùng vlookup để lọc thì gặp phải tình trạng là 1 mã hàng mà bán trong nhiều ngày khác nhau thì nó chỉ nhận 1 ngày đầu tiên thui, làm sao để nhó lọc theo mã hàng và theo ngày bán giờ ạ. các cao thủ giúp em với ạ. mới nhận việc mà hỏi thì ma cũ hổng chỉ cho. trăm sự nhờ các bác ạ.
 
Còn nhiều việc fải làm với file này lắm!

Trước tiên là mình sẽ giúp bạn đổi các chuỗi ngày thành ngày
Khi nào xong mình gởi lên bạn tham khảo;

Giờ rãnh rỗi xem tạm tên này:
 
Lần chỉnh sửa cuối:
Bạn xem file này & cho vài í kiến.
 

File đính kèm

huhu, bác ơi, em xem bài bác giải và xem công thức bác đặt rồi và em có 1 thắc mắc là cái ngày nhập đầu và ngày bán cuối bác lấy kiều gì để ra dc số liệu mà dùng vào hàm để ra D1 và D2 ạ. mong bác giải thích rõ hơn ạ.
 
Công thức tại ô [O4] là
=IF(K4="",0,IF(TYPE(MONTH(K4))=16,CVDate(K4),K4))

tạm dịch như sau:

Nếu [K4] mà "không có gì" thì trả về cũng là "không có gì";
Còn nếu xài hàm lấy tháng mà lỗi, thì dùng hàm tự tạo để chuyển đổi;
Nếu nó là trị kiểu ngày (hệ Mỹ) thì hiện lên.

Nội dung hàm tự tạo bạn sẽ thấy trong cửa sổ VBE:
[thongBao]
[/thongBao]
[thongBao]
PHP:
Option Explicit
Function CVDate(StrC As String)
 Const FC As String = "/"
 Dim Ng As Byte, Th As Byte, Nam As Integer, J As Byte, VT As Byte
 
 For J = 1 To 2
    VT = InStr(StrC, FC)
    If J = 1 Then
        Ng = CByte(Left(StrC, VT - 1))
        StrC = Mid(StrC, VT + 1, 9)
    Else
        Th = CByte(Left(StrC, VT - 1))
        Nam = CInt(Right(StrC, 4))
    End If
 Next J
 CVDate = DateSerial(Nam, Th, Ng)
End Function
[/thongBao]
 
Công thức tại ô [O4] là
=IF(K4="",0,IF(TYPE(MONTH(K4))=16,CVDate(K4),K4))

tạm dịch như sau:

Nếu [K4] mà "không có gì" thì trả về cũng là "không có gì";
Còn nếu xài hàm lấy tháng mà lỗi, thì dùng hàm tự tạo để chuyển đổi;
Nếu nó là trị kiểu ngày (hệ Mỹ) thì hiện lên.

Nội dung hàm tự tạo bạn sẽ thấy trong cửa sổ VBE:
[thongBao]
[/thongBao]
[thongBao]
PHP:
Option Explicit
Function CVDate(StrC As String)
 Const FC As String = "/"
 Dim Ng As Byte, Th As Byte, Nam As Integer, J As Byte, VT As Byte
 
 For J = 1 To 2
    VT = InStr(StrC, FC)
    If J = 1 Then
        Ng = CByte(Left(StrC, VT - 1))
        StrC = Mid(StrC, VT + 1, 9)
    Else
        Th = CByte(Left(StrC, VT - 1))
        Nam = CInt(Right(StrC, 4))
    End If
 Next J
 CVDate = DateSerial(Nam, Th, Ng)
End Function
[/thongBao]
dạ cảm ơn bác đã giải thích rõ hơn về công thức, nhưng em vẫn chưa rõ là số liệu ở ô K4 thì lấy thế nào ạ.??? hic, đầu óc chậm tiến nó khổ thế đó ạ.
 
Dạ, nhưng em vẫn chưa rõ là số liệu ở ô K4 thì lấy thế nào ạ.??? hic, đầu óc chậm tiến nó khổ thế đó ạ.

[thongbao] Các trị thuộc cột [K..N] có được là do macro sau:
PHP:
Sub GPE()
 Dim Cls As Range, Sh As Worksheet, Rg1 As Range, Rg0 As Range, Rg As Range
 Dim MyAdd As String:           Dim J As Long
  
 Sheets("Ban").Select
 Set Sh = ThisWorkbook.Worksheets("Nhap")
 Set Rg1 = Sh.Range(Sh.[b1], Sh.[b1].End(xlDown))
 Set Rg0 = Range([b1], [b1].End(xlDown))
 J = [J4].End(xlDown).Row
 [k4].Resize(J, 4).ClearContents
 For Each Cls In Range([J4], [J4].End(xlDown))
    J = 0
    Set Rg = Rg1.Find(Cls.Value, , xlFormulas, xlWhole)
    If Not Rg Is Nothing Then
        MyAdd = Rg.Address
        Do
            J = J + 1
            With Cls.Offset(, 1)
                If J = 1 Then
                    .Resize(, 2).Value = Rg.Offset(, 1).Resize(, 2).Value
                ElseIf J > 1 Then
                    .Interior.ColorIndex = 34 + J
                End If
            End With
            Set Rg = Rg1.FindNext(Rg)
        Loop While Not Rg Is Nothing And Rg.Address <> MyAdd
    End If
'   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   '
    J = 0
    Set Rg = Rg0.Find(Cls.Value)
    If Not Rg Is Nothing Then
        MyAdd = Rg.Address
        Do
            J = J + 1
            With Cls.Offset(, 3).Resize(, 2)
                .Value = Rg.Offset(, 1).Resize(, 2).Value
                If J > 1 Then .Interior.ColorIndex = 34 + J
            End With
            Set Rg = Rg0.FindNext(Rg)
        Loop While Not Rg Is Nothing And Rg.Address <> MyAdd
    End If
 Next Cls
End Sub
[/thongbao]
 
ban phai chon ma hang roi dung hamg dsum de tinh so luong ban và luong nhap de tinh hang ton kho
 
Web KT

Bài viết mới nhất

Back
Top Bottom