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

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

tueyennhi

Thành viên tích cực
Tham gia
18/10/10
Bài viết
1,192
Được thích
105
Hỏi về file tính công

Chào anh chị ạ!


Em up lại file tính công.

Một số quy tắc như sau:


1. Quy tắc chung:
- Có OVT N thì OVT Đ sẽ đều là Đ1
- Giờ làm theo căn cứ vào khung giờ đến của ca. Nếu về muộn so với khung giờ thì tối thiểu 30 phút mới được tính, những phút tiếp theo tối thiểu nhảy cách 15p.

Ví dụ: Ca 1 khung giờ là 6-14h. Về trong khoảng 14h30 đến 14h44 thì được tính là 14h30. Về 14h45 đến 14h59 thì tính là 14h45 (Về 14h29 thì tính là 14h). Lý thuyết như vậy nhưng nếu trong cột ô đặc biệt bộ phận làm tròn 14h29 thành 14h30 thì em cũng suy xoa cho qua. Ô giờ đặc biệt kế toán họ chấm em sẽ căn cứ giờ quẹt thẻ nếu chênh lệch 1 vài phút thì em cho qua.

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ì đề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.

P/s1: Còn có điều liên quan đến trừ giờ ăn:

Ca1, Ca2, Ca3, Ca đêm: Không bị trừ giờ ăn.
Ca ngày, Ca đêm, Hành chính bị trừ "Thời gian ăn 1" nếu có.

Em cảm ơn!

P/s2: Em update file em đang làm dở nhờ sự giúp đỡ của anh ChanhTQ và tất cả mọi người. Hiện không hiểu sao lỗi mà code không chạy, mọi người xem giúp em nhé.

P/s3: Các vấn đề Ps 1 và 2 đã giải quyết. Con đường càng đi về sau càng khó, mọi người xem giúp em xây dựng code để tính ca đêm như nào nhé. Em cảm ơn ạ!


P/s4: Em đa viết xong tuy nhiêu cảm giác cả bộ máy hoạt động cồng kềnh nặng nề thế nào ấy. Ngoài ra định dạng phải làm thủ công ở dưới. Mọi người tham khảo file và xem giúp em nhé.
 

File đính kèm

Lần chỉnh sửa cuối:
Thì bạn chuyển sang ghi kết quả vô cột 'Qui ra công' bằng VBA đi.

Tuy nhiên để làm điều này trong công thức hiện thời:
=IF(AND(OR(F9="hanh chinh",F9="ca ngay"),W9>0,X9=0),ROUND(W9/8,2),IF(AND(F9="ca1",W9=8,X9=0),"K1",IF(AND(F9="ca1",W9<8,W9>0,X9=0),ROUND(W9/8,2)&"K1",IF(AND(F9="ca2",W9=8,X9=0),"K2",IF(AND(F9="ca2",W9<8,W9>0,X9=0),ROUND(W9/8,2)&"K2",IF(AND(F9="ca3",W9=0,X9=8),"K3",IF(AND(F9="ca3",W9=0,X9<8,X9>0),ROUND(X9/8,2)&"K3",IF(AND(F9="ca dem",W9=0,X9=8),"Đ",IF(AND(F9="ca dem",W9=0,X9<8,X9>0),ROUND(X9/8,2)&"Đ",IF(AND(W9=0,X9=0),"N",""))))))))))


Cần mấy sửa đổi nhỏ như sau:
(*) Không nên xài kí tự tiếng Việt, như 'Đ' trong công thức
(*) Rút gọn bớt các từ; Mà tốt hơn cả là làm sao chúng có độ dài như nhau, như 'D' => 'Dem'; 'Hanh chính' => 'HCh', . . . .

Vấn đề nữa trong CSDL của bạn là nên mã hóa các chức danh; Ví dụ

Ở cột [Shift] ta chỉ có 6 chức danh; Ta nên gán cho nó mã từ (A...F); Tương tự như vậy với trường [Position] ta có 11 chức danh; Cho nên sẽ tốt nếu bạn đem các chữ cái (A...K) gán cho chúng.
Làm điều này thì bạn đỡ tốn bộ nhớ máy khi thao tác.

Vài lới tham khảo cùng bạn.
 
Thì bạn chuyển sang ghi kết quả vô cột 'Qui ra công' bằng VBA đi.

Tuy nhiên để làm điều này trong công thức hiện thời:
=IF(AND(OR(F9="hanh chinh",F9="ca ngay"),W9>0,X9=0),ROUND(W9/8,2),IF(AND(F9="ca1",W9=8,X9=0),"K1",IF(AND(F9="ca1",W9<8,W9>0,X9=0),ROUND(W9/8,2)&"K1",IF(AND(F9="ca2",W9=8,X9=0),"K2",IF(AND(F9="ca2",W9<8,W9>0,X9=0),ROUND(W9/8,2)&"K2",IF(AND(F9="ca3",W9=0,X9=8),"K3",IF(AND(F9="ca3",W9=0,X9<8,X9>0),ROUND(X9/8,2)&"K3",IF(AND(F9="ca dem",W9=0,X9=8),"Đ",IF(AND(F9="ca dem",W9=0,X9<8,X9>0),ROUND(X9/8,2)&"Đ",IF(AND(W9=0,X9=0),"N",""))))))))))


Cần mấy sửa đổi nhỏ như sau:
(*) Không nên xài kí tự tiếng Việt, như 'Đ' trong công thức
(*) Rút gọn bớt các từ; Mà tốt hơn cả là làm sao chúng có độ dài như nhau, như 'D' => 'Dem'; 'Hanh chính' => 'HCh', . . . .

Vấn đề nữa trong CSDL của bạn là nên mã hóa các chức danh; Ví dụ

Ở cột [Shift] ta chỉ có 6 chức danh; Ta nên gán cho nó mã từ (A...F); Tương tự như vậy với trường [Position] ta có 11 chức danh; Cho nên sẽ tốt nếu bạn đem các chữ cái (A...K) gán cho chúng.
Làm điều này thì bạn đỡ tốn bộ nhớ máy khi thao tác.

Vài lới tham khảo cùng bạn.

Vâng cho em hỏi rút ý 2 rút gọn để có độ dài như nhau mục đích là để làm gì ạ?
Và gán chức danh trường [Position] thành các ký tự mục đích cũng để làm gì ạ? Có cải thiện được nhiều không ạ?
 
... Có cải thiện được nhiều không ạ?

Sổ lương 10.000 người là tầm cỡ quy mô lớn (*)
Công ty lớn thi sổ sách phải có quy trình đầy đủ, có thể kiểm toán được.
Muốn cải thiện, bạn phải đưa cái quy trình ấy ra. Từ ấy mới có thể phân tích thiết kế sắp xếp dữ liệu. Công thức phải rõ rệt (ví dụ công nhân khiếu nại thì ngừoi giữ sổ lương phải có khả năng chứng minh là công thức tính đúng quy trình và hợp đồng lao động)
Nếu là tôi, sau khi thiết kế xong tôi còn đem lên Kế Toán Trưởng duyệt. Về sau này, lỗi gì thì có ngừoi này chịu mọt phần.

(*) nếu trung bình một ngừoi lĩnh 2 triệu/tháng thì cty này chi ra 20 tỷ/tháng cho tiền lương. Ước tính doanh thu thử xem!
 
Vậy để tối nay mình lập cái quy trình vì thực ra mình mới chuyển mảng này và chẳng có cái quy trình nào ngoài quy trình miệng và file từ xa xưa.
 
Em chẳng biết mô tả cái quy trình thế nào nữa chỉ có cái form tính. Anh chị xem giúp em nhé ví dụ nếu chuyển tất cả sang VBA thì sẽ như thế nào?
 
Em chẳng biết mô tả cái quy trình thế nào nữa chỉ có cái form tính. Anh chị xem giúp em nhé ví dụ nếu chuyển tất cả sang VBA thì sẽ như thế nào?

Chuyển cái quy trình miệng và cái trong công thức đang tính ở trên thành văn bản.
Văn bản sau khi được Lãnh đạo công ty duyệt thì đem nó vào áp dụng (công thức hay vba thì phải căn cứ vào đó).
- Thời gian làm việc/ngày, giờ vào, giờ ra.
- Ca làm việc/ngày, bao nhiêu ca làm việc, số giờ/ca làm việc.
- Quy định về làm tròn giờ làm việc (làm tròn tới giờ, phút...)
- Quy định về làm bù giờ, làm tăng ca, làm vào ngày Lễ, Tết các kiểu... tương với đó thì hệ số lương như nào.
 
Ừm trươc mắt mình thay đổi một số cái linh tinh cho dữ liệu gọn gàng khoa học rồi nhờ mọi người sau vậy. Cho mình hỏi ngoài lề chút có một công thức mà nghĩ mãi không ra đại loại như thế này:

A1,(loại 1, loại 2, loại 3),(1,3,2). Ý nghĩa của nó là căn cứ vào dữ liệu ở ô A1 mà xếp thứ hạng tương ứng trong (1,3,2) ví dụ nếu là loại 1 thì là 1, loại 2 thì là 3.... Cách đánh hàm như trên không chắc đúng, mọi người có ai nhớ là hàm gì không thì chỉ cho em nhé.
 
Lần chỉnh sửa cuối:
Có anh chị nào biết đấy là hàm gì không (A,D,X,F) và (5,2,8,1)

Tại A1 có các giá trị hoặc là A hoặc là D hoặc là E hoặc là F, tại B1 đánh hàm đối chiếu giá trị A1 nếu A1 mang giá trị là A thì hàm ra kết quả là 5 nếu mang giá trị D thì hàm ra kết quả là 2 nếu A1 mang giá trị X thì hàm ra kết quả là 8 nếu A1 là F thì hàm ra kết quả là 1.

Có một hàm có tác dụng như vậy mà em không tài nào nhớ.
 
có anh chị nào biết đấy là hàm gì không (a,d,x,f) và (5,2,8,1)

tại a1 có các giá trị hoặc là a hoặc là d hoặc là e hoặc là f, tại b1 đánh hàm đối chiếu giá trị a1 nếu a1 mang giá trị là a thì hàm ra kết quả là 5 nếu mang giá trị d thì hàm ra kết quả là 2 nếu a1 mang giá trị x thì hàm ra kết quả là 8 nếu a1 là f thì hàm ra kết quả là 1.

Có một hàm có tác dụng như vậy mà em không tài nào nhớ.

=INDEx({5;2;8;1},MATCH(A1,{"A";"D";"X";"F"},0))
 
có anh chị nào biết đấy là hàm gì không (a,d,x,f) và (5,2,8,1)

tại a1 có các giá trị hoặc là a hoặc là d hoặc là e hoặc là f, tại b1 đánh hàm đối chiếu giá trị a1 nếu a1 mang giá trị là a thì hàm ra kết quả là 5 nếu mang giá trị d thì hàm ra kết quả là 2 nếu a1 mang giá trị x thì hàm ra kết quả là 8 nếu a1 là f thì hàm ra kết quả là 1.

Có một hàm có tác dụng như vậy mà em không tài nào nhớ.
Mã:
=lookup(a1,{"a","d","x","f"},{5,2,8,1})
 
Hàm LOOKUP dò tìm tương đối, nên dữ liệu trong mảng phải được sắp xếp từ A -> Z

=LOOKUP(A1,{"a","d","f","x"},{5,2,1,8})
cám ơn bạn, không rỏ dữ liệu thực tế cần dò tìm tuyệt đối hay tương đối, tùy trường hợp mà sử dụng công thức thích hợp
 
Dữ liệu cần tìm là tuyệt đối bạn à. Chịu chết không nhớ cái hàm ấy là gì :((
 
Befaint ơi quên mất là dữ liệu cần lấy ở dạng giờ, 5 2 8 1 là 5h, 2h, 8h, 1h. Mình sửa lại thành như vậy mà không biết có sao không

INDEX({0.334;0.5834;0.91667},MATCH(F9,{"ca1";"ca2";"ca3"},0))) <=> INDEX({6;14;22},MATCH(F9,{"ca1";"ca2";"ca3"},0))) với 6, 12, 22 là giờ.
 
Lần chỉnh sửa cuối:
Befaint ơi quên mất là dữ liệu cần lấy ở dạng giờ, 5 2 8 1 là 5h, 2h, 8h, 1h. Mình sửa lại thành như vậy mà không biết có sao không

INDEX({0.334;0.5834;0.91667},MATCH(F9,{"ca1";"ca2";"ca3"},0))) <=> INDEX({6;14;22},MATCH(F9,{"ca1";"ca2";"ca3"},0))) với 6, 12, 22 là giờ.

Cho vào file excel... rồi úp lên.
 
Cho vào file excel... rồi úp lên.

File đây bạn nhé. Ngoài ra mình có nói thêm về cách tính giờ công giờ làm thêm. Mọi người xem có thể viết hàm kiểu khác nhẹ nhàng hơn không hoặc VBA được thì càng tốt --=0.
Thêm một điều nữa rất củ chuối: Tùy từng trường hợp mà sẽ bị trừ giờ ăn ca. Cái này thì đang rất loằng ngoằng mình chưa định nghĩa được.

P/s: File mình đính kèm ở bài #1
 
Lần chỉnh sửa cuối:
Chủ nhật anh chị em nào rảnh vào giúp em nhé. Làm công thức kiểu này cứ quay quay đến khổ :((
 
Nếu em có chỗ nào chưa nói rõ ràng thì anh chị góp ý cho em nhé :)
 
Mọi người ơi xem cho em với :((
 
Hôm nay là ngày cuối cùng để em gửi form cho kế toán rồi các anh chị xem giúp em với. Em xin chân thành cảm ơn!
 
Em mới phát hiện ra một sự cố đó là nếu Ca2 giả sử làm từ 14h và tăng ca đến 2h sáng thì công thức tính không còn đúng nữa. Mọi người xem giúp em nhé.
 
File đây bạn nhé (#01). Ngoài ra mình có nói thêm về cách tính giờ công giờ làm thêm. Mọi người xem có thể viết hàm kiểu khác nhẹ nhàng hơn không hoặc VBA được thì càng tốt
Hôm nay mới xem lại file mới của bạn & xin gốp vài í như sau:

(1) Với 4171 nhân viên để tính công (31 ngày/tháng) thì quên đi chuyện xài công thức là cái chắc!

(2) Dù có xài công thức hay VBA cho bằng í người thì ngay kí hiệu bạn xài để thể hiện ca kíp của nhân viên cũng đã chưa cẩn trọng:
Ca ngày: CAN
Ca đêm: CAD
Hanh chinh: CAH
K1: CA1
K2: CA2
K3: CA3
Bạn thấy trong mọi dòng đều có chữ 'A' không? Đó là thừa & chưa nghiêm túc suy xét công việc của mình!
Theo mình thì chỉ 2 kí tự cho mỗi dòng mà thôi; Như CN, CD, HC, C1, C2, C3
Chỉ mỗi động tác này, chúng ta đã tiết kiệm được 1/4 thời gian truy xuất ca cho bảng chấm công.

Nói thêm: Ta có thể chỉ xài 1 kí tự cho các loại ca này (bằng cách bỏ đi kí tự 'C'); Tuy nhiên không nên xài kí số (1, 2, 3) mà các ca C1, C2, C3 fải xài kí tự khác, như X, Y, Z, N, D, H

Với mình, thiết kế trang dữ liệu ban đầu là vô cùng quan trọng!
 
Vâng, cảm ơn những lời góp ý quý giá của anh. Điều đó giúp em hiểu được tầm quan trọng trong việc thiết kế trang dữ liệu từ những điều đơn giản nhất mà không phải nhiều bạn như em biết. Em sẽ thiết kế lại và úp lại file trong bài #1 vào lúc 9h sáng nay. Anh dậy sớm quá!

Chúc anh một ngày mới vui vẻ!
 
Lần chỉnh sửa cuối:
Chủ để này của em chắc chuyển sang mục VBA hợp lý hơn, cần thiết thì admin chuyển bài cho em nhé.
 
Vâng, cảm ơn những lời góp ý của anh.

Chúng ta thử bắt đầu với VBA nha:

Macro chỉ mới làm cho 2 cột dữ liệu [O:P]; Với máy cà tèng của mình cần 0.08"

Hi vọng giúp được bạn ít nhiều trong tham khảo
 

File đính kèm

Chúng ta thử bắt đầu với VBA nha:

Macro chỉ mới làm cho 2 cột dữ liệu [O:P]; Với máy cà tèng của mình cần 0.08"

Hi vọng giúp được bạn ít nhiều trong tham khảo


Anh ơi cột giờ đặc biệt em cho thêm vào vì nhiều trường hợp CNV phải đến sớm. Cho nên sẽ tính riêng ở cột này. Anh xem ở dòng 14 em bôi vàng anh nhé.

P/s: Mỗi lần được anh giúp sức em cảm thấy như được đặt chân vào vùng đất huyền bí, hồi hộp, tò mò và lôi cuốn.
 
Lần chỉnh sửa cuối:
(1) Còn đây là các câu lệnh tính toán cho cột [Q]
PHP:
    If dArr(J, 2) > dArr(J, 1) Then
        dArr(J, 3) = Format(GQC(Sht, False) - GQC(Sht), "hh:MM")
    Else
        dArr(J, 3) = Format(1 + GQC(Sht) - GQC(Sht, False), "hh:MM")
    End If
Chúng đứng sau câu này:
Mã:
dArr(J, 2) = Format(GQC(Sht, False), "hh:MM")

(Xài các câu này mất thêm 1/100 gy để có số liệu của 1 cột.)

(2) Lại nói về thiết kế trang tính:
Bạn xài 3 cột [R..T] cho số liệu ăn uống 1; Theo mình như thế là dư 2 cột & không tiết kiệm
Sao ta không xài mỗi cột [T] thôi; & lúc đó nhập trực tiếp là 1 cho những người có dùng bữa giữa ca?
Chuyện này sẽ làm CSDL của bạn sẽ khó gì không trong hoạt động?

(2.1) Cũng như vậy với 3 cột liền kề bên fải . . . .
 
(1) Còn đây là các câu lệnh tính toán cho cột [Q]
PHP:
    If dArr(J, 2) > dArr(J, 1) Then
        dArr(J, 3) = Format(GQC(Sht, False) - GQC(Sht), "hh:MM")
    Else
        dArr(J, 3) = Format(1 + GQC(Sht) - GQC(Sht, False), "hh:MM")
    End If
Chúng đứng sau câu này:
Mã:
dArr(J, 2) = Format(GQC(Sht, False), "hh:MM")

(Xài các câu này mất thêm 1/100 gy để có số liệu của 1 cột.)

(2) Lại nói về thiết kế trang tính:
Bạn xài 3 cột [R..T] cho số liệu ăn uống 1; Theo mình như thế là dư 2 cột & không tiết kiệm
Sao ta không xài mỗi cột [T] thôi; & lúc đó nhập trực tiếp là 1 cho những người có dùng bữa giữa ca?
Chuyện này sẽ làm CSDL của bạn sẽ khó gì không trong hoạt động?

(2.1) Cũng như vậy với 3 cột liền kề bên fải . . . .

Dạ vâng anh ơi bởi là vì các ông sếp em còn muốn theo dõi xem giờ ăn các bộ phận sẽ như thế nào, nó chẳng có một quy tắc gì và cái này bộ phận họ sẽ tự chấm theo ca của họ. Anh chịu khó xem cả công thức cho em nhé, cách trừ giờ ăn cũng có nguyên tắc. nói ra thì dài dòng nhưng nhìn vô công thức sẽ thấy ngay. À em thêm code ở trên của anh thì báo lỗi Run time erro 9 (Subscript out of range). Em để ý thấy hh:MM không có hai số 00. Em thử thêm vào cũng không chạy anh ạ.
 
Lần chỉnh sửa cuối:
Tối anh anh thức cùng em anh ChanhTQ@ nhé **~**
 
Thiết nghĩ, để tính thời gian làm thêm của 1 người làm bất cứ ca nào, thì ta chỉ căn cứ vô giờ vô & giờ ra khỏi CQ của người í so với thời gian qui định (vô & ra) là được.

CQ bạn còn trừ giờ cho những người có ăn trưa nữa sao?
Vậy CQ lại có những người không ăn trưa? Vậy họ ra ngoài CQ ăn hay sao?

Về vấn đề này mình xin lấy ví dụ cụ thể người đấu tiên trong danh sách (làm ca H), như sau

Thời gian vô: 7:45. So với qui định, người này vô sớm 12f
Thời gian ra 17:25: Người này về trễ 25f
Tựu chung người này làm thêm giờ ca ngày 37f (12 + 25); Fải vậy không?
 
Thiết nghĩ, để tính thời gian làm thêm của 1 người làm bất cứ ca nào, thì ta chỉ căn cứ vô giờ vô & giờ ra khỏi CQ của người í so với thời gian qui định (vô & ra) là được....

Anh ơi không phải đâu ạ. Em ví dụ như này: Ca hành chính đến 7h30 về 17:25: Nếu họ đến sớm không phải vì yêu cầu công việc thì kế toán họ chỉ chấm từ 8h đến 17h. Lúc này sẽ căn cứ vào ô cột giờ đặc biệt. Còn không thì mặc định như công thức của em về ca nào áp khung giờ ấy anh ạ. Công nhân nhiều người ở xa họ đi xe tự thuê nên có khi đến rất sớm (ví dụ ca 1 quy định 6h nhưng 5h30 một số người đã có mặt rồi anh ạ.

Em nói thêm là giờ về so với giờ quy định họ về nếu ở lại làm thêm thì dữ liệu quẹt thẻ ít nhất 30p mới được tính (ví dụ về là 17h nhưng ở lại 17h40 thì giờ được tính là 17h30. Qua mốc 30 này thì cứ 15 phút là được tính rồi ví dụ 17h46 được tính là 17h45, 17h55 cũng chỉ được tính là 17h45). Giả như họ về giờ nào tính giờ ây thì có phải nhàn hơn bao nhiêu.

Vì vậy giờ của dữ liệu không có cách nào chấm tự động. Nếu nó về trễ 30p mà bộ phận không chấm thì em cũng sẽ không chấm. Còn nếu được chấm thì bộ phận sẽ chấm vào cột giờ đặc biệt.
 
Lần chỉnh sửa cuối:
Không phải đâu ạ. Ví dụ: (Ca H) đến 7h30 về 17:25:
Nếu họ đến sớm không phải vì yêu cầu công việc thì kế toán họ chỉ chấm từ 8h đến 17h. Lúc này sẽ căn cứ vào ô cột giờ đặc biệt. Còn không thì mặc định như công thức của em về ca nào áp khung giờ ấy anh ạ.
CN có người ở xa nên có khi đến sớm.
Vì vậy giờ của dữ liệu không có cách nào chấm tự động.

Nếu nó về trễ 30p mà bộ phận không chấm thì em cũng sẽ không chấm. Còn nếu được chấm thì bộ phận sẽ chấm vào cột giờ đặc biệt.
Vậy thì 2 cột số liệu của [Giờ của dữ liệu QT] là để ngó chơi à?
Mà để ngó chơi thì cần chi fải có 2 cột đó trong CSDL kia chứ?

Em nói thêm là giờ về so với giờ quy định họ về nếu ở lại làm thêm thì dữ liệu quẹt thẻ ít nhất 30p mới được tính (ví dụ về là 17h nhưng ở lại 17h40 thì giờ được tính là 17h30. Qua mốc 30 này thì cứ 15 phút là được tính rồi ví dụ 17h46 được tính là 17h45, 17h55 cũng chỉ được tính là 17h45). Giả như họ về giờ nào tính giờ ây thì có phải nhàn hơn bao nhiêu.
Cái này VBA có thể làm được rạch ròi cho bạn; nhưng lí ra bạn fải trình bày trước các mục trong qui chế chấm công này của đơn vị bạn mới fải!

Hiện cách làm của đơn vị bạn có thể sẽ bị ai đó lợi dụng làm sai lệch con số của công nhân nào đó do chủ quan & cảm tình.
 
Vậy thì 2 cột số liệu của [Giờ của dữ liệu QT] là để ngó chơi à?
Mà để ngó chơi thì cần chi fải có 2 cột đó trong CSDL kia chứ?


Cái này VBA có thể làm được rạch ròi cho bạn; nhưng lí ra bạn fải trình bày trước các mục trong qui chế chấm công này của đơn vị bạn mới fải!

Hiện cách làm của đơn vị bạn có thể sẽ bị ai đó lợi dụng làm sai lệch con số của công nhân nào đó do chủ quan & cảm tình.


Sau khi có dữ liệu chấm giờ em sẽ đối chiếu bằng cách trừ giờ bộ phận chấm với giờ dữ liệu quẹt thẻ xem có chênh nhiều không. Nếu một vài phút thì em bỏ qua nếu 5p trở lên thì em phản ánh bộ phận. Có trường hợp còn không có dữ liệu quẹt thẻ lúc ấy bộ phận họ có chấm vào ô đặc biệt thì cột ghi chú họ sẽ phải ghi vào (Ví dụ theo dữ liệu giấy xác nhận giờ làm).

Trường hợp như anh nói ở trên về chủ quan cảm tính: Nếu dữ liệu lệch quá nhiều em sẽ phải hỏi bộ phận (Ví dụ tại sao họ về 17h30 mà anh chỉ chấm cho họ 17h... Em biết có quá nhiều kẽ hở, nên làm nó nhanh khâu nào thì hay khâu ấy. Còn thì giờ ra vào được chấm cũng phụ thuộc nhiều vào bộ phận (Qua giấy xác nhận và cái này em phải check thủ công anh ạ).

Kiểu gì thì kiểu dữ liệu chấm công không thể căn cứ hết vào dữ liệu quẹt thẻ cho nên bỏ qua cái đó anh hoàn thiện giúp em code quy ra công, giờ làm thêm anh nhé.


Vấn đề của anh nêu cho em có dịp em sẽ nêu ý kiến với trưởng phòng bên em, cảm ơn anh nhé!
 
Lần chỉnh sửa cuối:
Có nghĩa là giờ sẽ fải bắt đầu với cột nào đây? Chắc là cột [X], fải không?

Anh để ý công thức cột
O: =+IF(L9<>"",L9,INDEX({0.25;0.5834;0.91667;0.3334;0.3334;0.8334},MATCH(F9,{"X";"Y";"Z";"H";"N";"D"},0)))
và P: =+IF(M9<>"",M9,INDEX({0.5834;0.91667;0.25;0.7084;0.8334;0.3334},MATCH(F9,{"X";"Y";"Z";"H";"N";"D"},0))) (File em gửi chỗ số đỏ là em nhầm 0.7084, đúng của nó là 0.8334)

Như vậy giờ sẽ tính theo cột O và P anh nhé. Tất cả dữ liệu sau cột O và P đều dựa theo hai cột này để tính anh ạ.
 
Như vậy giờ sẽ tính theo cột O và P anh nhé. Tất cả dữ liệu sau cột O và P đều dựa theo hai cột này để tính anh ạ.

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.
 
Lần chỉnh sửa cuối:
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ứ.
 
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.
 
Thử đoạn sau xem:
Mã:
If "a" > "b" Then MsgBox "Chít liên!"

Đúng là chít liền :D. Cảm ơn Befaint!

Cái công thức này sao mình cảm thấy nó kỳ quoặc thế nào ấy
=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),Q9-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))))))
 
Em đang mắc ở giờ ăn 1 và 2 không biết sai ở đâu, mọi người xem file đính kèm giúp em nhé. Em nghĩ do sai ở trường hợp giờ nào đấy số liệu nó khác biệt so với các giờ ăn còn lại.

P/s: Được rồi mọi người nhé, có một số ô nó không phải là dạng giờ.
 
Lần chỉnh sửa cuối:
Đúng là chít liền :D. Cảm ơn Befaint!

Cái công thức này sao mình cảm thấy nó kỳ quoặc thế nào ấy
Vậy bạn thử công thức này xem sao (hên xui nha, vì chỉ làm rút gọn công thức mà không xét các trường hợp tính giờ vì không biết mô tê gì hết /-*+//-*+//-*+/):

Mã:
AA9=IF(OR(F9={"D","Z"}),0,IF(OR(F9<>{"N","H"}),IF(Z9>=8,8,Z9),IF((O9<=$Q$7)*(P9>=$AA$7),8,IF((O9>$Q$7),IF((P9>=$AA$7),($AA$7-O9)*24-T9+Y9,Q9-T9+Y9),0))))

Hình như công thức cũ: các trường hợp về sớm được tính là 9h ?!!! (vd: dòng 1362), trong khi thực tế làm 7h+1h được về sớm theo chế độ = 8h.
Chắc tính là 8h, như vậy mới đúng hả bạn!!

Chúc bạn ngày vui.
 
Lần chỉnh sửa cuối:
Vậy bạn thử công thức này xem sao (hên xui nha, vì chỉ làm rút gọn công thức mà không xét các trường hợp tính giờ vì không biết mô tê gì hết /-*+//-*+//-*+/):

Mã:
AA9=IF(OR(F9={"D","Z"}),0,IF(OR(F9<>{"N","H"}),IF(Z9>=8,8,Z9),IF((O9<=$Q$7)*(P9>=$AA$7),8,IF((O9>$Q$7),IF((P9>=$AA$7),($AA$7-O9)*24-T9+Y9,Q9-T9+Y9),0))))

Hình như công thức cũ: các trường hợp về sớm được tính là 9h ?!!! (vd: dòng 1362), trong khi thực tế làm 7h+1h được về sớm theo chế độ = 8h.
Chắc tính là 8h, như vậy mới đúng hả bạn!!

Chúc bạn ngày vui.

Cảm ơn bạn nhé, để mình test xem sao. Bạn nói đúng rồi đấy nhưng vì code tính giờ ăn đang kẹt nên nó chưa trừ đi 1h giờ ăn.
 
....................

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

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))

....................
Làm gọn công thức cho bạn:

Mã:
AB9=IF(AND(F9<>{"D","Z"}),0,MIN(Z9-AC9-AD9-AE9,8))

Chúc bạn ngày vui.
p/s: do rảnh được 1 lúc buổi trưa góp vui với anh em bằng việc rút gọn công thức cho chủ thớt. Chúc anh em ngày vui. bái bai! --=0/-*+//-*+//-*+/
 
Vậy bạn thử công thức này xem sao (hên xui nha, vì chỉ làm rút gọn công thức mà không xét các trường hợp tính giờ vì không biết mô tê gì hết /-*+//-*+//-*+/):

Mã:
AA9=IF(OR(F9={"D","Z"}),0,IF(OR(F9<>{"N","H"}),IF(Z9>=8,8,Z9),IF((O9<=$Q$7)*(P9>=$AA$7),8,IF((O9>$Q$7),IF((P9>=$AA$7),($AA$7-O9)*24-T9+Y9,Q9-T9+Y9),0))))

....

Công thức này sai với trường hợp ID 10024 bạn ạ.
 
Công thức này sai với trường hợp ID 10024 bạn ạ.
Vậy bạn thử lần nữa công thức sau với nội dung điều kiện:

1. Nếu là Ca đêm ("D") và Ca 3 ("Z") thì Công ngày = 0
2. Nếu không là Ca ngày ("N") và Ca Hành chính ("H"); tức là "X & Y"; thì Công ngày được tính: lấy số Min khi so sánh giữa: "Tổng thời gian được tính" và 8.
3. Còn lại là "N" và "H": xét đến 3 trường hợp:
  • Giờ vào <=8h, giờ ra >=17h: tính đúng là 8 tiếng
  • Giờ vào >8h , giờ ra >=17h: lấy (17h - giờ vào) - Tgian ăn giữa ca + Giờ tính thêm
  • Còn lại (giờ vào bất kỳ; giờ ra <17h): Lấy Tổng thời gian - Tgian ăn giữa ca + Giờ tính thêm

Mã:
AA9=IF(OR(F9={"D","Z"}),0,IF(AND(F9<>{"N","H"}),MIN(Z9,8),IF((O9<=$Q$7)*(P9>=$AA$7),8,IF((P9>=$AA$7),($AA$7-O9)*24,Q9)-T9+Y9)))

Ngoài ra bạn phải chỉnh lại công thức tính Tgian ăn giữa ca thì các công thức khác mới chính xác.

Chúc bạn ngày vui. /-*+//-*+//-*+/
 
Anh chị ơi em mắc:

Công thức tính công ngày tại cột AA9:
AA9=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),Q9-T9+Y9,IF(OR(F9="D",F9="Z"),0,IF(AND(F9<>"D",F9<>"Z",Z9>=8),8,Z9)))))

+Nếu là ca N hoặc H và (O9<=$Q$7,P9>=$AA$7) thì bằng 8
+Nếu là ca N hoặc H và (O9>$Q$7,P9>=$AA$7) thì bằng ($AA$7-O9)*24-T9+Y9
+Nếu là ca N hoặc H và (O9>=$Q$7,P9<$AA$7) thì bằng Q9-T9+Y9
+Nếu là ca D hoặc Z thì bằng 0
+Nếu khác D hoặc Z và Z9>=8 thì bằng 8
+Các trường hợp còn lại bằng Z9

Em code thành như sau:

PHP:
 'Cong ngay'
 Arr() = [F9].Resize(Rws, 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, 10) <= [Q7] And Arr(J, 11) >= [AA7] Then
        dArr(J, 1) = 8
        If Arr(J, 10) > [Q7] And Arr(J, 11) >= [AA7] Then
        dArr(J, 1) = ([AA7] - Arr(J, 10)) * 24 - Arr(J, 15) + Arr(J, 20)
        If Arr(J, 10) >= [Q7] And Arr(J, 11) < [AA7] Then
        dArr(J, 1) = Arr(J, 12) - Arr(J, 15) + Arr(J, 20)
        End If
    If Arr(J, 1) = "D" Or Arr(J, 1) = "Z" Then
        dArr(J, 1) = 0
    If Arr(J, 1) <> "D" Or Arr(J, 1) <> "Z" And 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()

Nó báo lỗi Next without for.

Mọi người thông giúp em với **~**
 
Lần chỉnh sửa cuối:
Anh chị ơi em mắc:

Công thức tính công ngày:
=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),Q9-T9+Y9,IF(OR(F9="D",F9="Z"),0,IF(AND(F9<>"D",F9<>"Z",Z9>=8),8,Z9)))))

Em code thành như sau:

PHP:
 'Cong ngay'
 Arr() = [F9].Resize(Rws, 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, 10) <= [Q7] And Arr(J, 11) >= [AA7] Then
        dArr(J, 1) = 8
        If Arr(J, 10) > [Q7] And Arr(J, 11) >= [AA7] Then
        dArr(J, 1) = ([AA7] - Arr(J, 10)) * 24 - Arr(J, 15) + Arr(J, 20)
        If Arr(J, 10) >= [Q7] And Arr(J, 11) < [AA7] Then
        dArr(J, 1) = Arr(J, 12) - Arr(J, 15) + Arr(J, 20)
        End If
    If Arr(J, 1) = "D" Or Arr(J, 1) = "Z" Then
        dArr(J, 1) = 0
    If Arr(J, 1) <> "D" Or Arr(J, 1) <> "Z" And 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()

Nó báo lỗi Next without for.

Mọi người thông giúp em với **~**
nhìn các công thức của bạn choáng cả người, khó có thể chuyển thành code được
bạn diễn giải bằng lời thật rỏ ràng, mỗi mệnh đề "nếu" ghi đủ điều kiện và trên 1 dòng, lúc đó mới có hy vọng chuyển thành code
 
nhìn các công thức của bạn choáng cả người, khó có thể chuyển thành code được
bạn diễn giải bằng lời thật rỏ ràng...

Đã diễn giải, HieuCD xem dùm nhé.

P/s: Dạo này anh ChanhTQ bận gì ạ, công thức của anh em sửa như vầy không biết có vấn đề gì không anh nhỉ:

Ví dụ Rws = [b9].CurrentRegion.Rows.Count em sửa thành Rws = [b9].CurrentRegion.Rows.Count - 8 để nó không bị thừa mảng nữa làm vậy có đúng không anh.
 
Đã diễn giải, HieuCD xem dùm nhé.

P/s: Dạo này anh ChanhTQ bận gì ạ, công thức của anh em sửa như vầy không biết có vấn đề gì không anh nhỉ:

Ví dụ Rws = [b9].CurrentRegion.Rows.Count em sửa thành Rws = [b9].CurrentRegion.Rows.Count - 8 để nó không bị thừa mảng nữa làm vậy có đúng không anh.
bạn chạy thử code sau
Mã:
Sub tam1()
 Dim Arr(), dArr(), Rws As Long, J As Long
[COLOR=#ff0000] Rws = [b65500].End(xlUp).Row[/COLOR]
[COLOR=#ff0000] 'Cong ngay'[/COLOR]
[COLOR=#ff0000] Arr() = Range("B9:B" & Rws).Resize(, 21).Value[/COLOR]
 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 dArr(J, 10) >= [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
bạn không thể sửa thành
Rws = [b9].CurrentRegion.Rows.Count - 8
dư 8 dòng là do các số 0 ở các dòng cuối cột O, nếu xóa các ô nầy thì lại mất 8 dòng
 
ô AC9=Z9-AA9
có được không?
 
ô AC9=Z9-AA9
có được không?

Không bạn ạ vì nó có 3 loại OVT và căn cứ vào ca, vào giờ để xem nó là OVT N hay Đ1 hay Đ2. Mình nghĩ Rws = [b9].CurrentRegion.Rows.Count - 8 là ok vì mảng này bao gồm cả từ A1 cho nên từ A1 đến A8 là thừa nên mình trừ 8.
 
Không bạn ạ vì nó có 3 loại OVT và căn cứ vào ca, vào giờ để xem nó là OVT N hay Đ1 hay Đ2. Mình nghĩ Rws = [b9].CurrentRegion.Rows.Count - 8 là ok vì mảng này bao gồm cả từ A1 cho nên từ A1 đến A8 là thừa nên mình trừ 8.
nếu theo code trước thì trừ 8 cũng được
 
Ừm nhưng code trên của bạn không chạy, mình có up lại file đang làm dang dở ở bài #1.
 
Ừm nhưng code trên của bạn không chạy, mình có up lại file đang làm dang dở ở bài #1.
ừ nhỉ nó lại không chịu chạy, chắc nó buồn rồi, đổi mới một chút hy vọng nó vui
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 dArr(J, 10) >= [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
 
Vẫn không được HieuCD ạ.

Em đã up lại file ở bài #1 mọi người xem giúp em xem là lỗi ở đâu nhé. Em cảm ơn!
 
Mọi người ơi được rồi nhé, hóa ra ở trên bao nhiêu if mà chưa có end if thì cuối code phải có bấy nhiêu End if. Haiz, đúng là trẻ em mới tập nói :D
 

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

Back
Top Bottom