daihoangtu
Thành viên mới

- Tham gia
- 26/10/07
- Bài viết
- 17
- Được thích
- 7
Nhìn file xong tôi chẳng hiểu gì cả! ít ra bạn cũng cho biết tổng hợp như thế nào, vùng nào trên bảng (có bảng thì X có bảng dạng ngày tháng). Bạn cần nói rõ các điều kiện cần để làm thì người khác mới hiểu và hướng dẫn cho bạ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à!
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à!
Bỏ qua phần dấu X chỉ tính từ khu vực từ 30/6 den 31/7 . khoảng thời gian này có người trực 3 kíp có người trực 2 kíp có người làm hành chính cả tháng . Thời gian làm việc không liên tục. Cột yêu cầu tổng hợp (tô màu vàng) là kết quả cần làm.Nhìn file xong tôi chẳng hiểu gì cả! ít ra bạn cũng cho biết tổng hợp như thế nào, vùng nào trên bảng (có bảng thì X có bảng dạng ngày tháng). Bạn cần nói rõ các điều kiện cần để làm thì người khác mới hiểu và hướng dẫn cho bạn.
Yêu cầu này làm bằng công thức, phải dùng hàm TEXTJOIN. Nếu phiên bản excel < 2019 nên đăng bên box lập trình đễ được hỗ trợ tốt hơn ( bằng UDF)Bỏ qua phần dấu X chỉ tính từ khu vực từ 30/6 den 31/7 . khoảng thời gian này có người trực 3 kíp có người trực 2 kíp có người làm hành chính cả tháng . Thời gian làm việc không liên tục. Cột yêu cầu tổng hợp (tô màu vàng) là kết quả cần làm.
Trong 1 dãy chuỗi không liên tục ( Đứt đoạn) làm giao lấy giá trị đầu và giá trị cuối của từng khoảng đứt đoạn? Thank bạn!Yêu cầu này làm bằng công thức, phải dùng hàm TEXTJOIN. Nếu phiên bản excel < 2019 nên đăng bên box lập trình đễ được hỗ trợ tốt hơn ( bằng UDF)
.
Mong muốn kết quả như nào thì điền tay ra cho mọi người dễ hiểu, nhìn khó hiểu quáTrong 1 dãy chuỗi không liên tục ( Đứt đoạn) làm giao lấy giá trị đầu và giá trị cuối của từng khoảng đứt đoạn? Thank bạn!
Bài #3 có gh rõ: "Cột yêu cầu tổng hợp (tô màu vàng) là kết quả cần làm."Mong muốn kết quả như nào thì điền tay ra cho mọi người dễ hiểu, nhìn khó hiểu quá
Cột kết quả là cột Yêu cầu tổng hợp làm = tay (làm mẫu đó)Mong muốn kết quả như nào thì điền tay ra cho mọi người dễ hiểu, nhìn khó hiểu quá
Bạn không nói rõ 1 kíp là như thế nào, và cũng cho VD về kết quả của nó của một hàng thì mọi người dễ dàng giúp bạn hơn.Bỏ qua phần dấu X chỉ tính từ khu vực từ 30/6 den 31/7 . khoảng thời gian này có người trực 3 kíp có người trực 2 kíp có người làm hành chính cả tháng . Thời gian làm việc không liên tục. Cột yêu cầu tổng hợp (tô màu vàng) là kết quả cần làm.
kíp làm ko có qui luật cứ chấm công thực tế là dấu X sao đó mình đổi thành ngày (kiểu chuỗi), 1 NV làm liên tục là có giá trị trong ô, còn khoảng trống là người NV đó ko có đi làm . Cột Yêu cầu tổng hợp (màu vàng) là cột cần làm công thức (mình làm bằng tay, làm mẫu) làm ra giống kết quả cột màu vàng đó. Bảng chấm công cả ngàn NV mình trích những trường hợp tiêu biểu thôi.Bạn không nói rõ 1 kíp là như thế nào, và cũng cho VD về kết quả của nó của một hàng thì mọi người dễ dàng giúp bạn hơn.
Nói nôm na là bạn muốn chuyển từ X sang dạn ngày tháng hay sao?kíp làm ko có qui luật cứ chấm công thực tế là dấu X sao đó mình đổi thành ngày (kiểu chuỗi), 1 NV làm liên tục là có giá trị trong ô, còn khoảng trống là người NV đó ko có đi làm . Cột Yêu cầu tổng hợp (màu vàng) là cột cần làm công thức (mình làm bằng tay, làm mẫu) làm ra giống kết quả cột màu vàng đó. Bảng chấm công cả ngàn NV mình trích những trường hợp tiêu biểu thôi.
Đã chuyển rồi giờ làm công thức nào để ra cột màu vàng như hình mới bổ sung đó ad.Nói nôm na là bạn muốn chuyển từ X sang dạn ngày tháng hay sao?
Tôi đã thấy vùng vàng trong file, nhưng tôi không hiểu tổng hợp như thế nào? Đếm số ngày? Từ ngày ... đến ngày? Nếu ô trống thì không tính? Hoặc như thế nào để tính toán?Đã chuyển rồi giờ làm công thức nào để ra cột màu vàng như hình mới bổ sung đó ad.
Cái này nhờ bạn nào viết code VBA đi viết hàm thấy khoai lắmĐã chuyển rồi giờ làm công thức nào để ra cột màu vàng như hình mới bổ sung đó ad.
Tính theo NV (tính theo row) 1 dãy ngày làm liện tục thì lấy giá trị ngày đầu (để làm Từ ngày) và giá trị ngày cuối ( để làm Đến ngày) của dãy liên tục. Sau đó dãy trống là NV ko đi làm Không tính. Tiếp theo dãy ngày vô làm lần 2 trong tháng (dãy lần 2 trong tháng) cũng lấy giá trị ngày đầu (để làm Từ ngày) và giá trị ngày cuối (để làm đến ngày) của dãy liên tục.. Cứ dãy chuỗi liên tục thì lấy giá trị ngày đầu (để làm Từ ngày) và lấy giá trị cuối dãy (để làm Đến ngày).Tôi đã thấy vùng vàng trong file, nhưng tôi không hiểu tổng hợp như thế nào? Đếm số ngày? Từ ngày ... đến ngày? Nếu ô trống thì không tính? Hoặc như thế nào để tính toán?
À, có nghĩa rằng kết quả là vùng bạn tô vàng? Nếu không có khoảng trống thì từ đầu đến cuối, nếu có thì cách nhau dấu chấm phẩy. Tôi không nghĩ là có thể làm bằng công thức, tôi làm hàm tự tạo VBA được không? Và nếu dùng hàm này thì bạn không cần thêm cái bảng ngày tháng nữa mà chỉ sử dụng cái bảng X là được rồi.Tính theo NV (tính theo row) 1 dãy ngày làm liện tục thì lấy giá trị ngày đầu (để làm Từ ngày) và giá trị ngày cuối ( để làm Đến ngày) của dãy liên tục. Sau đó dãy trống là NV ko đi làm Không tính. Tiếp theo dãy ngày vô làm lần 2 trong tháng (dãy lần 2 trong tháng) cũng lấy giá trị ngày đầu (để làm Từ ngày) và giá trị ngày cuối (để làm đến ngày) của dãy liên tục.. Cứ dãy chuỗi liên tục thì lấy giá trị ngày đầu (để làm Từ ngày) và lấy giá trị cuối dãy (để làm Đến ngày).
Đú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!Tôi thử làm công thức bằng hàm tự tạo VBA, đây là hình ảnh kết quả của nó, nếu đúng thì tôi sẽ gửi lên.
View attachment 265132
Đú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!Tôi thử làm công thức bằng hàm tự tạo VBA, đây là hình ảnh kết quả của nó, nếu đúng thì tôi sẽ gửi lên.
View attachment 265132
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ỏ.Cột kết quả là cột Yêu cầu tổng hợp
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ả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á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
Thank bạn nhiều lắm! Để mình thử áp dụng vô excel mình (2019)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
Cách sử dụng: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
=ChamCong(DI3:EN3,$DI$2:$EN$2)
.
Hàm tính ngày:Đú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!
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
Bài này mà dùng Dax là không khả thi, dùng power query nhưng code M thì đượcTô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.
Anh thử dùng code M cho em tham khảo với!Bài này mà dùng Dax là không khả thi, dùng power query nhưng code M thì được
Đây bạn!!!!!!!!!Anh thử dùng code M cho em tham khảo với!
cảm ơn anh!
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.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
Nhờ Anh quay video cách làm của Anh làm được không Anh?Đây bạn!!!!!!!!!
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.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!
Chào bạn!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 .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.
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.Nghĩa ơi! Code còn sót trường hợp từ ngày = đến ngày .
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 ạ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
Dùng thử Function NgayTrucNghĩa ơi! Code còn sót trường hợp từ ngày = đến ngày .
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!Đây bạn!!!!!!!!!
= (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
= 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)
Đoạn (s,c)