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

bạn sửa lại chổ màu đỏ, code sẽ chạy đúng theo kết quả của công thức nhưng lại khác với kết quả của file mới???
Mã:
Sub tam1()
 Dim Arr(), dArr(), Rws As Long, J As Long
 Rws = [b65500].End(xlUp).Row
 'Cong ngay'
 Arr() = Range("F9:F" & Rws).Resize(, 21).Value
 ReDim dArr(1 To Rws, 1 To 1)
  For J = 1 To UBound(Arr())
    If Arr(J, 1) = "H" Or Arr(J, 1) = "N" Then
      If Arr(J, 11) >= [AA7] Then
        dArr(J, 1) = IIf(Arr(J, 10) <= [Q7], 8, ([AA7] - Arr(J, 10)) * 24 - Arr(J, 15) + Arr(J, 20))
      Else
        If [COLOR=#ff0000]Arr(J, 10)[/COLOR] >= [Q7] Then dArr(J, 1) = Arr(J, 12) - Arr(J, 15) + Arr(J, 20)
      End If
    End If
    If Arr(J, 1) = "D" Or Arr(J, 1) = "Z" Then
        dArr(J, 1) = 0
    ElseIf Arr(J, 21) >= 8 Then
        dArr(J, 1) = 8
      Else
        dArr(J, 1) = Arr(J, 21)
    End If
  Next J
 [AA9].Resize(Rws).Value = dArr()
End Sub
 
cả nhà ơi, cho em hỏi với. em là gà mới, e k biết cách đăng bài như thế nào để cả nhà thấy dc bài của em.
giúp em với
em đăng lên rồi mà nhưng e thấy trong 1 phút bài của ngta dc xem wa trời, còn bài cả em nãy giờ chưa thấy ai xem. k biết e có sai chỗ nào k nữa
 
cả nhà ơi, cho em hỏi với. em là gà mới, e k biết cách đăng bài như thế nào để cả nhà thấy dc bài của em.
giúp em với
em đăng lên rồi mà nhưng e thấy trong 1 phút bài của ngta dc xem wa trời, còn bài cả em nãy giờ chưa thấy ai xem. k biết e có sai chỗ nào k nữa
 
cả nhà ơi, cho em hỏi với. em là gà mới, e k biết cách đăng bài như thế nào để cả nhà thấy dc bài của em.
giúp em với
em đăng lên rồi mà nhưng e thấy trong 1 phút bài của ngta dc xem wa trời, còn bài cả em nãy giờ chưa thấy ai xem. k biết e có sai chỗ nào k nữa
bạn nhấn vào nút lệnh Đổi sang khung lớn phía dưới bên phải, rồi tìm chổ tải file
 
Mọi người thử xây dựng code tính công đêm giúp nhé: File em luôn update mới nhất ở bài #1 để tránh lãng phí tài nguyên forum chứ em không đính kèm ở các bài tiếp theo.

Quy tắc như sau: Giờ vào em viết tắt là V, ra viết tắt là R nhé

Nếu là ca D hoặc ca Z thì:

- Nếu V<=22 và R>=6 thì công là 8
- Nếu V<=22 và R<6 thì công nằm trong đoạn từ 22h đến R
- Nếu V>22 và R>=6 thì công nằm trong đoạn từ V đến 6h
- Nếu V>22 và R<6 thì công nằm trong đoạn từ V đến R
 
Lần chỉnh sửa cuối:
Phần này vượt ngoài khả năng của em rồi, mọi người giúp em với **~**
 
Mình sẽ giúp để khả năng của bạn vượt qua chướng ngại vật trước mắt:

Phần này vượt ngoài khả năng của em rồi, mọi người giúp em với **~**

Hiện trạng:
+ CSDL của bạn quá nhiều dòng dữ liệu
+Bạn đang chóng mặt với các dòng lệnh:
PHP:
'Cong dem'
 Arr() = [F9].Resize(Rws, 26).Value
 ReDim dArr(1 To Rws, 1 To 1)
 For J = 1 To UBound(Arr())
   If Arr(J, 1) = "D" Or Arr(J, 1) = "Z" Then
        If Arr(J, 10) <= [AC7] And Arr(J, 11) >= [AD7] Then
1            dArr(J, 1) = 8
        'Neu Cot 10 <= bang AC7 va cot 11 >= AD7 thi    '
        'Ket qua = 8'
        ElseIf Arr(J, 10) <= [AC7] And Arr(J, 11) < [AD7] Then
        dArr(J, 1) = (Arr(J, 11) - [AC7]) * 24 + Arr(J, 20)
        'Neu cot 10 <= AC7 va cot 11 > AD7 thi  '
        'Ket qua = (Cot 11 - AC7)*24 - Cot 15 + Cot 20
        ElseIf Arr(J, 10) > [AC7] And Arr(J, 11) >= [AD7] Then
        dArr(J, 1) = ([AD7] - Arr(J, 10)) * 24 + Arr(J, 20)
        'Neu cot 10 > AC7 va cot 11 >= AD7 thi  '
        'Ket qua = (AD7 - Cot 10)*24 - Cot 15 + Cot 20     '
        ElseIf Arr(J, 10) > [AC7] And Arr(J, 11) < [AD7] Then
        dArr(J, 1) = Arr(J, 12) + Arr(J, 20)
        'Neu cot 10 > AC7 va Cot 11 < AD7 thi   '
        'Ket qua = Cot 12 - Cot 15 + Cot 20 '
        End If
    Else
        dArr(J, 1) = 0
    End If
 Next J
 [AB9].Resize(Rws).Value = dArr()

Cách khắc fục
(+) Chỉ để lại 1 số dòng dữ liệu cần thiết mà thôi; Những dòng không cần thiết thì ẩn chúng đi
Viếc này nên sử dụng macro sau:

Mã:
Sub HiddenRowFor()
 Dim J As Long, Rws As Long
 Application.ScreenUpdating = False
 For J = 410 To 1190
    If Cells(J, "F") <> "D" And Cells(J, "F") <> "Z" Then
        Rows(J & ":" & J).Hidden = True
    End If
 Next J
 Application.ScreenUpdating = True
End Sub

(hiện macro này dùng để fục vụ cho dòng lệnh mang số 1 bên trên, ngõ hầu giúp ta chỉ hiện những dòng cần thiết, bị tác động bỡi dòng lệnh 1 của macro. Qua đó ta mới kiểm chứng từng dòng lệnh về tính đúng đắn của nó.)

Chứ cái mớ bòng bong CSDL kia thì ai mà chả ngán!

Chú í nữa là macro ẩn dòng, chỉ cần trong khoảng ta chọn có độ chục dòng cần thiết là được; Chứ chạy hết ngần í dòng thì mõi mòn là cái chắc.

Chúc bạn sớm có thành công mới!
 
Hiện trạng:
+ CSDL của bạn quá nhiều dòng dữ liệu
+Bạn đang chóng mặt với các dòng lệnh:
...

Anh ơi anh nói quá đúng, em chóng mặt khi phải rà soát dòng lệnh. Em nói thêm là câu lệnh đúng nhưng cái điều em đưa ra nó không hợp lý dẫn đến sai giờ công nhưng em chưa biết làm thế nào cả. Cái bí của em là trong cách tính công em nêu ở bài #1:

Ca1: Khung giờ công Từ 6h-14h;
Ca2: Khung giờ công Từ 14h-22h:
Ca ngày: Từ 8h đến 20h ---> Khung giờ công từ 8h đến 17h
Ca hành chính: Khung giờ công Từ 8h đến 17h
Ca đêm: Từ 20h đến 8h --> Khung giờ công là 22h đến 6h
Ca 3: Khung giờ công Từ 22h đến 6h

2. Quy tắc tính OVT với từng ca:

- OVT Đối với ca ngày, ca hành chính, ca 1 và ca 2: Nếu thời gian ra và về ngoài khung giờ công của ca làm mà giờ về <=22h thì số giờ chênh lệch ấy đều là OVT N và nếu tiếp tục giờ ra vượt cả 22h thì số vượt so với 22h ấy sẽ tính là OVT đêm 1( OVT D1)

- OVT đối với ca đêm, ca 3: Nếu đến sớm so với khung giờ công thì chênh lệch giờ đến thực tế và giờ đến theo khung giờ công sẽ được tính là OVT N và nếu tiếp tục có giờ ra vượt so với Khung giờ công ra thì chênh lệch giữa giờ ra thực tế với giờ ra theo khung giờ công ra sẽ được tính là OVT đêm 1 (OVT D1). Trường hợp trước đó không có OVT N thì số giờ chênh lệch này là OVT đêm 2 (OVT D2)

3. Quy tắc tính công ca làm:

Công ca làm dựa vào khung giờ công của mỗi ca ở trên.
 
Lần chỉnh sửa cuối:
bạn sửa lại chổ màu đỏ, code sẽ chạy đúng theo kết quả của công thức nhưng lại khác với kết quả của file mới???
Mã:
Sub tam1()
 Dim Arr(), dArr(), Rws As Long, J As Long
 Rws = [b65500].End(xlUp).Row
 'Cong ngay'
 Arr() = Range("F9:F" & Rws).Resize(, 21).Value
 ReDim dArr(1 To Rws, 1 To 1)
  For J = 1 To UBound(Arr())
    If Arr(J, 1) = "H" Or Arr(J, 1) = "N" Then
      If Arr(J, 11) >= [AA7] Then
        dArr(J, 1) = IIf(Arr(J, 10) <= [Q7], 8, ([AA7] - Arr(J, 10)) * 24 - Arr(J, 15) + Arr(J, 20))
      Else
        If [COLOR=#ff0000]Arr(J, 10)[/COLOR] >= [Q7] Then dArr(J, 1) = Arr(J, 12) - Arr(J, 15) + Arr(J, 20)
      End If
    End If
    If Arr(J, 1) = "D" Or Arr(J, 1) = "Z" Then
        dArr(J, 1) = 0
    ElseIf Arr(J, 21) >= 8 Then
        dArr(J, 1) = 8
      Else
        dArr(J, 1) = Arr(J, 21)
    End If
  Next J
 [AA9].Resize(Rws).Value = dArr()
End Sub

Ồ được rồi. Nhưng càng viết càng thấy chạy chậm :(
 
Ồ được rồi. Nhưng càng viết càng thấy chạy chậm :(
chạy chậm là đúng rồi, tất cả các code cho từng ô chỉ là tạm thời, nhằm chạy đúng thôi.
khi giải quyết được tất cả các ô, lúc đó mới gộp tất cả các code thành 1 code chung chỉ dùng 1 vòng lập lúc đó tốc độ nhanh thôi
qua 109 bài mà vấn đề của bạn chưa giải quyết được là do file của bạn đưa lên không hợp lý vừa dư vừa thiếu, và giải thích cách tính từng ô không rỏ và đầy đủ
file của bạn chỉ cần vài chục dòng, nhưng số liệu minh họa bạn phải làm lại, bạn phải cho đủ các trường hợp có thể xảy ra của công thức từng ô để cho các kết quả khác nhau, giải thích tại sao ra kết quả đó thì sẽ giải quyết nhanh thôi
chỉ là gợi ý, và quyết định thế nào là tùy bạn
 
Ừm, mình viết gần xong rồi. Xong cái mình up lại file và nói tóm gọn cách tính. Mình sửa nội dung ở bài 1# tưởng rõ ràng rồi !$@!!
 
Mình đang vướng ở công thức này:

darr(J, 1) = (IIf(Arr(J, 11) - [AA7] > 0 And (Arr(J, 11) - [AC7]) <= 0, Arr(J, 11) - [AA7], IIf(Arr(J, 11) - [AC7]) > 0, 5, 0))

Cách viết IIF như vậy đã đúng chưa mà khi chạy nó báo lỗi (Với dữ liệu Arr(J,11) là bằng 23H, AA7 LÀ 17H VÀ AC7 LÀ 22H
 
Lần chỉnh sửa cuối:
Mình đang vướng ở công thức này:

darr(J, 1) = (IIf(Arr(J, 11) - [AA7] > 0 And (Arr(J, 11) - [AC7]) <= 0, Arr(J, 11) - [AA7], IIf(Arr(J, 11) - [AC7]) > 0, 5, 0))

Cách viết IIF như vậy đã đúng chưa mà khi chạy nó báo lỗi (Với dữ liệu Arr(J,11) là bằng 23H, AA7 LÀ 17H VÀ AC7 LÀ 22H
Chỗ màu đỏ..............
 
Lần chỉnh sửa cuối:
Cảm ơn Befaint, cách viết trong vba khác hẳn trong hàm excel. Thảo nào làm mãi không xong.
 
Mừng quá mọi người ơi, nhờ tất cả mọi người mà em làm xong rồi nhưng cách viết hình như hơi củ chuối nên với 4000 dòng tính mất tận 2,5s. Thêm nữa em chưa biết làm sao để định dạng bang tính như mong muốn (Mọi người xem ở các dòng cuối file sẽ rõ. Mọi người xem giúp em về tính chính xác cũng như câu cú ổn chưa nhé.

Em cảm mọi người nhiều lắm!
 

File đính kèm

Lần chỉnh sửa cuối:
Anh ChanhTQ@ ơi cho em hỏi ạ: Tại sao giờ ở ô I9 là dạng chữ (có thể do kế toán điền nhầm) nhưng khi chạy code vẫn cho ra kết quả giờ đến và về mà không báo lỗi. Có phải là khi so sánh dữ liệu là chữ luôn lớn hơn mọi số bất kỳ.

Ngoài ra ở cột A từ A9 đến hết em đang phải dùng công thức để đếm trùng lặp. Nếu em muốn dùng VBA mà không dùng công thức thì em phải làm thế nào ạ?
 

File đính kèm

Anh ChanhTQ@ ơi cho em hỏi ạ: Tại sao giờ ở ô I9 là dạng chữ (có thể do kế toán điền nhầm) nhưng khi chạy code vẫn cho ra kết quả giờ đến và về mà không báo lỗi. Có phải là khi so sánh dữ liệu là chữ luôn lớn hơn mọi số bất kỳ.

Ngoài ra . . . .

Trong file của bạn có cơ man nào là macro với Code;

Bạn nói chạy Code là chạy Code nào vậy?
 
Trong file của bạn có cơ man nào là macro với Code;

Bạn nói chạy Code là chạy Code nào vậy?

Hì hì, anh ơi code "Tong thoi gian lam viec " anh nhé.

PHP:
'Tong Thòi Gian Làm Viec:
 Arr() = [F9].Resize(Rws, 8).Value
 ReDim dArr(1 To Rws, 1 To 3)
 ReDim a1Arr(1 To Rws, 1 To 1)
 For J = 1 To UBound(Arr())

    Sht = Arr(J, 1)

    If Arr(J, 6) <> "" And Arr(J, 7) <> "" And Arr(J, 8) <> "" Then

        dArr(J, 1) = Arr(J, 6):            dArr(J, 2) = Arr(J, 7)

    ElseIf Sht = "H" And Arr(J, 3) <= TimeSerial(8, 0, 0) And Arr(J, 4) >= TimeSerial(17, 0, 0) Or Sht = "N" And Arr(J, 3) <= TimeSerial(8, 0, 0) And Arr(J, 4) >= TimeSerial(20, 0, 0) Or Sht = "D" And Arr(J, 3) <= TimeSerial(20, 0, 0) And Arr(J, 4) >= TimeSerial(8, 0, 0) Or Sht = "X" And Arr(J, 3) <= TimeSerial(6, 0, 0) And Arr(J, 4) >= TimeSerial(14, 0, 0) Or Sht = "Y" And Arr(J, 3) <= TimeSerial(14, 0, 0) And Arr(J, 4) >= TimeSerial(22, 0, 0) Or Sht = "Z" And Arr(J, 3) <= TimeSerial(22, 0, 0) And Arr(J, 4) >= TimeSerial(6, 0, 0) Then

            dArr(J, 1) = GQC(Sht)
            dArr(J, 2) = GQC(Sht, False)
    Else

            dArr(J, 1) = 0
            dArr(J, 2) = 0
    End If

    dArr(J, 3) = (dArr(J, 2) - dArr(J, 1)) * 24

 Next J

 [O9].Resize(Rws, 3).Value = dArr()
 
Lần chỉnh sửa cuối:
Anh ChanhTQ ơi cho em hỏi về hàm này của anh:

PHP:
Private Function GQC(Vao As Single, Ra As Single, Shift As String, Optional Vo As Boolean = True) As Double
 Select Case Shift
 Case "D"
    If Vo Then
        GQC = TimeSerial(20, 0, 0)
    Else
        GQC = TimeSerial(32, 0, 0)
    End If
   
 Case "H"
    If Vo Then
        GQC = TimeSerial(8, 0, 0)
    Else
        GQC = TimeSerial(17, 0, 0)
    End If
   
 Case "N"
    If Vo Then
        GQC = TimeSerial(8, 0, 0)
    Else
        GQC = TimeSerial(20, 0, 0)
    End If
   
 Case "X"
    If Vo Then
        GQC = TimeSerial(6, 0, 0)
    Else
        GQC = TimeSerial(14, 0, 0)
    End If
   
 Case "Y"
    If Vo Then
        GQC = TimeSerial(14, 0, 0)
    Else
        GQC = TimeSerial(22, 0, 0)
    End If
 
 Case "Z"
    If Vo Then
        GQC = TimeSerial(22, 0, 0)
    Else
        GQC = TimeSerial(30, 0, 0)
    End If
 
 End Select
End Function

Vậy em muốn thêm trường hợp để xét điều kiện ra vào thì sao ạ?

Ví dụ ca đêm so sánh thêm giờ vào nhỏ hơn hoặc bằng 20h và giờ ra lớn hơn hoặc bằng 8h.

Vì hiện tại với hàm này thì nó sẽ chỉ xét theo ca mà không quan tâm giờ ra vào. Trường hợp này rất nguy hiểm nếu người chấm công không check kỹ để chấm vào giờ đặc biệt.
 
Web KT

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

Back
Top Bottom