[Giúp đỡ] Liệt kê công việc quá hạn trong danh sách

Liên hệ QC

quyenpv

Thu nhặt kiến thức
Tham gia
5/1/13
Bài viết
719
Được thích
97
Giới tính
Nam
Nghề nghiệp
Decode cuộc đời!
Dear anh chị!
Nhờ anh chị giúp em code liệt kê các công việc trong Sheet "Data" quá hạn so với ngày hiện tại, em mò code nhưng chạy không đúng
1. Liệt kê theo danh mục công việc được tô đạm
1598946737433.png
2. Sắp xếp theo tên từng cá nhân phụ trách công việc đó

Mong anh chị xem và giúp đỡ ạ, nếu được cho em xin code luôn phần gửi email nữa ạ

Mã:
Option Explicit
Option Private Module

Sub Run_BB_HetHan_SapHet()

    Dim i, k, kk, ar, Arr_SapHetHan, Arr_HetHan
    Dim Nguon, Dong
    Dim LastRow_HH, LastRow_SHH
    Dim xRgDateVal As String
    
    On Error Resume Next
    
    With Sheets("Data")
        Dong = .Range("B3").End(xlDown).Row
        Nguon = .Range("A563", "O" & Dong)                          'Cot cuoi cung tai Sheet Input_TB
        Dong = UBound(Nguon)
    End With

    ReDim Arr_SapHetHan(1 To Dong, 1 To 12)
    ReDim Arr_HetHan(1 To Dong, 1 To 12)

    'Chay kiem tra dau viec sap het han
    For i = 1 To Dong
        
        If CDate(Nguon(i, 7)) - Date <= 7 Then ' And CDate(Nguon(i, 7)) - Date > 0 Then
            k = k + 1
            Arr_SapHetHan(k, 1) = k
            Arr_SapHetHan(k, 2) = Nguon(i, 5)
            Arr_SapHetHan(k, 3) = Nguon(i, 1)
            'Arr_SapHetHan(k, 4) = Nguon(i, 4)          'Ten VTTB
            Arr_SapHetHan(k, 5) = Nguon(i, 4)          'Ma VT
            Arr_SapHetHan(k, 6) = Nguon(i, 6)          'So luong nghiem thu
            Arr_SapHetHan(k, 7) = Nguon(i, 7)
'            Arr_SapHetHan(k, 8) = Nguon(i, 7) - Date

            'Don gia
            Arr_SapHetHan(k, 9) = Nguon(i, 8)          'Don gia
            Arr_SapHetHan(k, 10) = Nguon(i, 9)          'Don gia
            Arr_SapHetHan(k, 11) = Nguon(i, 10)          'Don gia
        End If

    Next i

    Sheets("Baocao").Select

    With Sheets("Baocao")
'        .Range("A6").Resize(k, 12).Value = Arr_HetHan
        LastRow_SHH = Sheets("Baocao").Cells(Rows.Count, "D").End(xlUp).Row
        .Range("B" & LastRow_SHH + 1).Formula = "CONG VIEC SAP HET HAN"

        If k Then
            .Range("A" & LastRow_SHH + 2).Resize(k, 12).Value = Arr_SapHetHan
        End If

        '      .Range("C3:F" & 12 + k - 1).WrapText = 1
        '      .Range("C3:F" & 12 + k - 1).HorizontalAlignment = xlJustify
        '      .Range("A12:M" & 12 + k - 1).Font.Bold = False
'        .Range("A4").Resize(kk, 12).Borders.LineStyle = 1

        '      .Range("H12:J" & 12 + k + 1).NumberFormat = "#,##0.00"
        '      .Range("J" & 12 + k + 1).Formula = "=SUBTOTAL(9,J12:J" & 12 + k & ")"
        'Can chinh
        '      .Rows("12:" & LastRow - 1 & "").RowHeight = 35
        '      .Rows("" & LastRow & ":" & LastRow + 4 & "").RowHeight = 23
        .PageSetup.PrintArea = "$A$1:$L" & LastRow_SHH + 4 & ""
    End With

End Sub
 

File đính kèm

  • Help_Cong viec qua han.xlsm
    1.8 MB · Đọc: 16
ví dụ thời hạn của bạn nằm ở cột G thì cho vòng lập for i chạy từ 0 đến dòng cuối của cột G, nếu cells(i,7) > format(date,"dd/mm") thì làm gì đó
 
Upvote 0
Nội dung số 1, liệt kê các công việc bị quá hạn.
Sao bạn không dùng Conditional Format (như đã làm ở cột % hoàn thành), cần chi code đâu nhỉ?
 
Upvote 0
ví dụ thời hạn của bạn nằm ở cột G thì cho vòng lập for i chạy từ 0 đến dòng cuối của cột G, nếu cells(i,7) > format(date,"dd/mm") thì làm gì đó
Nội dung số 1, liệt kê các công việc bị quá hạn.
Sao bạn không dùng Conditional Format (như đã làm ở cột % hoàn thành), cần chi code đâu nhỉ?
Dạ trong file đính kèm em có ví dụ code và mẫu đó ạ, nhưng chạy không đúng
 
Upvote 0
Sao bạn không thử dùng Advanced Filter nhỉ?
Code thực sự đơn giản, vài dòng, không như cả rừng code kia.
Ở Sheet BaoCao: tôi tạm bỏ cột ngày, và đổi tên cột Ghi chú thành Ghi chú công văn liên quan.
Với điện lọc là: =AND((TODAY()-Data!$G4)>0,ISNUMBER(Data!$A3))
Cái chỗ >0, bạn có thể thay bằng số khác, 7 ngày so với ngày hôm nay vẫn coi là trong hạn thì thay bằng 7.

Bạn mở File, clcik nút cập nhật ở sheet BaoCao

Còn nếu Form báo cáo bắt buộc đúng theo của bạn thì cũng có thể làm được, tuy nhiên thay đổi được 1 chút thôi, mọi thứ sẽ đơn giản hơn bao nhiêu. (code chỉ vài dòng bằng việc record macro)
 

File đính kèm

  • Help_Cong viec qua han.xlsm
    2.1 MB · Đọc: 21
Upvote 0
Sao bạn không thử dùng Advanced Filter nhỉ?
Code thực sự đơn giản, vài dòng, không như cả rừng code kia.
Ở Sheet BaoCao: tôi tạm bỏ cột ngày, và đổi tên cột Ghi chú thành Ghi chú công văn liên quan.
Với điện lọc là: =AND((TODAY()-Data!$G4)>0,ISNUMBER(Data!$A3))
Cái chỗ >0, bạn có thể thay bằng số khác, 7 ngày so với ngày hôm nay vẫn coi là trong hạn thì thay bằng 7.

Bạn mở File, clcik nút cập nhật ở sheet BaoCao

Còn nếu Form báo cáo bắt buộc đúng theo của bạn thì cũng có thể làm được, tuy nhiên thay đổi được 1 chút thôi, mọi thứ sẽ đơn giản hơn bao nhiêu. (code chỉ vài dòng bằng việc record macro)
Có thể do vô tình hay thêm bớt cột mà không để ý cột điều kiện lọc, anh cho em mấy dòng code để tránh điều em nêu lúc nãy với ạ
 
Upvote 0
Có thể do vô tình hay thêm bớt cột mà không để ý cột điều kiện lọc, anh cho em mấy dòng code để tránh điều em nêu lúc nãy với ạ
Bạn mở file, view code đi.
Đây chỉ là code advanced filter. Nếu tinh gọn nữa chỉ đúng 1 dòng.
hãy thử tìm hiểu trước advanced filter xem sao
Chúc thành công !
 
Upvote 0
Bạn mở file, view code đi.
Đây chỉ là code advanced filter. Nếu tinh gọn nữa chỉ đúng 1 dòng.
hãy thử tìm hiểu trước advanced filter xem sao
Chúc thành công !
Trường hợp mình muốn lấy cả tiêu đề từng mảng công việc có được không anh. Nhờ anh chỉ giúp em với ạ
 
Upvote 0
bạn vào developer chọn record macro nhé, xong thao tác theo cách mình muốn máy tính sẽ tự động chuyển sang code giúp bạn, chọn stop dừng ghi code sẽ đc thêm vào module
 
Upvote 0
Trường hợp mình muốn lấy cả tiêu đề từng mảng công việc có được không anh. Nhờ anh chỉ giúp em với ạ
ở bảng điều kiện lọc, ô M2 sheet BaoCao, bạn sử điều kiện công thức thành: =(TODAY()-Data!$G3)>0
xong chạy cập nhật xem có đúng ý bạn không?
 
Upvote 0
Thanks anh nhiều! Đúng rồi ạ
Tôi chỉ góp ý thêm, 1 cơ sở dữ liệu chuẩn không nên để đầu mục công việc như vậy, bạn có thể đưa hẳn đầu mục công việc vào 1 trường (cột) mới.
Như vậy, khi bạn thống kê theo đầu mục công việc (hay bất kỳ tiêu chí nào) cũng dễ.
 
Upvote 0
Tôi chỉ góp ý thêm, 1 cơ sở dữ liệu chuẩn không nên để đầu mục công việc như vậy, bạn có thể đưa hẳn đầu mục công việc vào 1 trường (cột) mới.
Như vậy, khi bạn thống kê theo đầu mục công việc (hay bất kỳ tiêu chí nào) cũng dễ.
AdvanceFilter chạy rất nhanh, tuy nhiên cái này không biến tấu theo ý mình trong Sheet báo cáo được mà các cột bắt buộc phải giống nhau giữa các Sheet

Ý tưởng ban đầu của em sẽ lọc danh sách công việc của hạn của từng người sau đó gửi email cảnh báo nhắc nhở công việc
Trong email phần body sẽ có nội dung công việc chậm tiến độ + file đính kèm
Nếu có thể anh giúp em với để em có thể thêm hoặc sửa nội dung cột tùy theo ý mình ạ
Em cám ơn anh nhiều
 
Upvote 0
AdvanceFilter chạy rất nhanh, tuy nhiên cái này không biến tấu theo ý mình trong Sheet báo cáo được mà các cột bắt buộc phải giống nhau giữa các Sheet

Ý tưởng ban đầu của em sẽ lọc danh sách công việc của hạn của từng người sau đó gửi email cảnh báo nhắc nhở công việc
Trong email phần body sẽ có nội dung công việc chậm tiến độ + file đính kèm
Nếu có thể anh giúp em với để em có thể thêm hoặc sửa nội dung cột tùy theo ý mình ạ
Em cám ơn anh nhiều
Chỉ cần tên trường giống nhau, còn vị trí thì bạn thích đảo thế nào cũng được mà. Bạn thử đảo vị trí các trường ở sheet Baocao, rồi chạy cập nhật xem sao.
 
Upvote 0
Vậy dùng Advanced Filter đã đáp ứng được yêu cầu của bạn trong bài này chưa?
Hay bạn vẫn muốn dùng code, bản chất mà dùng code thì cũng chỉ là bài toán lọc mà thôi (vòng lặp chạy cả bảng có khi còn nhọc hơn).
nếu được như tôi cũng góp ý, ở phần Data cần cơ cấu lại cho chuẩn cơ sở dữ liệu, như: đầu mục công việc (A,B,C...) cho vào một cột/trường mới. Còn định nghĩa A,B,C... là gì có thể đưa vào 1 bảng khác...
khi các trường đầy đủ, dùng Pivot Table cũng có thể cho ra báo cáo theo đầu mục công việc.
Như thế cũng chưa cần đến code j cả, tập trung thời gian đôn đốc tránh quá hạn thôi.
Chúc bạn thành công !!!
 
Upvote 0
Vậy dùng Advanced Filter đã đáp ứng được yêu cầu của bạn trong bài này chưa?
Hay bạn vẫn muốn dùng code, bản chất mà dùng code thì cũng chỉ là bài toán lọc mà thôi (vòng lặp chạy cả bảng có khi còn nhọc hơn).
nếu được như tôi cũng góp ý, ở phần Data cần cơ cấu lại cho chuẩn cơ sở dữ liệu, như: đầu mục công việc (A,B,C...) cho vào một cột/trường mới. Còn định nghĩa A,B,C... là gì có thể đưa vào 1 bảng khác...
khi các trường đầy đủ, dùng Pivot Table cũng có thể cho ra báo cáo theo đầu mục công việc.
Như thế cũng chưa cần đến code j cả, tập trung thời gian đôn đốc tránh quá hạn thôi.
Chúc bạn thành công !!!
Em muốn dùng code anh, nếu có thể anh giúp em ạ
Bài đã được tự động gộp:

Vậy dùng Advanced Filter đã đáp ứng được yêu cầu của bạn trong bài này chưa?
Hay bạn vẫn muốn dùng code, bản chất mà dùng code thì cũng chỉ là bài toán lọc mà thôi (vòng lặp chạy cả bảng có khi còn nhọc hơn).
nếu được như tôi cũng góp ý, ở phần Data cần cơ cấu lại cho chuẩn cơ sở dữ liệu, như: đầu mục công việc (A,B,C...) cho vào một cột/trường mới. Còn định nghĩa A,B,C... là gì có thể đưa vào 1 bảng khác...
khi các trường đầy đủ, dùng Pivot Table cũng có thể cho ra báo cáo theo đầu mục công việc.
Như thế cũng chưa cần đến code j cả, tập trung thời gian đôn đốc tránh quá hạn thôi.
Chúc bạn thành công !!!
Em muốn dùng code anh, nếu có thể anh giúp em ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy chạy code này, trúng thì trúng không trúng thì trượt vây

Mã:
Sub BaoCao()
On Error Resume Next
Dim i&, Data(), KQ()
Data = Range(Sheets("Data").[A4], Sheets("Data").[A10000].End(3)).Resize(, 15)
ReDim KQ(1 To UBound(Data), 1 To 11)
For i = 1 To UBound(Data)
    If Data(i, 7) - Date < 0 And IsNumeric(Data(i, 1)) Then
        k = k + 1
        KQ(k, 1) = Data(i, 1)
        KQ(k, 2) = Data(i, 6)
        KQ(k, 3) = Data(i, 2)
        KQ(k, 4) = Data(i, 3)
        KQ(k, 5) = Data(i, 4)
        KQ(k, 6) = Data(i, 5)
        KQ(k, 7) = Data(i, 7)
        KQ(k, 8) = Data(i, 7) - Date
        KQ(k, 9) = Data(i, 8)
        KQ(k, 10) = Data(i, 9)
        KQ(k, 11) = Data(i, 10)
    End If
Next
Sheets("BaoCao").[A5].Resize(i - 1, 11) = KQ
Sheets("BaoCao").[A4:L10000].Sort [B4], 1, Header:=xlYes
End Sub
P/S: đọc cái rừng code ở bài #1 tôi cũng không hiểu gì luôn.
 

File đính kèm

  • Help_Cong viec qua han.xlsm
    2.1 MB · Đọc: 23
Upvote 0
Thanks anh. Trúng rồi ạ
Em cám ơn anh nhiều
 
Upvote 0
Vậy chạy code này, trúng thì trúng không trúng thì trượt vây

Mã:
Sub BaoCao()
On Error Resume Next
Dim i&, Data(), KQ()
Data = Range(Sheets("Data").[A4], Sheets("Data").[A10000].End(3)).Resize(, 15)
ReDim KQ(1 To UBound(Data), 1 To 11)
For i = 1 To UBound(Data)
    If Data(i, 7) - Date < 0 And IsNumeric(Data(i, 1)) Then
        k = k + 1
        KQ(k, 1) = Data(i, 1)
        KQ(k, 2) = Data(i, 6)
        KQ(k, 3) = Data(i, 2)
        KQ(k, 4) = Data(i, 3)
        KQ(k, 5) = Data(i, 4)
        KQ(k, 6) = Data(i, 5)
        KQ(k, 7) = Data(i, 7)
        KQ(k, 8) = Data(i, 7) - Date
        KQ(k, 9) = Data(i, 8)
        KQ(k, 10) = Data(i, 9)
        KQ(k, 11) = Data(i, 10)
    End If
Next
Sheets("BaoCao").[A5].Resize(i - 1, 11) = KQ
Sheets("BaoCao").[A4:L10000].Sort [B4], 1, Header:=xlYes
End Sub
P/S: đọc cái rừng code ở bài #1 tôi cũng không hiểu gì luôn.
Dear anh!
Có cách nào mình lọc theo tên từng người trước được không anh
 
Upvote 0
Web KT

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

Back
Top Bottom