Tự động điền ngày bắt đầu làm việc và ngày kết thúc

Liên hệ QC

vuxuan_huyen

Thành viên mới
Tham gia
21/10/08
Bài viết
2
Được thích
0
Chào các bạn, mình gặp 1 vấn đề mà chưa có phương án và công thức giải quyết.

Ví dụ trong file của mình đính kèm đây, rất đơn giản chỉ có X là đi làm, không có gì là không đi làm.

Mình cần tự động tính ngày bắt đầu đi làm, ngày bắt đầu nghỉ trong 1 khoảng thời gian, ví dụ là từ 16 tháng 11 đến 15 tháng 12. Chấm bao nhiêu ngày thì dễ rồi nhưng công thức nào để excel tự động nhận ra ngày có cái X đầu tiên và khi nào thì kết thúc.

Các bạn giúp mình với, nếu ở HN mình xin chiêu đãi 1 bữa :)

Xin cảm ơn.
 

File đính kèm

  • sample need help.xls
    43 KB · Đọc: 20
Tạm thời tính ngày bắt đầu & ngày kết thúc với điều kiện không có khoảng trống ở giữa. Nghĩa là chưa tách ra được 1 người thành 2 dòng khi có khoảng thời gian nghỉ ở giữa.

Dùng VBA, làm tạm nên chưa hay lắm.

Chỉ tạm áp dụng cho 2 khoảng cách nhau, chưa áp dụng cho nhiều khoảng.
 

File đính kèm

  • sample need help.xls
    41.5 KB · Đọc: 18
  • sample3.xls
    83 KB · Đọc: 25
Lần chỉnh sửa cuối:
Kiểm tra thấy trong dữ liệu thực không chỉ có X mà còn có T, nên không sử dụng được.
Thế mà đề bài lại khẳng định là:
Ví dụ trong file của mình đính kèm đây, rất đơn giản chỉ có X là đi làm, không có gì là không đi làm.
Ngoài ra, thứ tự tên bên dưới không giống thứ tự bên trên, nên khi fill công thức bị sai tên.

Giả sử T chỉ có ở vị trí cuối như trong dữ liệu mẫu và cách ra 1 nhóm riêng, thì sửa công thức lại 1 chút (không sửa hàm VBA)

F7 =IF(E7-D7<COUNTIF(H7:DW7;"X");OFFSET($H$5;;posX(OFFSET(H7;0;posnull(H7:DW7)-1;1;200))+posnull(H7:DW7)-2);"")
G7 =IF(E7-D7<COUNTIF(H7:DW7;"X");OFFSET($H$5;;MATCH("Z";H7:DW7;1));"")

TUy nhiên như đã nói, do làm vội vì quá khuya, nên dở ẹt
 

File đính kèm

  • Sample4.xls
    88.5 KB · Đọc: 38
Lần chỉnh sửa cuối:
Thank anh rất nhiều ạ.

Cái đoạn có T là lỗi ạ, có thể xoá bỏ hoàn toàn ạ.

Mạng giờ lại tốt rồi, em cảm ơn anh nhiều nhiều, anh pm cho em contact nhé, người nhiệt tình như anh giờ thật hiếm.

Hic, file này nhìn đơn giản nhưng thực ra để tìm ra phương án giải quyết và áp dụng được thì thầy Mỹ đã phải có bề dày kinh nghiệm rất lâu trong excel, đúng là Excel Ordinary Member :).
Hôm qua internet chậm quá, gây ra bao nhiêu khó khăn, hôm nay tìm google mới biết thầy đã 49 tuổi, mà sức làm việc và khả năng giải quyết vấn đề cực nhanh và hiệu quả ( làm minh cứ gọi anh anh không, ngại quá ).
Em không thạo excel lắm cho nên giới hạn sử dụng chỉ có thể tìm hiểu trong các công thức đến if,and là đã quá sức, file của thầy gửi em áp dụng 100% còn tìm hiểu cơ chế và lệnh thì em không đủ trình độ để hiểu.
Em cảm ơn thầy !
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cải tiến cho gọn lại, bây giờ công thức se ngắn hơn: Hàm thêm 1 tham số là số thứ tự nhóm "X" liên tục trong range.
Hàm BeginX(Rng, N) trả về vị trí ký tự X đầu tiên của nhóm "X" liên tục thứ N trong Rng,
Hàm EndX(Rng, N) trả về vị trí ký tự X cuối cùng của nhóm "X" liên tục thứ N trong Rng,

Sau đó dùng offset hoặc index để lấy ngày tương ứng.

Hết dở ẹt òi, còn dở hơi hơi thôi.

PHP:
Function BeginX(Rng As Range, N As Long) As Long
Dim j As Long, MyArr()
ReDim MyArr(1, 1 To Rng.Count)
MyArr = Rng
j = 0
For i = 1 To Rng.Count
If i = 1 Then
    If MyArr(1, i) = "X" Then
        j = j + 1
        If j = N Then BeginX = i: Exit Function
    End If
Else
    If MyArr(1, i) = "X" And MyArr(1, i - 1) <> "X" Then
        j = j + 1
    If j = N Then BeginX = i: Exit Function
    End If
End If
Next
End Function
PHP:
Function EndX(Rng As Range, N As Long) As Long
Dim j As Long, MyArr()
ReDim MyArr(1, 1 To Rng.Count)
MyArr = Rng
j = 0
For i = 1 To Rng.Count
If i < Rng.Count Then
    If MyArr(1, i) = "X" And MyArr(1, i + 1) <> "X" Then
        j = j + 1
        If j = N Then EndX = i: Exit Function
    End If
Else
    If MyArr(1, i) = "X" Then
        j = j + 1
        If j = N Then EndX = i: Exit Function
    End If
End If
Next
End Function
 

File đính kèm

  • Sample5.zip
    18.8 KB · Đọc: 28
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom