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

Mình có cảm giác là công thức này:

=IF(AND(OR(F10="H",F10="N"),P10<=$Q$8),SUM(Q10-T10-W10+Y10),IF(AND(OR(F10="H",F10="N"),P10>$Q$8), SUM(Q10-T10+Y10),IF(F10="D",Q10,IF(AND(OR(F10="X",F10="Y",F10="Z"),Q10>=8),Q10,Q10+Y10))))

Có thể rút gọn lài được nữa.

Chúc mọi người vui vẻ nhân dịp xuân về!
 
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.
 
Anh ơi em xem ký rồi, hàm đó không viết ngắn hơn được trừ khi thay đổi hẳn cách tính bằng hàm khác anh ạ.
 
bạn dùng công thức thay thế xem sao
Mã:
=IF(OR(F10="H",F10="N"),Q10-T10+Y10-IF(P10<=$Q$8,W10,0),IF(AND(F10<>"D",Q10<8),Q10+Y10,Q10))

Cảm ơn bạn nhé. Anh ChanhTQ ơi viết theo hàm này dễ hiểu hơn này anh.

Nhân tiện bạn HieuCD xem qua các hàm này giúp mình nhé:

Hàm 1:
=IF(AND(OR(F9="N",F9="H"),O9<=$Q$7,P9>=$AA$7),8,IF(AND(OR(F9="N",F9="H"),O9>=$Q$7,P9>=$AA$7),($AA$7-O9)*24-T9+Y9,IF(AND(OR(F9="N",F9="H"),O9>=$Q$7,P9<$AA$7),(P9-O9)*24-T9+Y9,IF(OR(F9="D",F9="Z"),0,IF(AND(OR(F9="X",F9="N",F9="H",F9="Y"),Z9>=8),8,IF(AND(OR(F9="N",F9="H"),O9>=$Q$7,P9<$AA$7,K9="ve som",Z9>=8),8,Z9))))))

Cái hàm 1 này mình không hiểu phần chữ đỏ cả hai đều có trường hợp "=".

Hàm 2:
=IF(AND(OR(F9="D",F9="Z"),SUM(Z9-AC9-AD9-AE9)>8),8,IF(AND(OR(F9="D",F9="Z"),SUM(Z9-AC9-AD9-AE9)<=8),SUM(Z9-AC9-AD9-AE9),0))

Hàm 3:
=ROUND(IF(AND(OR(F9="N",F9="H",F9="X",F9="Y"),P9<=$AC$7),SUM(Z9-AA9),IF(AND(OR(F9="N",F9="H",F9="X"),P9>$AC$7),SUM(Z9-AA9-SUM(P9-$AC$7)*24),IF(AND(OR(F9="D",F9="Z"),Z9>0,O9<$AC$7),SUM(($AC$7-O9)*24),IF(AND(F9="Y",Z9>0,O9<$AE$7),SUM(($AE$7-O9)*24),0)))),2)

Hàm 4: =IF(AC9>0,IF(AND(OR(F9="D",F9="Z"),P9>$AD$7,P9<=$AB$7),SUM((P9-$AD$7)*24),IF(AC9>0,IF(AND(OR(F9="X",F9="Y",F9="N",F9="H"),P9>$AC$7),SUM((P9-$AC$7)*24),0))),0)

Hàm 5: =IF(AC9=0,IF(AND(OR(F9="D",F9="Z"),P9>$AD$7,P9<=$AB$7),SUM((P9-$AD$7)*24),IF(AC9=0,IF(AND(OR(F9="Y",F9="N",F9="H"),P9>$AC$7),SUM((P9-$AC$7)*24),0))),0)
 
Lần chỉnh sửa cuối:
Cảm ơn bạn nhé. Anh ChanhTQ ơi viết theo hàm này dễ hiểu hơn này anh.

Có mà điên đến khùng mới làm vậy!

Thực ra hàm hiện tại trên trang tính dễ chuyển sang Code hơn nhiều so với công thức mới fát kiến này!

Nhưng có điều khi viết xong code thì số liệu cột [Z] ở 2 trang tính lại có 1 số lệch lạc.

Chắc lại do dữ liệu thời gian gây khổ đau nữa đây!
 
Có mà điên đến khùng mới làm vậy!

Thực ra hàm hiện tại trên trang tính dễ chuyển sang Code hơn nhiều so với công thức mới fát kiến này!

Nhưng có điều khi viết xong code thì số liệu cột [Z] ở 2 trang tính lại có 1 số lệch lạc.

Chắc lại do dữ liệu thời gian gây khổ đau nữa đây!

:D em thấy nó xúc tích hơn, kết hợp nhiều bước thành một bước ngắn gọn nên tưởng sẽ code dễ hơn.
 
:D em thấy nó xúc tích hơn, kết hợp nhiều bước thành một bước ngắn gọn nên tưởng sẽ code dễ hơn.

Thì bạn cứ diễn dịch các công thức í sang tiếng Việt thì sẽ rõ ngay tấp lự í mà! --=-- --=-- --=--
 
bạn dùng công thức thay thế xem sao
Mã:
=IF(OR(F10="H",F10="N"),Q10-T10+Y10-IF(P10<=$Q$8,W10,0),IF(AND(F10<>"D",Q10<8),Q10+Y10,Q10))
tạm viết thành code
Mã:
'Z10=IF(OR(F10="H",F10="N"),Q10-T10+Y10-IF(P10<=$Q$8,W10,0),IF(AND(F10<>"D",Q10<8),Q10+Y10,Q10))
'Z10=IF(OR(F10="H",F10="N"),Q10-T10+Y10-IF(P10<=$Q$8,W10,0),Q10+IF(AND(F10<>"D",Q10<8),Y10,0))
' Với biến i là thứ tự dòng

'....
If Cells(i, "F") = "H" Or Cells(i, "F") = "N" Then
    Cells(i, "Z") = Cells(i, "Q") - Cells(i, "T") + Cells(i, "Y") - IIf(Cells(i, "P") <= Cells(8, "Q"), Cells(i, "W"), 0)
Else
    Cells(i, "Z") = Cells(i, "Q") + IIf(Cells(i, "F") <> "D" And Cells(i, "Q") < 8, Cells(i, "Y"), 0)
End If
'....
 
Ô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))

Em thêm cái này nhưng không thấy chạy không biết em có thêm đúng chỗ không.

PHP:
'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:
Anh ChanhTQ hôm nay bận gì rồi !$@!!
 
tạm viết thành code
Mã:
'Z10=IF(OR(F10="H",F10="N"),Q10-T10+Y10-IF(P10<=$Q$8,W10,0),IF(AND(F10<>"D",Q10<8),Q10+Y10,Q10))
'Z10=IF(OR(F10="H",F10="N"),Q10-T10+Y10-IF(P10<=$Q$8,W10,0),Q10+IF(AND(F10<>"D",Q10<8),Y10,0))
' Với biến i là thứ tự dòng

'....
If Cells(i, "F") = "H" Or Cells(i, "F") = "N" Then
    Cells(i, "Z") = Cells(i, "Q") - Cells(i, "T") + Cells(i, "Y") - IIf(Cells(i, "P") <= Cells(8, "Q"), Cells(i, "W"), 0)
Else
    Cells(i, "Z") = Cells(i, "Q") + IIf(Cells(i, "F") <> "D" And Cells(i, "Q") < 8, Cells(i, "Y"), 0)
End If
'....

Ừm code chạy không có vấn đề gì nhưng mình đang muốn viết thành dạng mảng :). Cảm ơn bạn nhé!
 
Ừm code chạy không có vấn đề gì nhưng mình đang muốn viết thành dạng mảng :). Cảm ơn bạn nhé!
bạn tham khảo code và chỉnh lại theo ý riêng
Mã:
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
 
bạn tham khảo code và chỉnh lại theo ý riêng
Mã:
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!
 
Cảm ơn tất cả rất là nhiều ;;;;;;;;;;;, có kết quả em đưa lên ngay, vướng chỗ nào mong mọi người chỉ giáo tiếp :).

Cho em hỏi hóa ra trong vba còn có cả chuyện chữ cái lớn hơn hả. Em nghĩ vậy không biết đúng không vì trong code sau:

PHP:
'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

Có đoạn If Arr(J, 1) > "W", hay thật.
 
Web KT

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

Back
Top Bottom