Giúp code hoặc công thức tính thời gian theo buổi (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

minhtuan55

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
23/3/16
Bài viết
705
Được thích
52
Chào cả nhà GPE !
Em có vấn đề tính thời gian theo từng buổi dựa vào giờ vào và giờ ra. Em làm gần 2 ngày mà chưa ra, nay nhờ các Cao thủ giúp em. Vấn đề em như sau:

- Giờ buổi sáng : từ 6h đến 10h
- Giờ buổi chiều: từ 10h đến 23h
- Giờ buổi tối: từ 23 đến 6h hôm sau

Ví dụ :
Vào 29/8/2017 7:00 - ra 29/8/2017 9:00
Thì kết quả mong muốn
- giờ buổi sáng : 2 giờ ( giờ buổi chiều và buổi tối = 0 )
-------------------------------------------------------------------------------------------
Ví dụ :
Vào 29/8/2017 10:00 - ra 29/8/2017 12:30
Thì kết quả mong muốn
- giờ buổi chiều: 2,5 giờ( giờ buổi sáng và buổi tối = 0 )

-------------------------------------------------------------------------------------------
Ví dụ :
Vào 29/8/2017 9:00 - ra 29/8/2017 13:00
Thì kết quả mong muốn
- giờ buổi sáng : 1 giờ ( từ 9h đến 10h)
- giờ buổi chiều: 3 giờ ( từ 10h đến 13h)
- Giờ buổi tối : 0 giờ

Em ví dụ 3 ví dụ minh họa cho Mọi người dể hiểu. Mong mọi người giúp đở. Em xin chân thành cảm ơn
 

File đính kèm

Chào cả nhà GPE !
Em có vấn đề tính thời gian theo từng buổi dựa vào giờ vào và giờ ra. Em làm gần 2 ngày mà chưa ra, nay nhờ các Cao thủ giúp em. Vấn đề em như sau:

- Giờ buổi sáng : từ 6h đến 10h
- Giờ buổi chiều: từ 10h đến 23h
- Giờ buổi tối: từ 23 đến 6h hôm sau

Ví dụ :
Vào 29/8/2017 7:00 - ra 29/8/2017 9:00
Thì kết quả mong muốn
- giờ buổi sáng : 2 giờ ( giờ buổi chiều và buổi tối = 0 )
-------------------------------------------------------------------------------------------
Ví dụ :
Vào 29/8/2017 10:00 - ra 29/8/2017 12:30
Thì kết quả mong muốn
- giờ buổi chiều: 2,5 giờ( giờ buổi sáng và buổi tối = 0 )

-------------------------------------------------------------------------------------------
Ví dụ :
Vào 29/8/2017 9:00 - ra 29/8/2017 13:00
Thì kết quả mong muốn
- giờ buổi sáng : 1 giờ ( từ 9h đến 10h)
- giờ buổi chiều: 3 giờ ( từ 10h đến 13h)
- Giờ buổi tối : 0 giờ

Em ví dụ 3 ví dụ minh họa cho Mọi người dể hiểu. Mong mọi người giúp đở. Em xin chân thành cảm ơn
Theo Phật phải từ bi hỷ xả, tâm ngôn khiêm cung từ tốn, tránh cao ngạo hỷ nộ ái ố, tứ đại giai không, diệt dục, diệt tâm ma. Tâm hư không mới chứa được vạn vật, không cao ngạo, hạ mình khiêm nhường thì mới có khả năng thụ nhận kiến thức mới, thùng đã đầy thì làm thế nào chứa thêm thứ khác vào! xả bớt đi lại chứa được thêm mới vào.Thế nhá cậu! nhẽ ra phải xứng với hình biểu tượng thì hay nhỉ!
Bài trên với khả năng các bé phổ thông làm bằng các công thức thường thực hiện một phát xong ngay, cớ chi đánh đố để mang sầu khổ?
Tớ giải đây nhé, có lần ra thì tốt, không thì tớ cũng chịu thôi:
PHP:
D10=IF($J$3=$J$4,N("Thỏa")+IF(($A$4-$A$3-0.0001)*24>LOOKUP($J$3,{1,2,3},{20,11,17}),($C10=$J$3)*SUM($K$3:$K$4)
+LOOKUP($C10,{1,2,3},{4,13,7})*(LOOKUP($C10,{1;2;3},MMULT(N(IFERROR(MATCH(TRANSPOSE(ROW(INDIRECT(INT($A$3)&":"&INT($A$4)))+{6,10,23}/24),$A$3:$A$4,1)=1,)),ROW(INDIRECT("1:"&INT($A$4)-INT($A$3)+1))^0))
-OR(ROUND(MOD($A$3,1)*24,0)={6,10,23})*($C10=$J$3)-($J$4=$C10)),IF($C10=$J$3,($A$4-$A$3-0.0001)*24,0)),
N("Không thỏa")+OR($J$3:$J$4=$C10)*SUMIF($J$3:$J$4,$C10,$K$3:$K$4)+LOOKUP($C10,{1,2,3},{4,13,7})*(LOOKUP($C10,{1;2;3},
MMULT(N(IFERROR(MATCH(TRANSPOSE(ROW(INDIRECT(INT($A$3)&":"&INT($A$4)))+{6,10,23}/24),$A$3:$A$4,1)=1,)),ROW(INDIRECT("1:"&INT($A$4)-INT($A$3)+1))^0))-OR(ROUND(MOD($A$3,1)*24,0)={6,10,23})*($C10=$J$3)-($J$4=$C10)))
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chào cả nhà GPE !
Em có vấn đề tính thời gian theo từng buổi dựa vào giờ vào và giờ ra. Em làm gần 2 ngày mà chưa ra, nay nhờ các Cao thủ giúp em. Vấn đề em như sau:

- Giờ buổi sáng : từ 6h đến 10h
- Giờ buổi chiều: từ 10h đến 23h
- Giờ buổi tối: từ 23 đến 6h hôm sau

Ví dụ :
Vào 29/8/2017 7:00 - ra 29/8/2017 9:00
Thì kết quả mong muốn
- giờ buổi sáng : 2 giờ ( giờ buổi chiều và buổi tối = 0 )
-------------------------------------------------------------------------------------------
Ví dụ :
Vào 29/8/2017 10:00 - ra 29/8/2017 12:30
Thì kết quả mong muốn
- giờ buổi chiều: 2,5 giờ( giờ buổi sáng và buổi tối = 0 )

-------------------------------------------------------------------------------------------
Ví dụ :
Vào 29/8/2017 9:00 - ra 29/8/2017 13:00
Thì kết quả mong muốn
- giờ buổi sáng : 1 giờ ( từ 9h đến 10h)
- giờ buổi chiều: 3 giờ ( từ 10h đến 13h)
- Giờ buổi tối : 0 giờ

Em ví dụ 3 ví dụ minh họa cho Mọi người dể hiểu. Mong mọi người giúp đở. Em xin chân thành cảm ơn
Làm đại, bạn nói chuyện thách đố thì sẽ có ai giúp bạn đây ?
 

File đính kèm

Upvote 0
Làm đại, bạn nói chuyện thách đố thì sẽ có ai giúp bạn đây ?
Nếu đơn giản thế này thì chả phải đem đánh đố với giọng điệu cao ngạo vậy. Công thức thấy cũng khá,
nhưng sai be bét như tương khi thay đổi giờ giấc, như vào lúc 1h30 sớm ngày 28, hoặc cách ngày nhau hàng
chục hàng trăm ngày thì sao nhỉ? Đã làm thì suy nghĩ cho lung, nhìn trước xem sau, dò trên xét dưới, chứ
làm đại thì cũng chẳng chứng tỏ được điều gì và đi đến đâu cả...
 
Upvote 0
Nếu đơn giản thế này thì chả phải đem đánh đố với giọng điệu cao ngạo vậy. Công thức thấy cũng khá,
nhưng sai be bét như tương khi thay đổi giờ giấc, như vào lúc 1h30 sớm ngày 28, hoặc cách ngày nhau hàng
chục hàng trăm ngày thì sao nhỉ? Đã làm thì suy nghĩ cho lung, nhìn trước xem sau, dò trên xét dưới, chứ
làm đại thì cũng chẳng chứng tỏ được điều gì và đi đến đâu cả...
sao vừa khá vừa lại be bét, dữ liệu vào không ăn nhập nguyên tắc thì sai, tôi cũng chả cần lường trước trường hợp. Chưa kể tính theo từng ngày thế có ai đi làm 1 phát hơn 24 tiếng à.
 
Upvote 0
[BÀI NÀY CHỈ GIÀNH CHO CỘNG ĐỒNG; KHÔNG GIÀNH CHO NGƯỜI ĐĂNG BÀI]​
Với hàm tự tạo này:
PHP:
Function Ca(Vào As Date, Ra As Date)
 Const G10 As Double = #10:00:00 AM#
 Const G23 As Double = #11:00:00 PM#
 Dim Arr(1 To 1, 1 To 3)
 Dim Gv As Double, Gr As Double
 Gv = Vào - Int(Vào):           Gr = Ra - Int(Ra)
 If Day(Ra) = Day(Vào) Then
    If Gv < G10 And Gr < G10 Then
        Arr(1, 1) = 24 * (Gr - Gv)
    ElseIf Gv < G10 And Gr <= G23 Then
        Arr(1, 1) = 24 * (G10 - Gv)
        Arr(1, 2) = 24 * (Gr - G10)
    ElseIf Gv < G10 And Gr <= TimeSerial(24, 0, 0) Then
        Arr(1, 1) = 24 * (G10 - Gv)
        Arr(1, 2) = 24 * (Gr - G10)
        Arr(1, 3) = 24 * (Gr - G23)
    End If
 ElseIf Day(Ra) = Day(Vào) + 1 Then
    'Se Viét Tiếp Néu Có Ai  Đó Iêu Càu'
 End If
 Ca = Arr()
End Function
Ta sẽ thu kết quả ở 3 cột cuối của bảng dữ liệu sau:
PHP:
'
   Cột B               Cột C                Cột E    Cột F   Cột G'
   Vào                   Ra                 Sáng     Chiều    Tối
29/08/2017 7:00   29/08/2017 9:00           2,00     0         0
29/08/2017 9:00   29/08/2017 12:30          1,00     2,5       0
29/08/2017 9:00   29/08/2017  23:30:00 CH   1,00     13,5     0,5
29/08/2017 8:30   29/08/2017 12:30          1,50     2,5       0
 
Upvote 0
sao vừa khá vừa lại be bét, dữ liệu vào không ăn nhập nguyên tắc thì sai, tôi cũng chả cần lường trước trường hợp. Chưa kể tính theo từng ngày thế có ai đi làm 1 phát hơn 24 tiếng à.
Vậy trong ngày theo ca đi nhá! vào 23h30 ngày 28, ra sớm 5h30 ngày 29, thêm nữa này vào 13h30 trưa 28,
ra sớm 5h30 ngày 29.... còn cả tá trường hợp không làm đến nơi đến chốn thì gọi là vừa khá vừa be bét, cậu nhá!
 
Upvote 0
Chú í: Bộ Luật LĐ chỉ cho fép làm thêm giờ trong qui định;
Chúng ta tuân thủ luật fáp thì không thể viết công thức/hàm để tính cho trường hợp fi fáp.
 
Upvote 0
Nếu đơn giản thế này thì chả phải đem đánh đố với giọng điệu cao ngạo vậy. Công thức thấy cũng khá,
nhưng sai be bét như tương khi thay đổi giờ giấc, như vào lúc 1h30 sớm ngày 28, hoặc cách ngày nhau hàng
chục hàng trăm ngày thì sao nhỉ? Đã làm thì suy nghĩ cho lung, nhìn trước xem sau, dò trên xét dưới, chứ
làm đại thì cũng chẳng chứng tỏ được điều gì và đi đến đâu cả...

Nếu "nhìn trước xem sau" thì có lẽ đã thấy bài này bắt buộc phải giải trên Excel 2003.
Đem ra "dò trên xét dưới" sẽ thấy file xlsx có nhiều khả năng được cảnh báo "có hiểu chưa?"
 
Upvote 0
Nếu "nhìn trước xem sau" thì có lẽ đã thấy bài này bắt buộc phải giải trên Excel 2003.
Đem ra "dò trên xét dưới" sẽ thấy file xlsx có nhiều khả năng được cảnh báo "có hiểu chưa?"

May quá; Mình giải trong VBA nên chắc vô hại với các loại Version khác nhau!
Dịp này xin nhắc lại: Bài giải của mình chỉ dành cho người nào đó trong cộng đồng này, cần thì tham khảo; Bài mình viết không cho những người có bài đăng ở topic này!
 
Upvote 0
Vậy trong ngày theo ca đi nhá! vào 23h30 ngày 28, ra sớm 5h30 ngày 29, thêm nữa này vào 13h30 trưa 28,
ra sớm 5h30 ngày 29.... còn cả tá trường hợp không làm đến nơi đến chốn thì gọi là vừa khá vừa be bét, cậu nhá!
Ừ thì tôi sai, mà nói thật bài này chả có cái quái gì cao siêu cả. Kết hợp vài hàm min max là ra thôi bạn à, thế cho nên tôi nhận sai rồi bạn đừng trả lời tôi nhé thân.
 
Upvote 0
Với 3 mốc thời gian trong ngày gồm #6:00:00#; #10:00:00# & #23:00:00# ta có các trường hợp sau đây:

(*) Trong ngày
Sáng vô lúc 1h0; Ra lúc <=6h00 (Vô trễ ca đêm)
Sáng vô lúc 2h0; Ra lúc <=10h00 (2 ca: Đêm & sáng)
Sáng vô lúc 5h00; Ra lúc <=23h00 (3 ca luôn)
Sáng vô lúc 5h30; Ra lúc <=23h30 (Sai luật?)

Sáng vô lúc (>=6h00 & < =10h00); Ra lúc <=10h00
. . . . . .
(*) Ngoài ngày . . . . .

Fải kiên trì xem xét thôi.
 
Upvote 0
Với 3 mốc thời gian trong ngày gồm #6:00:00#; #10:00:00# & #23:00:00# ta có các trường hợp sau đây:

(*) Trong ngày
Sáng vô lúc 1h0; Ra lúc <=6h00 (Vô trễ ca đêm)
Sáng vô lúc 2h0; Ra lúc <=10h00 (2 ca: Đêm & sáng)
Sáng vô lúc 5h00; Ra lúc <=23h00 (3 ca luôn)
Sáng vô lúc 5h30; Ra lúc <=23h30 (Sai luật?)

Sáng vô lúc (>=6h00 & < =10h00); Ra lúc <=10h00
. . . . . .
(*) Ngoài ngày . . . . .

Fải kiên trì xem xét thôi.
Làm để cho ngưòi gửi bài thấy diễn đàn đều có cách giải mọi câu hỏi, vì thế không nên cao ngạo thách đố,
cách giải có rồi nhưng nhìn vào quay như chong chóng rối mù như tơ vò thì cũng hỏng xôi rách việc, chả dùng vào đâu.
Bác khỏi phải kiên trì thêm nhọc thân cho trường hợp này.
 
Upvote 0
Với 3 mốc thời gian trong ngày gồm #6:00:00#; #10:00:00# & #23:00:00# ta có các trường hợp sau đây:

(*) Trong ngày
Sáng vô lúc 1h0; Ra lúc <=6h00 (Vô trễ ca đêm)
Sáng vô lúc 2h0; Ra lúc <=10h00 (2 ca: Đêm & sáng)
Sáng vô lúc 5h00; Ra lúc <=23h00 (3 ca luôn)
Sáng vô lúc 5h30; Ra lúc <=23h30 (Sai luật?)

Sáng vô lúc (>=6h00 & < =10h00); Ra lúc <=10h00
. . . . . .
(*) Ngoài ngày . . . . .

Fải kiên trì xem xét thôi.

Làm công thức thì chưa biết, chứ làm code thì dùng cách chuẩn hoá 3 ca thành cùng ngày là dễ hơn hết.
Sau khi chuẩn hoá, bạn sẽ có 0 - 7 = tối; 7 - 11 = sáng; 11 - 24 = chiều
Con toán chuẩn hoá giờ vào giờ ra lúc này chỉ là con toán dịch toạ độ x: + 1 giờ

Sau khi có ca chuẩn, giờ chuẩn rồi thì ta xét vài cái if-else là ra số giờ mỗi ca

Nếu giờ ra là ngày hôm sau thì tách giờ ra làm 2 khoảng, một khoảng từ giờ vào đến 24 và khoảng kia từ 0 đến giờ ra

Nếu giờ ra là vài ngày sau thì cứ trừ dần cho đến ngày chuẩn, cứ mỗi ngày trừ đi thì được 7 giờ tối + 4 giờ sáng + 13 giờ chiều

Chú: có những hợp đồng buộc bạn phải tính liên tục giờ như thế để trả cho bên gia công. Việc thay ngừoi cho đúng luật Lao Động là của bên gia công. Nếu bên chủ thấy họ sử dụng lao động không đúng thì có thể cảnh báo, cắt hợp đồng, hoặc báo cho cơ quan chức năng.
 
Upvote 0
Các bác xem dùm em:
PHP:
C8=MAX(0,MIN(4,MIN(10,ROUND(24*(MOD(C5,1)+(DAY(C5)>DAY(C4))),1))-ROUND(24*MOD(C4,1),1)))
PHP:
C9=MAX(0,MIN(13,MIN(23,ROUND(24*(MOD(C5,1)+(DAY(C5)>DAY(C4))),1))-ROUND(24*MOD(C4,1),1)))
PHP:
C10=MAX(0,MIN(7,MIN(30,ROUND(24*(MOD(C5,1)+(DAY(C5)>DAY(C4))),1))-ROUND(24*MOD(C4,1),1)))
 
Upvote 0
Làm công thức thì chưa biết, chứ làm code thì dùng cách chuẩn hoá 3 ca thành cùng ngày là dễ hơn hết.
Sau khi chuẩn hoá, bạn sẽ có 0 - 7 = tối; 7 - 11 = sáng; 11 - 24 = chiều
Con toán chuẩn hoá giờ vào giờ ra lúc này chỉ là con toán dịch toạ độ x: + 1 giờ

Cách này rất hay & thú vị'
Vậy có fải dịch chuyển tọa độ của giờ vô hay giờ ra không vậy bạn?
Nếu có thì dịch chuyện 6h00 về 0h00 chứ nhỉ.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
1. Bạn phải có Excel >= 2007. Nếu bạn chỉ có <= 2003 thì ngừng đọc tại đây, không tải tập tin đính kèm. Không đọc tiếp, không hỏi, không đề nghị gì.
2. Tôi giả thiết là không ai làm việc > 24 tiếng. Nếu nhân viên của bạn làm việc > 24 tiếng thì xin mời gõ cửa nhà khác.
3. Bạn tự test. Tôi không muốn bỏ công lập dữ liệu dùng cho mục đích test.
4. Nếu bạn nhập vào cột A nhiều giờ vào, vào cột B nhiều giờ ra, thì tôi sẽ viết đúng công thức cho C2, D2 và E2, chỉ việc kéo xuống. Còn như tập tin bạn đính kèm thì bây giờ tự bạn sửa và áp dụng cho dữ liệu của mình.
5. Tôi tin nhưng không đảm bảo là công thức luôn đúng. Tự bạn tạo ra dữ liệu đa dạng, test rồi tự kết luận. Thực ra nhiều lắm thì giờ vào có thể chọn các khả năng: 5, 6, 8, 10, 16, 23, 23:59. Tương tự chọn vài khả năng giờ ra rồi ghép với giờ vào. Không có quá nhiều khả năng để thử.
 

File đính kèm

Upvote 0
1. Bạn phải có Excel >= 2007. Nếu bạn chỉ có <= 2003 thì ngừng đọc tại đây, không tải tập tin đính kèm. Không đọc tiếp, không hỏi, không đề nghị gì.
2. Tôi giả thiết là không ai làm việc > 24 tiếng. Nếu nhân viên của bạn làm việc > 24 tiếng thì xin mời gõ cửa nhà khác.
3. Bạn tự test. Tôi không muốn bỏ công lập dữ liệu dùng cho mục đích test.
4. Nếu bạn nhập vào cột A nhiều giờ vào, vào cột B nhiều giờ ra, thì tôi sẽ viết đúng công thức cho C2, D2 và E2, chỉ việc kéo xuống. Còn như tập tin bạn đính kèm thì bây giờ tự bạn sửa và áp dụng cho dữ liệu của mình.
5. Tôi tin nhưng không đảm bảo là công thức luôn đúng. Tự bạn tạo ra dữ liệu đa dạng, test rồi tự kết luận. Thực ra nhiều lắm thì giờ vào có thể chọn các khả năng: 5, 6, 8, 10, 16, 23, 23:59. Tương tự chọn vài khả năng giờ ra rồi ghép với giờ vào. Không có quá nhiều khả năng để thử.
Câu 1. Mình xin nói thêm rằng: Với tình huống này máy 2003 vẫn có thể đọc excel >=2007 bằng cách làm việc trực tuyến. Mình đã từng làm trên Oulook.com.vn rồi. Thân chào bạn!
 
Upvote 0
Mình cho rằng với E2003 thì chuyển qua hàm người dùng chắc cũng được.
Mình xin thử liệt kê các trường hợp & nhờ các bạn bổ sung cho đủ giúp!
PHP:
Vô 23h10 ra 23h50;  Vô 23h30 về 4h30;   Vô 1h00 & vể 5h30;  Vô 23h30 & về  9h30;  vô 1h30 & về 9h50, . . .
 
Upvote 0
Câu 1. Mình xin nói thêm rằng: Với tình huống này máy 2003 vẫn có thể đọc excel >=2007 bằng cách làm việc trực tuyến
Tôi giải thích cho bạn là tại sao tôi thêm câu 1.
Tôi xem
http://www.giaiphapexcel.com/diendan/threads/giúp-mình-sửa-code-lọc-bị-lỗi-khí-số-lượng-ký-tự-nhiều.129500/#post-812529
thì thấy chỉ do vụ Excel 2003 mà lời qua tiếng lại nhiều quá. Tôi không muốn lại nổ ra tranh luận ở đây nên tốt nhất cắt luôn
1. Bạn phải có Excel >= 2007. Nếu bạn chỉ có <= 2003 thì ngừng đọc tại đây, không tải tập tin đính kèm. Không đọc tiếp, không hỏi, không đề nghị gì.
Vì công thức của tôi dùng 1 hàm chỉ có với Excel >= 2007 mà.
 
Upvote 0
Tôi sửa chút công thức cho khoảng 23-6 và thêm 56 dòng dữ liệu để kiểm tra.
Hi vọng không bỏ sót các khả năng.

Ý tưởng là dùng hàm ... có trong Excel >= 2007. Mọi rút gọn và đơn giản công thức được cấp phép miễn phí.

Đã sửa trong tập tin đính kèm
 
Upvote 0
Thường thì cái sai của người khác nó như con voi, nhìn rõ mồn một, còn cái sai của bản thân như con kiến, nhìn mãi không thấy. Chính vì thế ta luôn nhìn ngay ra cái sai của người khác mà không nhìn thấy lỗi của mình. Cứ nghiệm thì thấy trong cuộc sống y như thế.

Chính vì thế mời mọi người thử tìm cái sai của tôi. Còn tôi tìm cái sai của người khác.
Mục đích cũng chỉ là để hoàn thiện công thức thôi, không có chuyện chỉ trích ai ở đây

Các bác xem dùm em:
PHP:
C8=MAX(0,MIN(4,MIN(10,ROUND(24*(MOD(C5,1)+(DAY(C5)>DAY(C4))),1))-ROUND(24*MOD(C4,1),1)))
PHP:
C9=MAX(0,MIN(13,MIN(23,ROUND(24*(MOD(C5,1)+(DAY(C5)>DAY(C4))),1))-ROUND(24*MOD(C4,1),1)))
PHP:
C10=MAX(0,MIN(7,MIN(30,ROUND(24*(MOD(C5,1)+(DAY(C5)>DAY(C4))),1))-ROUND(24*MOD(C4,1),1)))
Tôi thử thì thấy với giờ vào là 2017-08-28 05:00 và ra là 2017-08-28 05:30 thì 3 kết quả đều là 12:00:00. Nếu tôi không nhầm khi copy/paste công thức thì rõ ràng công thức sai. Kết quả đúng phải là 00:00:00, 00:00:00 và 00:30:00
 
Lần chỉnh sửa cuối:
Upvote 0
Thường thì cái sai của người khác nó như con voi, nhìn rõ mồn một, còn cái sai của bản thân như con kiến, nhìn mãi không thấy. Chính vì thế ta luôn nhìn ngay ra cái sai của người khác mà không nhìn thấy lỗi của mình. Cứ nghiệm thì thấy trong cuộc sống y như thế.

Chính vì thế mời mọi người thử tìm cái sai của tôi. Còn tôi tìm cái sai của người khác.
Mục đích cũng chỉ là để hoàn thiện công thức thôi, không có chuyện chỉ trích ai ở đây


Tôi thử thì thấy với giờ vào là 2017-08-28 05:00 và ra là 2017-08-28 05:30 thì 3 kết quả đều là 12:00:00. Nếu tôi không nhầm khi copy/paste công thức thì rõ ràng công thức sai. Kết quả đúng phải là 00:00:00, 00:00:00 và 00:30:00
Khi đưa công thức cho bất kỳ ai, em đều mong sẽ có phản hồi tốt dĩ nhiên sai thì ta sẽ nghiên cứu thêm.
Ở đây ta nên tránh những người có thái độ tự cao quá mức và lơ họ mà sống.
Kết quả đúng phải là 00:00:00, 00:00:00 và 00:30:00
Em đã thử, anh có cách nào ra kết quả mà là 00:00:00 không em thử mọi số đều không thể ra 00:00:00
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình cho rằng với E2003 thì chuyển qua hàm người dùng chắc cũng được.

Bài này chỉ thuần lô gic. Chỉ cần biết cách lập bảng chân lý (truth table) là giải được. Nếu không muốn lập bảng chân lý, cũng có thể lấy giấy bút vẽ ra cái chu kỳ trọn 2 ngày (48 giờ) thì sẽ tìm ra mọi điều kện.
Chủ của cái thớt bị xoá kia chỉ vì muốn khích bà con ra sức giải cho nên mới làm ra vẻ khó khăn nọ kia.

Có thể ví như bài toán căn bản mà các giáo viên dạy lập trình vẫn ra cho học sinh là xét nghiệm tính chất nguyên tố của một số nguyên n. Học sinh có thể thử chia số này cho làn lượt từ 2 đến n-1. Động não 1 chút thì chỉ cần thử 1 lần với 2, sau đó là từ 3, 5,... giảm được một số con tính. Có căn bản toán hơn chút nữa thì chỉ cần chia tới căn 2 của n. Các cách giải đều ra đáp số. Chỉ khác nhau cái kinh nghiệm giúp con toán làm ít hơn mà thôi.

Tôi đã mách ý rồi. Bạn nào muón thử code thì vào thử. Có thể dùng công thức ở bài #28 để debug code của mình.
 
Upvote 0
Thường thì cái sai của người khác nó như con voi, nhìn rõ mồn một, còn cái sai của bản thân như con kiến, nhìn mãi không thấy. Chính vì thế ta luôn nhìn ngay ra cái sai của người khác mà không nhìn thấy lỗi của mình. Cứ nghiệm thì thấy trong cuộc sống y như thế.
Chính vì thế mời mọi người thử tìm cái sai của tôi. Còn tôi tìm cái sai của người khác.
Mục đích cũng chỉ là để hoàn thiện công thức thôi, không có chuyện chỉ trích ai ở đây
Tôi thử thì thấy với giờ vào là 2017-08-28 05:00 và ra là 2017-08-28 05:30 thì 3 kết quả đều là 12:00:00. Nếu tôi không nhầm khi copy/paste công thức thì rõ ràng công thức sai. Kết quả đúng phải là 00:00:00, 00:00:00 và 00:30:00
Đem tất cả các công thức vào chung một chỗ, tăng giảm ngày-giờ-phút, xem sẽ biết ngay công thức nào không chính xác.
Nói thêm, do chủ topic đưa ra khung giờ không bình thường như khung giờ làm việc, mà chỉ lấy thành cácbuổi: sáng-chiều-tối
rồi cho vài ví dụ, xem ra có các ý khác. Tỉ dụ, nếu xem giờ vào là giờ bắt đầu tính, còn giờ ra là giờ kết thúc, và bất kể khoảng cách
ngày của 2 giờ đầu cuối: cùng hay khác nhiều ngày rồi tính số giờ của các buổi, giải pháp của tớ nhắm vào việc này và cũng nhắm
vào lời thách đố cao ngạo của chủ topic với toàn thành viên.
Chưa vội và đến mức cần thiết để các thành viên chuyên viết code ra tay, chỉ với công thức mọn thì cũng đã làm được, và nếu chủ topic có đọc
được công thức cũng phải hoài công tìm hiểu, xứng với lời yêu cầu của chủ topic.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nói thêm, do chủ topic đưa ra khung giờ không bình thường như khung giờ làm việc, mà chỉ lấy thành cácbuổi: sáng-chiều-tối
rồi cho vài ví dụ, xem ra có các ý khác.

Trong cái thớt bị xoá, chủ thớt không biết vô tình hay cố ý đã dẫn bà con đi vào hoả mù với lời "đừng có đem lý thuyết..."
Thực ra, bài này trên lý thuyết thì nó là bài toán tính phí theo thời gian của từng chu kỳ. Với mọt chu kỳ ở đây là 1 ngày và chia ra làm 3 phân đoạn.
Loại bài toán tính này dùng rất nhiều để tính phí mướn công cụ trong ngày, tuỳ thoe giờ cao điểm mà lấy tiền khác nhau.

Ở trường hợp này, nếu phải đoán thì tôi đoán đây là bài toán tính tiền mướn cái gì đó, ví dụ như phòng ka ra ô kê.
 
Upvote 0
1. Bạn phải có Excel >= 2007. Nếu bạn chỉ có <= 2003 thì ngừng đọc tại đây, không tải tập tin đính kèm. Không đọc tiếp, không hỏi, không đề nghị gì.
2. Tôi giả thiết là không ai làm việc > 24 tiếng. Nếu nhân viên của bạn làm việc > 24 tiếng thì xin mời gõ cửa nhà khác.
3. Bạn tự test. Tôi không muốn bỏ công lập dữ liệu dùng cho mục đích test.
4. Nếu bạn nhập vào cột A nhiều giờ vào, vào cột B nhiều giờ ra, thì tôi sẽ viết đúng công thức cho C2, D2 và E2, chỉ việc kéo xuống. Còn như tập tin bạn đính kèm thì bây giờ tự bạn sửa và áp dụng cho dữ liệu của mình.
5. Tôi tin nhưng không đảm bảo là công thức luôn đúng. Tự bạn tạo ra dữ liệu đa dạng, test rồi tự kết luận. Thực ra nhiều lắm thì giờ vào có thể chọn các khả năng: 5, 6, 8, 10, 16, 23, 23:59. Tương tự chọn vài khả năng giờ ra rồi ghép với giờ vào. Không có quá nhiều khả năng để thử.
Chào bạn @batman1 và các anh chị trong diễn đàn ạ , bạn và các anh chị giúp em công thức tính giờ theo File kèm với. Cảm ơn bạn và các anh chị trong diễn đàn ạ.
 

File đính kèm

Upvote 0
Kết quả đúng phải là 00:00:00, 00:00:00 và 00:30:00
Em đã thử, anh có cách nào ra kết quả mà là 00:00:00 không em thử mọi số đều không thể ra 00:00:00
Trong tập tin bạn đính kèm thì công thức C10
Mã:
=MAX(0,MIN(7,MIN(30,ROUND(24*(MOD(C5,1)+(DAY(C5)>DAY(C4))),1))-MAX(23,ROUND(24*MOD(C4,1),1))))
Nhưng bạn kiểm tra thì thấy tôi trích bài #20 của bạn mà trong đó
Mã:
C10=MAX(0,MIN(7,MIN(30,ROUND(24*(MOD(C5,1)+(DAY(C5)>DAY(C4))),1))-ROUND(24*MOD(C4,1),1)))

Tức công thức tôi lấy từ bài #20 không có đoạn MAX(23; ở sau dấu trừ. Từ bài #20 trở đi không có code nào khác của bạn. Vậy chắc bạn thêm đoạn MAX(23; chỉ ở trong tập tin của mình mà không gửi lên.

Nếu bạn thử với code tôi trích thì bạn thấy tôi viết đúng.
-----------
1. Với giờ vào là 2017-08-28 05:00 và ra là 2017-08-28 05:30 thì theo tôi kết quả phải là 00:00:00, 00:00:00 và 00:30:00 trong khi đó trong tập tin đính kèm sẽ có 00:00:00, 00:00:00 và 00:00:00. Tức cũng sai. Không hiểu sao bạn không nhận được toàn 00:00:00. Tôi đính kèm ảnh.

2. Nếu giờ vào, ra là 2017-08-28 10:00 và 2017-08-28 23:00 thì công thức của bạn trả về giờ buổi chiều là 312:00:00. Tất nhiên bạn nhìn thấy con số 13 nhưng đấy là do bạn để General. 13 ở đây là 13 ngày = 13*24 = 312 giờ. Nếu bạn chuyển định dạng thành Time 37:30:55 thì bạn sẽ có 312:00:00. Nếu bạn dùng kết quả C9 để tính toán thì bạn sẽ thấy C9 = 13 (vd. =C9+10 -> 23). Trong khoảng 10-23 chỉ có 13 giờ = 13/24 = 0,541666667

Nói chung là sai nhiều
 

File đính kèm

  • gpe.JPG
    gpe.JPG
    127.8 KB · Đọc: 12
Upvote 0
Trong tập tin bạn đính kèm thì công thức C10
Mã:
=MAX(0,MIN(7,MIN(30,ROUND(24*(MOD(C5,1)+(DAY(C5)>DAY(C4))),1))-MAX(23,ROUND(24*MOD(C4,1),1))))
Nhưng bạn kiểm tra thì thấy tôi trích bài #20 của bạn mà trong đó
Mã:
C10=MAX(0,MIN(7,MIN(30,ROUND(24*(MOD(C5,1)+(DAY(C5)>DAY(C4))),1))-ROUND(24*MOD(C4,1),1)))

Tức công thức tôi lấy từ bài #20 không có đoạn MAX(23; ở sau dấu trừ. Từ bài #20 trở đi không có code nào khác của bạn. Vậy chắc bạn thêm đoạn MAX(23; chỉ ở trong tập tin của mình mà không gửi lên.

Nếu bạn thử với code tôi trích thì bạn thấy tôi viết đúng.
-----------
1. Với giờ vào là 2017-08-28 05:00 và ra là 2017-08-28 05:30 thì theo tôi kết quả phải là 00:00:00, 00:00:00 và 00:30:00 trong khi đó trong tập tin đính kèm sẽ có 00:00:00, 00:00:00 và 00:00:00. Tức cũng sai. Không hiểu sao bạn không nhận được toàn 00:00:00. Tôi đính kèm ảnh.

2. Nếu giờ vào, ra là 2017-08-28 10:00 và 2017-08-28 23:00 thì công thức của bạn trả về giờ buổi chiều là 312:00:00. Tất nhiên bạn nhìn thấy con số 13 nhưng đấy là do bạn để General. 13 ở đây là 13 ngày = 13*24 = 312 giờ. Nếu bạn chuyển định dạng thành Time 37:30:55 thì bạn sẽ có 312:00:00. Nếu bạn dùng kết quả C9 để tính toán thì bạn sẽ thấy C9 = 13 (vd. =C9+10 -> 23). Trong khoảng 10-23 chỉ có 13 giờ = 13/24 = 0,541666667

Nói chung là sai nhiều
0 ở đây là dạng số chứ định dạng thời gian sẽ không có vụ 00:00:00
còn theo hình bạn gửi thì chỉ tính đi làm từ 6:00 trước 6:00 không thể tính được ??
với ca đêm ai vào 5:00 rồi ra 5:30 là điều không tưởng và tác giả muốn để ở số giờ là dạng số không phải dạng thời gian.
Dĩ nhiên công thức của tôi vẫn còn vấn đề, haizz khó hơn mình tưởng...
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
với ca đêm ai vào 5:00 rồi ra 5:30 là điều không tưởng
và tác giả muốn để ở số giờ là dạng số không phải dạng thời gian.
Thôi được, bỏ qua chuyện 5:00 và 5:30.

Trong tập tin của mình bạn có giờ vào ra là 28-08-17 09:00 và 28-08-17 13:30
Kết quả buổi chiều = 3,5. Cứ coi như bạn có kết quả là số.
Tức ở đây 3,5 = 13:30 - 10:00 = 3:30

Bây giờ bạn đổi thành giờ vào ra là 28-08-17 06:00 và 28-08-17 09:27. Bạn có buổi sáng cũng là 3,5.

Thế là thế nào? 3:30 là 3,5, và 3:27 cũng là 3,5?

Thôi tôi xin rút. Chả muốn góp ý gì nữa. Bạn không phải trả lời tôi đâu.
 
Lần chỉnh sửa cuối:
Upvote 0
Thôi thì tặng luôn bài toán gốc. Sử dụng bài toán gốc có thể giải những bài như trong chủ đề này.

A. Bài toán:
1. 2 khoảng thời gian.
Cho 2 thời điểm (ngày + giờ) a và b (a <= b). Và 2 thời điểm c và d (c <= d). Hãy tính độ dài phần chung (a, b) và (c, d)
2. 2 đoạn thẳng trên trục Ox
Cho 2 điểm A và B có tọa độ a và b (a <= b). Và 2 điểm C và D có tọa độ c và d (c <= d). Hãy tính độ dài phần chung của 2 đoạn thẳng AB và CD.

B. Công thức
Tôi nghĩ là dùng MEDIAN rất gọn. Có lẽ không thể gọn hơn.
Mã:
=MEDIAN(a;b;d)-MEDIAN(a;b;c)
Hoặc đổi vai trò của a và c, b và d ta có
Mã:
=MEDIAN(c;d;b)-MEDIAN(c;d;a)
----------
Công thức trong bài tôi đính kèm - giờ vào tại E2, giờ ra tại F2.
1. Công thức cho buổi sáng:
Luôn phải tính phần chung của (a = E2, b = F2) và (c = 6 giờ sáng cùng ngày với E2, d = 10 giờ sáng cùng ngày với E2) - vd. giờ vào = 05:45, giờ ra = 12:00
Nếu vào ra ở 2 ngày liên tiếp (tôi phục vụ cả trường hợp ra - vào = 24 giờ) thì phải tính thêm phần chung của (a = E2, b = F2) và (c = 6 giờ sáng cùng ngày với F2, d = 10 giờ sáng cùng ngày với F2) - vd. giờ vào = 08:00 ngày trước, giờ ra = 07:00 ngày sau. Lúc này sẽ có 2 phần buổi sáng ở ngày cùng với E2 và ở ngày cùng với F2.

2. Công thức cho buổi chiều. Hoàn toàn tương tự. Chỉ thay khoảng 6-10 bằng 10-23

3. Công thức cho buổi tối: trong trường hợp tổng quát có 3 phần:
Phần 1 = phần chung của (a = E2, b = F2) và (c = 0 giờ sáng cùng ngày với E2, d = 6 giờ sáng cùng ngày với E2)
Phần 2 = phần chung của (a = E2, b = F2) và (c = 23 giờ cùng ngày với E2, d = 6 giờ sáng ngày hôm sau)
Phần 3 = phần chung của (a = E2, b = F2) và (c = 23 giờ ngày hôm sau, d = 24 giờ ngày hôm sau)

Tất nhiên 3 phần này không xuất hiện đồng thời nếu nhân viên làm việc nhiều nhất là 24 tiếng. Nhưng 2 phần thì luôn có thể:
- phần 1 và phần 2: vd. giờ vào = 4 giờ sáng, giờ ra = 3:59 ngày hôm sau.
- phần 2 và phần 3: vd. giờ vào = 23:30 giờ, giờ ra = 23:20 ngày hôm sau.
-----------------
Một vd. khác sử dụng bài toán gốc.
A1 là giờ vào, B1 là giờ ra - làm trong ngày. C1 là giờ làm nhưng không tính giờ nghỉ trưa từ 12 tới 14 giờ nếu có.
Vd. vào 7 giờ ra 12 giờ (xin về sớm có việc, không tắm) - không có nghỉ trưa
Vd. vào 7 giờ ra 12:30 giờ (xin về sớm có việc, có tắm) - có nghỉ trưa nhưng không tính.
Công thức C1
Mã:
=B1-A1-MEDIAN(A1;B1;INT(A1)+14/24)+MEDIAN(A1;B1;INT(A1)+12/24)
 
Lần chỉnh sửa cuối:
Upvote 0
Thôi được, bỏ qua chuyện 5:00 và 5:30.

Trong tập tin của mình bạn có giờ vào ra là 28-08-17 09:00 và 28-08-17 13:30
Kết quả buổi chiều = 3,5. Cứ coi như bạn có kết quả là số.
Tức ở đây 3,5 = 13:30 - 10:00 = 3:30

Bây giờ bạn đổi thành giờ vào ra là 28-08-17 06:00 và 28-08-17 09:27. Bạn có buổi sáng cũng là 3,5.

Thế là thế nào? 3:30 là 3,5, và 3:27 cũng là 3,5?

Thôi tôi xin rút. Chả muốn góp ý gì nữa. Bạn không phải trả lời tôi đâu.
Tôi hiểu tôi cố chấp xin lỗi nhé, chỉ là làm theo bài thớt đưa ra có lẽ không được như ý của bạn.
 
Upvote 0
Ý của tôi thì không tính. Ý của chủ thớt mới tính, bạn có lý. Nhưng tôi chỉ không hiểu là sao 3:30 là 3,5 mà 3:27 cũng là 3,5. Phải chăng vài ba phút không quan trọng?
Nhưng chủ thớt chắc không cần kết quả chính xác tới vài phút.
Thắc mắc thế thôi chứ ai làm thế nào thì làm. Tôi không muốn kéo dài nữa.
 
Upvote 0
Ý của tôi thì không tính. Ý của chủ thớt mới tính, bạn có lý. Nhưng tôi chỉ không hiểu là sao 3:30 là 3,5 mà 3:27 cũng là 3,5. Phải chăng vài ba phút không quan trọng?
Nhưng chủ thớt chắc không cần kết quả chính xác tới vài phút.
Thắc mắc thế thôi chứ ai làm thế nào thì làm. Tôi không muốn kéo dài nữa.

Theo quy luật thông thường của cách trả tiền theo giờ thì người ta chia giờ ra nhiều khoảng. Điển hình của hợp đồng thuê chuyên viên (luật, kế toán, ...) là 10 khoảng, tức là 6 phút tính là 1 đơn vị.
Hợp đồng thuê gia công hay công nhân thì thường số lẻ được tính theo cụm 15 phút (1/4, 1/2, 3/4 giờ)
 
Upvote 0
Chào các anh chị và các bạn, các anh chị và các bạn giúp em công thức tính số giờ theo khoảng thời gian trong File đính kèm với, vì doanh nghiệp tính lương theo giờ ạ. Cảm ơn các anh chị và các bạn nhiều ạ.
 

File đính kèm

Upvote 0
Chào các anh chị và các bạn, các anh chị và các bạn giúp em công thức tính số giờ theo khoảng thời gian trong File đính kèm với, vì doanh nghiệp tính lương theo giờ ạ. Cảm ơn các anh chị và các bạn nhiều ạ.
Cậu xem giải thuật bài 53 của bác @batman1 phù hợp cho cách tính thời gian làm việc trong ngày,
hoặc qua ngày nhưng không quá 24h.
Download về tệp đính kèm cậu nhé! tớ có bổ sung thêm 1 ít trong lệnh chuẩn bài 50
để câu lệnh linh hoạt và cậu tiện áp dụng chung cho các cột nhá.
 

File đính kèm

Upvote 0
Tôi xét công thức của bạn vì bạn viết
chứ không phải vì tôi đeo bám.

1. Ở bài đầu tiên tôi trả lời bạn (bài #33) thì tôi lấy công thức duy nhất mà bạn gửi trong bài có dòng trích ở trên. Sau đó bạn gửi tập tin (bài #34) mà trong đó có công thức khác cho C10 (tôi đã chỉ rõ trong bài #50). Có lẽ thiếu xót này (tôi nghĩ sau đó bạn sửa trong tập tin của mình nhưng không sửa trên GPE) là do bạn chứ không phải do tôi?

2. Sau khi bạn đính kèm tập tin (bài #34) thì tôi thắc mắc vụ Số chứ không phải là thời gian dạng hh:mm:ss. Tôi chưa hiểu là bạn làm theo chủ chủ đề nên thắc mắc.
Sau khi bạn giải thích ở bài #51
tác giả muốn để ở số giờ là dạng số không phải dạng thời gian
thì tôi không bao giờ vặn vẹo thêm chuyện tại sao là Số chứ không phải thời gian. Thậm chí tôi còn chỉ ra ra tôi chấp nhận dạng Số (bài #52)
Cứ coi như bạn có kết quả là số

Bạn có thể chỉ ra bài thứ 2 mà tôi vặn vẹo về Số chứ không phải thời gian? Tôi chỉ thắc mắc khi chưa hiểu rõ, sau khi được giải thích thì tôi có vặn veo thêm chuyện Số nữa đâu? Tôi đâu có phải loại cù nhầy?

3. Trong bài #52 và #55 tôi thắc mắc chuyện hoàn toàn khác
Bài #52
Trong tập tin của mình bạn có giờ vào ra là 28-08-17 09:00 và 28-08-17 13:30
Kết quả buổi chiều = 3,5. Cứ coi như bạn có kết quả là số.
Tức ở đây 3,5 = 13:30 - 10:00 = 3:30

Bây giờ bạn đổi thành giờ vào ra là 28-08-17 06:00 và 28-08-17 09:27. Bạn có buổi sáng cũng là 3,5.

Thế là thế nào? 3:30 là 3,5, và 3:27 cũng là 3,5?
Bài #55
Nhưng tôi chỉ không hiểu là sao 3:30 là 3,5 mà 3:27 cũng là 3,5

Nếu bạn cho là tôi đeo bám bạn thì cũng đành chịu. Âu cũng là khinh nghiệm cho những lần sau.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
NÓI CHUYỆN NGOÀI LỀ nếu chỉ nhằm mục đích tạo không khí thân thiện thì còn tạm chấp nhận được (dù vậy cũng hạn chế sa đà)
NÓI CHUYỆN NGOÀI LỀ mà cuối cùng chỉ dẫn đến những tranh chấp vô ích về quan điểm cá nhân thì.. thôi đi các bạn à!
--------------------------------------
Mọi người nên tự biết kiềm chế nhé!
 
Upvote 0
NÓI CHUYỆN NGOÀI LỀ nếu chỉ nhằm mục đích tạo không khí thân thiện thì còn tạm chấp nhận được (dù vậy cũng hạn chế sa đà)
NÓI CHUYỆN NGOÀI LỀ mà cuối cùng chỉ dẫn đến những tranh chấp vô ích về quan điểm cá nhân thì.. thôi đi các bạn à!
--------------------------------------
Mọi người nên tự biết kiềm chế nhé!
Dạ em cố gắng không muốn nói thêm nhưng bị công kích quá. Em cũng định nhờ anh xóa dùm những bài đăng thiếu kiềm chế của mình mà được xóa rồi cảm ơn.
 
Upvote 0
Đúng ra thì chả có gì là lớn. Chỉ xui xẻo là bài này tự dưng có mấy tay vào cố ý phá bỉnh nên rốt cuộc chả ai hiểu ai.
 
Upvote 0

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

Back
Top Bottom