Hỏi về file tính tương (1 người xem)

Liên hệ QC

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

Hai cột này mình tính từ lâu cho bạn rồi mà!
Sau đó còn tính thêm cho cột [Q] nữa

Bạn xem trong file mình đưa lên tại ô [o4] sẽ có số gy mà macro cần tiêu tốn để hoàn tất việc tính toán nữa kia!

Xem file này & so sánh với trang 'Luu' đi nha.

Anh ơi có nhầm lẫn gì không ạ. Em thấy khác hoàn toàn so với trang Luu.

Thêm nữa Hai cột anh nói em đã xem rồi và có trả lời lại anh. Giờ ra vào nó còn phụ thuộc ở cột đặc biệt, nếu cột đặc biệt có dữ liệu thì sẽ lấy ở cột đặc biệt. Em có bôi vàng ở trường hợp đặc biệt ấy anh (Dòng 14)

Thêm nữa anh để ý giúp em ở cột Q có ông thức là =+(P9-O9+(P9<O9))*24 để quy đổi ra giờ. Nếu em thử format cái kết quả này sang kết quả của sheet 20 thì dữ liệu nó thể hiện là 0.38

Hay nói cách khác ví dụ công cột Q tính ra là 9h thì sau khi được tính sẽ nhân với 24 để quy đổi ra số giờ làm. Còn nếu không nhân thì nó chỉ đơn giản là số 0.38 tương đương với 9h (Không còn là số lượng giờ làm nữa mà chỉ là điểm giờ )
 
Lần chỉnh sửa cuối:
Vẫn chưa thể hiểu đượclà: Tại sao tại [Q14] là 11.0
Còn đây là macro mới:
PHP:
Option Explicit
Sub TinhThoiGian()
 Dim Arr()
 Dim Rws As Long, J As Long, Tmr As Double
 Dim Sht As String
 
 Sheets("20").Select:           Tmr = Timer()
 Rws = [b9].CurrentRegion.Rows.Count
 Arr() = [b9].Resize(Rws, 12).Value
 ReDim dArr(1 To Rws, 1 To 3)
 For J = 1 To UBound(Arr())
    Sht = Arr(J, 5)
    If Arr(J, 11) > 0 And Arr(J, 12) > 0 Then
        dArr(J, 1) = Arr(J, 11)
        dArr(J, 2) = Arr(J, 12)
    Else
        dArr(J, 1) = Format(GQC(Sht), "hh:mm")
        dArr(J, 2) = Format(GQC(Sht, False), "hh:MM")
    End If
    If dArr(J, 2) > dArr(J, 1) Then
        dArr(J, 3) = GQC(Sht, False) - GQC(Sht)
    Else
        dArr(J, 3) = (1 + GQC(Sht) - GQC(Sht, False))
    End If
    dArr(J, 3) = 24 * dArr(J, 3)
 Next J
 [o4].Value = Timer() - Tmr
 [o9].Resize(Rws, 3).Value = dArr()
End Sub

Bạn chép cái này đè lên cái cũ;
Nhưng vẫn fải giữ lại hàm tự tạo đó nha.
 
Code của anh để em áp dụng xem nhé, cảm ơn anh nhiều lắm!

P/s: À em test rồi đúng như ý em ở cột O và P nhưng không hiểu sao khi tính ở cột Q nó vẫn ra là 8h @@. Sử dụng công thức =+(P14-O14+(P14<O14))*24 thì nó ra đúng 11h anh ạ. Có khi nào là do ảnh hưởng của Function GQC nên mặc dù phải dựa vào dữ liệu cột O và P nhưng nó vẫn ốp giờ theo từng ca không anh.
 
Lần chỉnh sửa cuối:
Cái dòng 14 í có ma thì fải; Cũng cách tính như vậy thì ở các dòng 423 trở xuống vẫn đạt iêu cầu của bạn.
 

File đính kèm

------------------------------------------
 
Vẫn không được anh ạ, dòng 14 nếu về 1h thì tính ra là tổng 11h nhưng code cho kết quả là 32h.
 
Lần chỉnh sửa cuối:
Vẫn không được anh ạ, dòng 14 nếu về 1h thì tính ra là tổng 11h nhưng code cho kết quả là 32h.
trong code không lấy các giá trị 14h và 1h để tính mà sử dung giờ qui định làm việc của ký hiệu "Y" là 14h và 22h
tạm diễn giải số 32= (1*24-14)+22
 
nếu sử dụng giờ quy định thì phải là 8h chứ bạn. Đoạn này mình không hiểu gì cả.
 
À, mình hiểu rồi. Thảo nào nếu theo khung giờ thì luôn đúng. Còn không theo khung giờ thì có vấn đề ngay. Khó nhỉ.
 
Xử lí tạm được rồi đây; Cảm ơn HieuCD rất nhiều!

PHP:
Option Explicit
Sub TinhThoiGian()
 Dim Arr()
 Dim Rws As Long, J As Long, Tmr As Double, tR1 As Double, tR2 As Double
 Dim Sht As String
 
 Sheets("20").Select:               Tmr = Timer()
 Rws = [b9].CurrentRegion.Rows.Count
 Arr() = [b9].Resize(Rws, 12).Value
 ReDim dArr(1 To Rws, 1 To 3)
 For J = 1 To UBound(Arr())
    Sht = Arr(J, 5)
    If Arr(J, 11) > 0 And Arr(J, 12) > 0 Then
        dArr(J, 1) = Arr(J, 11):    dArr(J, 2) = Arr(J, 12)
        If dArr(J, 2) > dArr(J, 1) Then
            dArr(J, 3) = dArr(J, 2) - dArr(J, 1)
        Else
            dArr(J, 3) = 1 - dArr(J, 1) + dArr(J, 2)
        End If
        dArr(J, 3) = 24 * dArr(J, 3)
    Else
        dArr(J, 1) = Format(GQC(Sht), "hh:mm")
        dArr(J, 2) = Format(GQC(Sht, False), "hh:MM")
        If dArr(J, 2) > dArr(J, 1) Then
            dArr(J, 3) = GQC(Sht, False) - GQC(Sht)
        Else
            dArr(J, 3) = (1 - GQC(Sht) + GQC(Sht, False))                        '   1   '
        End If
        dArr(J, 3) = 24 * dArr(J, 3)
    End If
 Next J
 [o4].Value = Timer() - Tmr
 [o9].Resize(Rws, 3).Value = dArr()
End Sub
 
PHP:
Option Explicit
Sub TinhThoiGian()
 Dim Arr()
 Dim Rws As Long, J As Long, Tmr As Double, tR1 As Double, tR2 As Double
 Dim Sht As String
 
 Sheets("20").Select:               Tmr = Timer()
 Rws = [b9].CurrentRegion.Rows.Count
 Arr() = [b9].Resize(Rws, 12).Value
 ReDim dArr(1 To Rws, 1 To 3)
 For J = 1 To UBound(Arr())
    Sht = Arr(J, 5)
    If Arr(J, 11) > 0 And Arr(J, 12) > 0 Then
        dArr(J, 1) = Arr(J, 11):    dArr(J, 2) = Arr(J, 12)
        If dArr(J, 2) > dArr(J, 1) Then
            dArr(J, 3) = dArr(J, 2) - dArr(J, 1)
        Else
            dArr(J, 3) = 1 - dArr(J, 1) + dArr(J, 2)
        End If
        dArr(J, 3) = 24 * dArr(J, 3)
    Else
        dArr(J, 1) = Format(GQC(Sht), "hh:mm")
        dArr(J, 2) = Format(GQC(Sht, False), "hh:MM")
        If dArr(J, 2) > dArr(J, 1) Then
            dArr(J, 3) = GQC(Sht, False) - GQC(Sht)
        Else
            dArr(J, 3) = (1 - GQC(Sht) + GQC(Sht, False))                        '   1   '
        End If
        dArr(J, 3) = 24 * dArr(J, 3)
    End If
 Next J
 [o4].Value = Timer() - Tmr
 [o9].Resize(Rws, 3).Value = dArr()
End Sub


Vâng em vừa test thử ok khâu giờ đầu vào rồi anh ạ /-*+/
 
Công thức mà nói, mình gà mờ; Nên cho hỏi trong trường hợp:

=IF(AND(OR(F9="X",F9="Y",F9="Z"),Q9>=8.5),SUM(Q9-0.5),ROUND(Q9-T9-W9,2))

OR(F9="X",F9="Y",F9="Z")
có thể thay bỡi mệnh đề khác đơn giản hơn không vậy?

với lại SUM(Q9-0.5) định hù ai chứ gì?
 
Công thức mà nói, mình gà mờ; Nên cho hỏi trong trường hợp:

=IF(AND(OR(F9="X",F9="Y",F9="Z"),Q9>=8.5),SUM(Q9-0.5),ROUND(Q9-T9-W9,2))

OR(F9="X",F9="Y",F9="Z")
có thể thay bỡi mệnh đề khác đơn giản hơn không vậy?

với lại SUM(Q9-0.5) định hù ai chứ gì?

Vâng, công thức trên nghĩa là nếu ca ở cột F9 là X hoặc Y hoặc Z, và giờ công Q9>=8.5 thì công được tính sẽ bị trừ 0.5h. Các trường hợp còn lại công bị trừ giờ ăn ở cột T và W
 
Tính đến cột -X:x] rồi đây:
PHP:
Sub TinhThoiGian()
 Dim Arr()
 Dim Rws As Long, J As Long, Tmr As Double, tR1 As Double, tR2 As Double
 Dim Sht As String
 
 Sheets("20").Select:                       Tmr = Timer()
 Rws = [b9].CurrentRegion.Rows.Count
 Arr() = [F9].Resize(Rws, 8).Value
 ReDim dArr(1 To Rws, 1 To 3)
 ReDim a1Arr(1 To Rws, 1 To 1)
'Tong Thòi Gian Làm Viec:'
 For J = 1 To UBound(Arr())
    Sht = Arr(J, 1)
    If Arr(J, 7) > 0 And Arr(J, 8) > 0 Then
        dArr(J, 1) = Arr(J, 7):            dArr(J, 2) = Arr(J, 8)
        If dArr(J, 2) > dArr(J, 1) Then
            dArr(J, 3) = dArr(J, 2) - dArr(J, 1)
        Else
            dArr(J, 3) = 1 - dArr(J, 1) + dArr(J, 2)
        End If
    Else
        dArr(J, 1) = Format(GQC(Sht), "hh:mm")
        dArr(J, 2) = Format(GQC(Sht, False), "hh:MM")
        If dArr(J, 2) > dArr(J, 1) Then
            dArr(J, 3) = GQC(Sht, False) - GQC(Sht)
        Else
            dArr(J, 3) = (1 - GQC(Sht) + GQC(Sht, False))                        '   1   '
        End If
    End If
    dArr(J, 3) = 24 * dArr(J, 3)
 Next J
 [o9].Resize(Rws, 3).Value = dArr()
'Com Giua Ca I:'
 Arr() = [R9].Resize(Rws, 2).Value
 ReDim dArr(1 To Rws, 1 To 1)
 For J = 1 To UBound(Arr())
    If Arr(J, 1) > 0 Then
        dArr(J, 1) = Format(Arr(J, 2) - Arr(J, 1), "hh:mm")
    End If
 Next J
 [t9].Resize(Rws).Value = dArr()
 'Com Giua Ca II:'
 Arr() = [u9].Resize(Rws, 2).Value
 ReDim dArr(1 To Rws, 1 To 1)
 For J = 1 To UBound(Arr())
    If Arr(J, 1) > 0 Then
        dArr(J, 1) = Format(Arr(J, 2) - Arr(J, 1), "hh:mm")
    End If
 Next J
 [w9].Resize(Rws).Value = dArr()
 
 'Tong TG Làm Viec Thuc Té:'
 Arr() = [F9].Resize(Rws, 18).Value
 ReDim dArr(1 To Rws, 1 To 1)
 For J = 1 To UBound(Arr())
    If Arr(J, 1) > "W" And Arr(J, 12) > 8.5 Then
        dArr(J, 1) = Arr(J, 12) - 0.5
    Else
        dArr(J, 1) = Arr(J, 12) - Arr(J, 15) - Arr(J, 18)
    End If
 Next J
 [X9].Resize(Rws).Value = dArr()
 
 [o4].Value = Timer() - Tmr
End Sub
 
Anh ơi hình như lại mắc lỗi điểm giờ chứ không phải số giờ. Em bắt chước anh thêm code dArr(J, 3) = 24 * dArr(J, 3) nhưng không thấy có tác dụng +-+-+-+
 
Ôi mấy cái số liệu giờ giấc này lộn xộn quá đi mất:

dArr(J, 1) = Arr(J, 12) - 24 * (Arr(J, 15) + Arr(J, 18))
 
Anh ơi không nhất thiết phải theo loại định dạng mẫu miễn là tính giờ công chuẩn là được anh ạ. Em cho thế này chắc là sai, không thấy nó chạy anh ạ.

Thêm nữa là ID cuối
[TABLE="width: 76"]
[TR]
[TD="class: xl65, width: 76"]90448[/TD]
[/TR]
[/TABLE]
ở dòng 4178 nhưng mảng tính giờ nó gán đến dòng 4610 là sao anh nhỉ?


'Com Giua Ca I:'
...
dArr(J, 1) = Format(Arr(J, 2) - Arr(J, 1), "hh:mm")
End If
dArr(J, 1) = Arr(J, 12) - 24 * (Arr(J, 15) + Arr(J, 18))
Next J
[t9].Resize(Rws).Value = dArr()
'Com Giua Ca II:'
...
dArr(J, 1) = Format(Arr(J, 2) - Arr(J, 1), "hh:mm")
End If
dArr(J, 1) = Arr(J, 12) - 24 * (Arr(J, 15) + Arr(J, 18))
Next J
[w9].Resize(Rws).Value = dArr()
 
Lần chỉnh sửa cuối:
[thongbao]Thêm nữa là ID cuối
[TABLE="class: cms_table, width: 76"]
[TR]
[TD="class: cms_table_xl65, width: 76"]90448[/TD]
[/TR]
[/TABLE]
ở dòng 4178 nhưng mảng tính giờ nó gán đến dòng 4610 là sao anh nhỉ?[/thongbao]

Tham biến Rws đang tất tần tật các dòng chứa dữ liệu;

Để tịnh tiến đến dòng 4178 hiện giờ cần làm 2 việc như sau:
Xóa hết các dòng sau dòng dữ liệu này;
Xóa các dữ liệu hiện có trên dòng 5

Lúc đó macro sẽ khả dĩ hơn trong việc bổ sung dữ liệu;

Tất nhiên có cách khác để macro không làm chuyện dư thừa này; Nhưng để sau đi, vì quan trọng gì chuyện này kia chứ.
 
Web KT

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

Back
Top Bottom