Điền x và Bảng liệu theo nhiều điều kiện

Liên hệ QC

Excel365

Thành viên tích cực
Tham gia
29/10/10
Bài viết
865
Được thích
127
Giới tính
Nam
Chào các Anh, chị
Hiện đang dùng công thức sau để đánh x vào bảng chấm công.
Mã:
Function Ngay(MSNV As Variant, NgayChamCong As Date, Thu As String) As Variant
    Dim NgayHS As Date
    Dim CSDL As Range:     Set CSDL = Range("DATA")
    NgayHS = Application.WorksheetFunction.VLookup(MSNV, CSDL, 3)
        If CDate(NgayHS) <= CDate(NgayChamCong) And Thu <> "CN" Then
            Ngay = "x"
        Else
            Ngay = ""
           End If
End Function

Nay em muốn bổ sung thêm điều kiện sau:
Dựa vào cột Ngày công ban đầu, đánh x sao cho tổng x = Tổng ngày công ban đầu, với điều kiện.
1. Không đánh x những ngày nghỉ việc riêng (Dựa vào Bảng nghỉ việc riêng).
2. Không đánh x những ngày chủ nhật

* Nếu trường hợp bên nghỉ việc riêng không có tên thì vẫn đánh x cho Tổng x vẫn bằng Tổng ngày công ban đầu
P/s:
Do sơ ý, em quên diễn tả thêm ý: đánh x phải sau ngày nhận hồ sơ.
VD: Trường hợp của Nguyễn Hoài Khanh, ngày nhận hồ sơ là 12/8/2019, thì phải đánh x sau ngày này
Nhờ các anh, chị giúp đỡ.
Trân trọng cảm ơn!
 

File đính kèm

Lần chỉnh sửa cuối:
Anh xem lại giúp em sao vận chưa được ạ
Cảm ơn anh nhiều
Mã:
Sub ChamCongLao()
    Dim Rng As Range, sRng As Range, NgHS As Date, Ngay As Byte
    Dim Rng2 As Range, sRng2 As Range, i As Integer
    Dim J As Integer, Dat As Date, Col As Integer, W As Integer
    Dim StrC As String, CNg As String, MyAdd As String

    With Sheets("VR")
        Set Rng = .Range(.[A1], .[A1].End(xlDown))
    End With
    With Sheets("DT")
        Set Rng2 = .Range(.[A1], .[A1].End(xlDown))
    End With

    'Tim ngay ho so

    For i = 5 To [A5].End(xlDown).Row
        Set sRng2 = Rng2.Find(Cells(i, "A").Value, , xlFormulas, xlWhole)    'Tìm Trong Trang "DT"       '
        NgHS = sRng2.Offset(, 2)
    Next i

    Ngay = Day(NgHS)

    If Ngay < Range("C1").Value Then
1       StrC = SCong([c1].Value)
    Else
        StrC = SCong([c1].Value, Ngay)
    End If

        'Loai Công Chu Nhât '
        For J = 5 To [A5].End(xlDown).Row
2           CNg = TronChuoi(StrC)                  'Trôn Ngày Công Còn Lai     *'
3           Cells(J, "D").Resize(, 31).ClearContents   'Xóa Du Liêu Cua Dòng Dang Khao Sát '
4           Set sRng = Rng.Find(Cells(J, "A").Value, , xlFormulas, xlWhole)    'Tìm Trong Trang "VR"       '



41          If sRng Is Nothing Then                       'Nêu Không Tìm Tháy     '
                For W = 1 To Cells(J, "AK").Value
                    Col = CInt(Mid(CNg, 2 * W - 1, 2))
                    Cells(J, "C").Offset(, Col).Value = "X"
                Next W
42          Else                                                  'Khi Tìm Thây       '
                MyAdd = sRng.Address
                Do
                    Dat = sRng.Offset(, 2).Value
5                   For W = Day(Dat) To 31                    'Duyêt Theo Các Ngày Da Nghi        '
6                       CNg = Replace(CNg, CStr(W), "")       'Xóa Các Ngày Theo Danh Sách VR  '
                        If W = Day(sRng.Offset(, 3).Value) Then Exit For
                    Next W
                    Set sRng = Rng.FindNext(sRng)
                Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
7               For W = 1 To Cells(J, "AK").Value              'Chám Công Cho Nhung Ngày Còn Lai       '
                    Col = CInt(Mid(CNg, 2 * W - 1, 2))                 '*  '
                    Cells(J, "C").Offset(, Col).Value = "X"
                Next W
            End If
        Next J
    End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Trong cửa sổ Immediate ta nhập
?SCong(#8/1/2019#,8)
& {ENTER} Ta sẽ có chuỗi sau:
3129272321191715130910121416202224262830
 
Upvote 0
Trong cửa sổ Immediate ta nhập
?SCong(#8/1/2019#,8)
& {ENTER} Ta sẽ có chuỗi sau:
3129272321191715130910121416202224262830
Phần nầy thì hiểu là tham biến thứ 2 trong SCong, nhưng em chưa biết cách là truyền ngày hồ sơ vào ạ.
Nhờ anh hướng dẫn rõ hơn
 
Upvote 0
Nhờ anh xem giúp em, sao vẫn không đánh sau ngày hồ sơ ạ.
Trong đoạn Code này cần lưu ý nhiều điều lắm:
PHP:
' . . . . . .     '
   'Tìm Ngày Hô So    '
    For i = 5 To [A5].End(xlDown).Row
1        Set sRng2 = Rng2.Find(Cells(i, "A").Value, , xlFormulas, xlWhole)    'Tìm Trong Trang "DT"       '
3        NgHS = sRng2.Offset(, 2)
5    Next i
    Ngay = Day(NgHS)
    If Ngay < Range("C1").Value Then
       StrC = SCong([c1].Value)
    Else
        StrC = SCong([c1].Value, Ngay)
    End If
' . . . . .   '
Thứ nhất để áp dụng phương thức FIND() về ngày, ta phải chắc chắn rằng vùng để tìm (Rng2) có định dạng phải là "MM/DD/yyyy" & trị để tìm cũng phải định dạng như thế
Cho nên trước tiên ta phải định dạng lại vùng Rng2 từ các dòng lệnh như sau:
Mã:
 Dim MyFormat As String
MyFormat=Rng2.NumFormat  ' Luu Lai Format Dang Hiên Hành   '
Rng2.Offsset(1).NumFormat="MM/DD/yyyy"     'Dinh Dang Lai Vùng Này  '

[Lưu ý thêm]: Cuối chương trình ta cần trả lại định dạng trước đó (về NumFormat) bằng trị trong tham biến MyFormat

Set sRng2 = Rng2.Find(Format(Cells(i, "A").Value,"MM/DD/yyyy"), , xlValues, xlWhole)
' . . . .'
Sau dòng lệnh 1 ta viết ngay dòng lệnh 3 là ta đang đi trên cầu khỉ trên cơn mưa, sẽ dễ té sông lắm.
Để chắc cú ta phải hỏi chương trình có tìm thấy trị Ngày cần tìm trong vùng Rng2 hay không?
PHP:
If Not sRng2 Is Nothing Then
      Ngay =Day(sRng2)   'Nếu Tìm Thây Thì lấy Dùng Hàm Day() để lấy trị tìm thấy gán vô tham biến Ngay   '
   StrC = SCong([c1].Value, Ngay)
Else 
  StrC = SCong([c1].Value)
End If
' . . . .
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom