Em đang ở quê không có máy tính để xem. Chiều em xem lại anh nhé. Công thức từ đời trước thú thực em cũng thấy làm sao ấy nó không được khoa học và nhiều cột tính kỳ quặc.
Sub Tam()
Dim Arr(), dArr(), Rws As Long, J As Long
Rws = [b9].CurrentRegion.Rows.Count
'Tong TG Làm Viec Duoc Tinh'
Arr() = [F9].Resize(Rws, 20).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
dArr(J, 1) = Arr(J, 12) - Arr(J, 15) + Arr(J, 20) - IIf(Arr(J, 11) <= [Q8], Arr(J, 18), 0)
Else
dArr(J, 1) = Arr(J, 12) + IIf(Arr(J, 1) <> "D" And Arr(J, 12) < 8, Arr(J, 20), 0)
End If
Next J
[Z9].Resize(Rws).Value = dArr()
End Sub
Sub Tam()
Dim Arr(), dArr(), Rws As Long, J As Long
Rws = [b9].CurrentRegion.Rows.Count
'Tong TG Làm Viec Duoc Tinh'
Arr() = [F9].Resize(Rws, 20).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
dArr(J, 1) = Arr(J, 12) - Arr(J, 15) + Arr(J, 20) - IIf(Arr(J, 11) <= [Q8], Arr(J, 18), 0)
Else
dArr(J, 1) = Arr(J, 12) + IIf(Arr(J, 1) <> "D" And Arr(J, 12) < 8, Arr(J, 20), 0)
End If
Next J
[Z9].Resize(Rws).Value = dArr()
End Sub
Cảm ơn HieuCD, bạn nhiệt tình quá, để mình thử viết xem sao. Mình vẫn đang vướng ở Giờ ăn 1 về quy đổi thời gian mà theo gợi ý của anh ChanhTQ mình chưa làm được.
Để chủ bài viết có hành trang nào đó mạnh dạn lao vô VBA, mình xin chuyển đổi ngôn ngữ VBA của anh HieuCD sang tiếng Việt cho nha:
PHP:
Sub Tam()
Dim Arr(), dArr(), Rws As Long, J As Long
1 Rws = [b9].CurrentRegion.Rows.Count
'Tong TG Làm Viec Duoc Tinh'
Arr() = [F9].Resize(Rws, 20).Value
3 ReDim dArr(1 To Rws, 1 To 1)
For J = 1 To UBound(Arr())
5 If Arr(J, 1) = "H" Or Arr(J, 1) = "N" Then
dArr(J, 1) = Arr(J, 12) - Arr(J, 15) + Arr(J, 20) - IIf(Arr(J, 11) <= [Q8], Arr(J, 18), 0)
7 Else
dArr(J, 1) = Arr(J, 12) + IIf(Arr(J, 1) <> "D" And Arr(J, 12) < 8, Arr(J, 20), 0)
9 End If
Next J
11 [Z9].Resize(Rws).Value = dArr()
End Sub
Dòng lệnh trước D1:Khai báo các biến cần xài trong chương trình;
Trong đó có 2 biến là mảng & 2 biến sau có thể chứa dữ liệu dạng số (Long)
D1: Đem số dòng của vùng dữ liệu xung quanh [B9] ấn vô biến (Rws) đã khai báo
(Dòng tiếp sau đó là ghi chú của chương trình)
D2: Lấy dữ liệu bắt đầu từ ô F9 trãi dài xuống dưới Rws dòng & 20 cột đem ấn vô biến mảng (đã khai báo)
D3: (Tái) khai báo 1 biến mảng gồm Rws dòng & 1 cột. (để chứa dữ liệu tính toán được & sau đó ghi xuống trang tính)
D4: Tạo 1 vòng lặp theo biến đếm J bắt đầu từ 1 cho đến dòng cuối của mảng. (Mà cũng có thể hiểu là Rws)
D5: Điều kiện nếu trị trong thành tố đầu trong mảng (của dòng đang duyệt) là “H” hay “N” thì thực hiện lệnh D6
D6: Trước tiên ta đề cập đến hàm IIF() trong VBA:
Trước hàm này có dấu (fép) trừ, nên ta diễn dịch như sau:
(Trị tính toán từ mệnh đề trước) đem trừ đi với trị tại cột 18 của dòng đang duyệt của mảng; Nếu trị tại cột 11 (của mảng) nhỏ hơn hay bằng trị trong ô [q8]
Nếu không thì trừ đi với 0
Mệnh đề trước của hàm này có nghĩa như sau:
Đem trị trong cột 12 của (dòng đang duyệt) mảng trừ đi trị trong cột 15 & cọng với trị trong cột 20
D7: Nếu không (thỏa Đ/K D5) thì thực thi dòng tiếp theo
D8: (Hàm IIF() trong VBA ở đây nói rằng: (trị trong mệnh đề trước đó) được cộng thêm trị tại cột 20 của mảng nếu thỏa cả 2 điều kiện sau:
Thứ nhất: Trị trong cột đầu (của dòng đang duyệt) đang khác “D”
Thứ hai: Trị trong cột 12 của dòng mảng đang duyệt bé hơn 8
Nếu không thỏa 2 điều kiện này thì cộng với 0
D9: Kết thúc Đ/K (ở D5)
D10: Kết thúc vòng lặp (duyệt mảng)
D11:Cột Z bắt đầu từ z9 fát triển xuống dưới Rws dòng được nhận trị chứa trong mảng dArr()
Được cái là anh HieuCD rất ưu ái tác gia bài đăng vì xử dụng tên các biến trùng khớp hoàn toàn với Code các bài trên; Nên rất dễ thực hiện.
& rất chúc bạn thành công!