Nhờ cả nhà giúp cho hàm phân tích nhóm kíp trực trong tháng

Liên hệ QC
Dùng hàm cho những bài nối chuỗi thực sự rất là khoai, nhất là dùng phiên bản 2016 về trước không có mấy hàm hỗ trợ nối chuỗi.
Dùng cột phụ nối tạm cho bạn tham khảo vậy (nhiều khoảng thời gian thì phải tạo nhiều cột phụ hơn)
View attachment 265135
Cảm ơn bạn nhiều Công thức nhiều quá nhìn thấy khiếp quá . Dùng cột phụ cũng giải quyết được nhưng công thức thì e ngại quá
Bài đã được tự động gộp:

Bạn đang dùng phiên bản Excel nào? Nếu có hàm TEXTJOIN, có thể giải quyết bằng công thức với chút mẹo nhỏ.

Đây là hàm tự tạo
PHP:
Public Function ChamCong(ByVal rngX As Range, ByVal rngDate As Range) As String
Application.Volatile
Dim arrX, arrDate, i&, temp$, isStart As Boolean
Dim tungay As String
Dim denngay As String

tungay = "t" & ChrW(7915) & " ngày "
denngay = " " & ChrW(273) & ChrW(7871) & "n ngày"
arrX = rngX.Value
arrDate = rngDate.Value

For i = 1 To UBound(arrX, 2)
    If arrX(1, i) <> "" Then
        If isStart = False Then
            isStart = True
            temp = temp & "; " & tungay & arrDate(1, i)
        End If
    Else
        If isStart = True Then
            isStart = False
            temp = temp & denngay & arrDate(1, i - 1)
        End If
    End If
   If i = UBound(arrX, 2) And isStart = True Then temp = temp & denngay & arrDate(1, i)
Next
If temp <> "" Then ChamCong = UCase(Mid(temp, 3, 1)) & Mid(temp, 4)
End Function
Cách sử dụng:

=ChamCong(DI3:EN3,$DI$2:$EN$2)

.
Thank bạn nhiều lắm! Để mình thử áp dụng vô excel mình (2019)
 
Đúng rổi Ad ơi. Mình làm bằng tay kết quả mẫu là vậy đó. Ad chỉ mình làm đi Ad. Thank you!
Bài đã được tự động gộp:


Đúng rổi Ad ơi. Mình làm bằng tay kết quả mẫu là vậy đó. Ad chỉ mình làm đi Ad. Thank you!
Hàm tính ngày:

Cấu trúc: TinhNgay(Vùng ngày tháng tham chiếu, vùng tính toán, chấm công)

Vùng ngày tháng tham chiếu: Phải cố định hàng và cột để khi fill công thức nó vẫn giữ nguyên.

=TinhNgay($F$2:$AL$2,F3:AL3)

Mã:
Function TinhNgay(ByVal rngVungThamChieu As Range, rngVungTinhToan As Range) As String
    Dim blnBatDau As Boolean
    Dim c As Long, u As Long
    Dim arrThamChieu, arrTinhToan
    Dim strTuNgay1 As String, strDenNgay As String
    strTuNgay1 = "T" & ChrW(7915) & " ng" & ChrW(224) & "y "
    strTuNgay2 = "t" & ChrW(7915) & " ng" & ChrW(224) & "y "
    strDenNgay = " " & ChrW(273) & ChrW(7871) & "n ng" & ChrW(224) & "y "
    arrThamChieu = rngVungThamChieu.Value
    arrTinhToan = rngVungTinhToan.Value
    u = UBound(arrThamChieu, 2)
    If u <> UBound(arrTinhToan, 2) Then
        TinhNgay = "Ki" & ChrW(7875) & "m tra l" & ChrW(7841) & "i 2 v" & ChrW(249) & "ng tham chi" & ChrW(7871) & "u! S" & _
                    ChrW(7889) & " c" & ChrW(7897) & "t kh" & ChrW(244) & "ng b" & ChrW(7857) & "ng nhau!"
        Exit Function
    End If
    For c = 1 To u
        If arrTinhToan(1, c) > "" Then
            If blnBatDau Then
                TinhNgay = TinhNgay & "; " & strTuNgay2 & Format(arrThamChieu(1, c), "dd/mm") & strDenNgay
                blnBatDau = False
            Else
                If TinhNgay = "" Then
                    TinhNgay = strTuNgay1 & Format(arrThamChieu(1, c), "dd/mm") & strDenNgay
                Else
                    If c = u Then
                        TinhNgay = TinhNgay & Format(arrThamChieu(1, c), "dd/mm")
                    End If
                End If
            End If
        Else
            If TinhNgay > "" Then
                If Not blnBatDau Then
                    TinhNgay = TinhNgay & Format(arrThamChieu(1, c - 1), "dd/mm")
                    blnBatDau = True
                End If
            End If
        End If
    Next
End Function
 

File đính kèm

Tôi nghĩ cái này Transform trong power query sau đó viết hàm Dax Concatenatex chắc ngắn và nhanh hơn.
 
Mình có bảng chấm công tháng của NV ; NV làm việc theo từng kíp trực, ra trực . Yêu cầu tổng hợp cuối tháng mỗi NV làm từ ngày đến ngày của từng khoảng thời gian kíp trực. Mình gởi kèm file mẫu như sau:
Xin cảm ơn cả nhà!
View attachment 265121
Mình xin cảm ơn cả nhà rất nhiều! Cảm ơn Ad GPE, các bạn thành viên tích cục GPE đã giúp mình . Mình đã làm xong công việc bàn giao lại co BV dã chiến. Giờ hoàn thành công việc nhận nhiệm vụ mới. Sẽ hữu ích cho những bạn làm công tác nhân sự sau này.
Xin phép được đóng topic lại.
Trân trọng cảm ơn cả nhà GPE!
 
Mình xin cảm ơn cả nhà rất nhiều! Cảm ơn Ad GPE, các bạn thành viên tích cục GPE đã giúp mình . Mình đã làm xong công việc bàn giao lại co BV dã chiến. Giờ hoàn thành công việc nhận nhiệm vụ mới. Sẽ hữu ích cho những bạn làm công tác nhân sự sau này.
Xin phép được đóng topic lại.
Trân trọng cảm ơn cả nhà GPE!
Rất vui vì bạn đã hoàn thành công việc của mình, tuy nhiên yêu cầu đóng topic lại thì không được vì thông qua bài này có nhiều giải pháp và cũng có những giải pháp mà người khác muốn mở rộng để học hỏi thêm cho nên bạn không cần phải quan tâm đến topic này nữa cũng không sao nhưng một số thành viên thì lại cần tới.
Trân trọng.
 
Rất vui vì bạn đã hoàn thành công việc của mình, tuy nhiên yêu cầu đóng topic lại thì không được vì thông qua bài này có nhiều giải pháp và cũng có những giải pháp mà người khác muốn mở rộng để học hỏi thêm cho nên bạn không cần phải quan tâm đến topic này nữa cũng không sao nhưng một số thành viên thì lại cần tới.
Trân trọng.
Chào bạn!
Ý mình đóng topic là đã giải quyết được vấn đề để các bạn có thời gian hỗ trợ giúp các topic khác, (chứ không phài đóng là hide hoặc delete). Mình có nó là " Sẽ hữu ích cho những bạn làm công tác nhân sự sau này." đó. Cảm ơn cả nhà nhiều!
 
Rất vui vì bạn đã hoàn thành công việc của mình, tuy nhiên yêu cầu đóng topic lại thì không được vì thông qua bài này có nhiều giải pháp và cũng có những giải pháp mà người khác muốn mở rộng để học hỏi thêm cho nên bạn không cần phải quan tâm đến topic này nữa cũng không sao nhưng một số thành viên thì lại cần tới.
Trân trọng.
Nghĩa ơi! Code còn sót trường hợp từ ngày = đến ngày .
 

File đính kèm

Nghĩa ơi! Code còn sót trường hợp từ ngày = đến ngày .
Vẫn còn sót trường hợp này, mặc dù tôi đã tính chấm công 1 ngày rồi, nhưng quên vụ cuối thời gian.

Bạn đổi hàm cũ bằng hàm này:

PHP:
Function TinhNgay(ByVal rngVungThamChieu As Range, rngVungTinhToan As Range) As String
    Dim blnBatDau As Boolean
    Dim c As Long, u As Long
    Dim arrThamChieu, arrTinhToan
    Dim strTuNgay1 As String, strDenNgay As String
    strTuNgay1 = "T" & ChrW(7915) & " ng" & ChrW(224) & "y "
    strTuNgay2 = "t" & ChrW(7915) & " ng" & ChrW(224) & "y "
    strDenNgay = " " & ChrW(273) & ChrW(7871) & "n ng" & ChrW(224) & "y "
    arrThamChieu = rngVungThamChieu.Value
    arrTinhToan = rngVungTinhToan.Value
    u = UBound(arrThamChieu, 2)
    If u <> UBound(arrTinhToan, 2) Then
        TinhNgay = "Ki" & ChrW(7875) & "m tra l" & ChrW(7841) & "i 2 v" & ChrW(249) & "ng tham chi" & ChrW(7871) & "u! S" & _
                    ChrW(7889) & " c" & ChrW(7897) & "t kh" & ChrW(244) & "ng b" & ChrW(7857) & "ng nhau!"
        Exit Function
    End If
    For c = 1 To u
        If arrTinhToan(1, c) > "" Then
            If blnBatDau Then
                TinhNgay = TinhNgay & "; " & strTuNgay2 & Format(arrThamChieu(1, c), "dd/mm") & strDenNgay
                blnBatDau = False
            Else
                If TinhNgay = "" Then
                    If c = u Then
                        TinhNgay = strTuNgay1 & Format(arrThamChieu(1, c), "dd/mm") & strDenNgay & Format(arrThamChieu(1, c), "dd/mm")
                    Else
                        TinhNgay = strTuNgay1 & Format(arrThamChieu(1, c), "dd/mm") & strDenNgay
                    End If
                Else
                    If c = u Then
                        TinhNgay = TinhNgay & Format(arrThamChieu(1, c), "dd/mm")
                    End If
                End If
            End If
        Else
            If TinhNgay > "" Then
                If Not blnBatDau Then
                    TinhNgay = TinhNgay & Format(arrThamChieu(1, c - 1), "dd/mm")
                    blnBatDau = True
                End If
            End If
        End If
    Next
End Function
 
Vẫn còn sót trường hợp này, mặc dù tôi đã tính chấm công 1 ngày rồi, nhưng quên vụ cuối thời gian.

Bạn đổi hàm cũ bằng hàm này:

PHP:
Function TinhNgay(ByVal rngVungThamChieu As Range, rngVungTinhToan As Range) As String
    Dim blnBatDau As Boolean
    Dim c As Long, u As Long
    Dim arrThamChieu, arrTinhToan
    Dim strTuNgay1 As String, strDenNgay As String
    strTuNgay1 = "T" & ChrW(7915) & " ng" & ChrW(224) & "y "
    strTuNgay2 = "t" & ChrW(7915) & " ng" & ChrW(224) & "y "
    strDenNgay = " " & ChrW(273) & ChrW(7871) & "n ng" & ChrW(224) & "y "
    arrThamChieu = rngVungThamChieu.Value
    arrTinhToan = rngVungTinhToan.Value
    u = UBound(arrThamChieu, 2)
    If u <> UBound(arrTinhToan, 2) Then
        TinhNgay = "Ki" & ChrW(7875) & "m tra l" & ChrW(7841) & "i 2 v" & ChrW(249) & "ng tham chi" & ChrW(7871) & "u! S" & _
                    ChrW(7889) & " c" & ChrW(7897) & "t kh" & ChrW(244) & "ng b" & ChrW(7857) & "ng nhau!"
        Exit Function
    End If
    For c = 1 To u
        If arrTinhToan(1, c) > "" Then
            If blnBatDau Then
                TinhNgay = TinhNgay & "; " & strTuNgay2 & Format(arrThamChieu(1, c), "dd/mm") & strDenNgay
                blnBatDau = False
            Else
                If TinhNgay = "" Then
                    If c = u Then
                        TinhNgay = strTuNgay1 & Format(arrThamChieu(1, c), "dd/mm") & strDenNgay & Format(arrThamChieu(1, c), "dd/mm")
                    Else
                        TinhNgay = strTuNgay1 & Format(arrThamChieu(1, c), "dd/mm") & strDenNgay
                    End If
                Else
                    If c = u Then
                        TinhNgay = TinhNgay & Format(arrThamChieu(1, c), "dd/mm")
                    End If
                End If
            End If
        Else
            If TinhNgay > "" Then
                If Not blnBatDau Then
                    TinhNgay = TinhNgay & Format(arrThamChieu(1, c - 1), "dd/mm")
                    blnBatDau = True
                End If
            End If
        End If
    Next
End Function
OK rồi bạn. Cảm ơn nhiều ạ
 
Nghĩa ơi! Code còn sót trường hợp từ ngày = đến ngày .
Dùng thử Function NgayTruc
Mã:
Function NgayTruc(ByVal rngNgay As Range, rngCong As Range) As String
  Dim aNgay(), aCong(), res$, j&, sCol&, fCol&
  Dim TuNgay$, DenNgay$, fDay$

  TuNgay = "t" & ChrW(7915) & " ng" & ChrW(224) & "y "
  DenNgay = " " & ChrW(273) & ChrW(7871) & "n ng" & ChrW(224) & "y "
  aNgay = rngNgay.Value
  aCong = rngCong.Value
  sCol = UBound(aNgay, 2)
  If sCol <> UBound(aCong, 2) Then
    NgayTruc = "#REF!"
  Else
    ReDim Preserve aCong(1 To UBound(aCong), 1 To sCol + 1)
    For j = 1 To sCol
      If aCong(1, j) <> Empty Then
        If fCol = Empty Then fCol = j
        If aCong(1, j + 1) = Empty Then
          If fCol < j Then
            res = res & "; " & TuNgay & Format(aNgay(1, fCol), "dd/mm") & DenNgay & Format(aNgay(1, j), "dd/mm")
          Else
            res = res & "; " & "ng" & ChrW(224) & "y " & Format(aNgay(1, j), "dd/mm")
          End If
          fCol = Empty
        End If
      End If
    Next j
    If res <> Empty Then NgayTruc = IIf(Mid(res, 3, 1) = "t", "T", "N") & Mid(res, 4, Len(res))
  End If
End Function
 
Nhờ Anh giải thích đoạn này! Trong M code em đọc mà chưa hiểu nơi!
PHP:
= (Source)=>
    let
        lst=List.Accumulate(List.Positions(Source),{},(s,c)=>
                                let
                                    n=(if c=0 then 0
                                    else if Source{c-1}=Source{c}-1 then List.Last(s) else List.Last(s)+1),
                                    lst=s&{n}
                                in
                                    lst
                            ),
        tbl=Table.FromColumns({Source,lst},{"Col01","Col02"}),
        #"Grouped Rows" = Table.Group(tbl, {"Col02"}, {{"Max", each List.Max([Col01]), type nullable number}, {"Min", each List.Min([Col01]), type nullable number}}),
        #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom", each "From Date: "&Date.ToText(Date.From([Min]),"dd/MM")&" "&
    " - To Date: "&Date.ToText(Date.From([Max]),"dd/MM")),
        txt=Text.Combine(#"Added Custom"[Custom],", ")
    in
        txt
Và code dưới!
PHP:
= Table.AddColumn(#"Filtered Rows", "Date", each Number.From(Date.FromText(Text.Combine({"2021",Text.Middle([Value],3,2),Text.Middle([Value],0,2)},"-"))), Number.Type)
PHP:
Đoạn (s,c)
này có ý nghĩa gì Anh?
 
Web KT

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

Back
Top Bottom