Giúp hoàn thiện bảng BCC (1 người xem)

Liên hệ QC

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
Chào anh chị!

Em gửi lên diễn đàn bản chấm công em đang xây dựng theo sự hướng dẫn của rất nhiều anh chị em trên này (nhưng chưa hoàn thiện hết). Hiện tại BCC còn sử dụng cả công thức nên chậm. Mong anh chị đưa ra phương án xử lý cải thiện BCC này tốt hơn. (theo hướng VBA cũng được hoặc dùng hàm nào đó tối ưu hơn cũng được).
Để tổng hợp công từ tất cả các sheet khác bấm vào biểu tượng bàn tay.

Hiện tại các công thức em đang sử dụng trong sheet BCC như sau:
+ Thử việc ngày: =+SUMIFS(K8:ED8,$K$6:$ED$6,"<="&G8,$K$7:$ED$7,"WD")
Căn cứ vào thời gian hết HĐ thử việc ở cột ED ta sẽ tính tổng các cột có tiêu đề là WD

+ Thử việc đêm: =SUMPRODUCT(($K$6:$ED$6<=G8)*IFERROR(IF(K8:ED8="D",1,--SUBSTITUTE($K$8:$ED$8,"D","")),0)*($K$7:$ED$7="WD")*ISTEXT(K8:ED8))
Căn cứ vào thời gian hết HĐ thử việc ở cột ED ta sẽ tính tổng các giá trị D (có thể là 0.1D hoặc 0.5D hoặc D) ở các cột có tiêu đề là WD.

Tương tự với Công ngày chính thức và công đêm chính thức căn cứ vào thời gian hết thử việc.

+Đối với các cột nghỉ từ EK đến EV và:
Ví dụ nghỉ Holiday: =+COUNTIFS($K8:$ED8,"LT",$K$7:$ED$7,"WD")+SUMIF(N!$I$5:$I$1000,BCC!$B8,N!$N$5:$N$1000)
Đếm các ô có ký hiệu LT ở các cột có tiêu đề WD + tổng có điều kiện trong sheet N
Các ngày nghỉ khác tương tự.

+ Tính Day OVT và Night OVT:
+) OVT ngày thường =+SUMIFS($K8:$ED8,$K$7:$ED$7,"ON",$K$5:$ED$5,"<>1",$K$5:$ED$5,"<>LT")
Tính tổng từ K8 đến ED8 đối với các cột có tiêu đề ON và xét $K$5:$ED$5 giá trị khác 1 (loại bỏ ON ngày chủ nhật) và xét $K$5:$ED$5 giá trị khác LT (loại bỏ ON ngày lễ tết)

Tương tự với các OVT khác.

Công việc khá là rối răm phức tạp em mong anh chị giúp đỡ.

Em cảm ơn ạ!
 

File đính kèm

Em thấy giống Lưu Bị và Khổng Minh quá :).
- Code trên của em dựa trên cột F (ca làm) cột H và I (giờ ra vào theo hệ thống); cột K và L (giờ ra vào tự chấm tay).
- Dựa vào 5 cột trên nếu K và L có dữ liệu thì ưu tiên lấy dữ liệu ở đây gán vào O và P ---> Tính ra thời gian làm việc ở cột Q
- Còn nếu cột K và L không có thì ta xét dữ liệu ở cột H và I.

Em có 6 ca làm như sau:

+ Ca H: Từ 08h đến 17h (Ca hành chính)
+ Ca N: Từ 08h đến 20h (Ca ngày)
+ Ca D: Từ 20h đến 08h (Ca đêm)
+ Ca X: Từ 06h đến 14h (Ca 1)
+ Ca Y: Từ 14h đến 22h (Ca 2)
+ Ca Z: Từ 22h đến 06h (Ca 3)

Căn cứ khung giờ trên nếu nằm trong điều kiện cho phép ở ca nào thì gán giờ ra vào ở ca đó.

Đúng là "....", chẳng biết bạn nói cái gì, code nào của sheet nào, hình như chuyện của bạn chỉ mình bạn hiểu.
Kính mời chân sự xuống núi...!!! :rolleyes:;):D

Code bài #14 không đầu không đuôi, chẳng biết viết cho việc gì, sheet nào. "Má tui" cũng "điếc".
Đúng 9/6 rồi nhé. Xong Topic này.
 
Upvote 0
Đúng là "....", chẳng biết bạn nói cái gì, code nào của sheet nào, hình như chuyện của bạn chỉ mình bạn hiểu.


Code bài #14 không đầu không đuôi, chẳng biết viết cho việc gì, sheet nào. "Má tui" cũng "điếc".
Đúng 9/6 rồi nhé. Xong Topic này.

@@ đúng là em hay nói vắn tắt không rõ ràng. Code em có nói là ở module tên là CPU dùng để chấm giờ ra vào của các ngày công ấy anh.

*Note: Hôm qua F5 cả sáng mà không thấy anh nên em nghĩ anh bận, chiều em cũng bận nhiều việc nên sáng nay em mới check :(
 
Upvote 0
Tại sao file của em càng chạy thì thời gian thực thi VBA càng lâu? Phải chăng do có cái gì đó không được giải phóng? Đóng file mở lại lại chạy nhanh gấp 3 lần.
 
Upvote 0
Tại sao file của em càng chạy thì thời gian thực thi VBA càng lâu? Phải chăng do có cái gì đó không được giải phóng? Đóng file mở lại lại chạy nhanh gấp 3 lần.
Bạn vẫn thích nói cho bạn hiểu.
"file của em càng chạy thì thời gian thực thi VBA càng lâu" nghĩa là code nào, của ai chạy càng lâu? Hay là tất cả các sub trong file đều chạy lâu?
Nếu chỉ 1 Sub chạy "bị lâu" thì tìm cách viết lại Sub đó, đó là sub nào cho mọi người biết.
 
Upvote 0
Bạn vẫn thích nói cho bạn hiểu.
"file của em càng chạy thì thời gian thực thi VBA càng lâu" nghĩa là code nào, của ai chạy càng lâu? Hay là tất cả các sub trong file đều chạy lâu?
Nếu chỉ 1 Sub chạy "bị lâu" thì tìm cách viết lại Sub đó, đó là sub nào cho mọi người biết.

Dạ vâng module tên là CPU, Public Sub Cong_Ver25052017() anh ạ. Sub đó em gán vào cái biểu tượng mặt cười ở phía trên bên trái của các ngày chấm công anh ạ.

Em định up cả code lên nhưng mà dài quá, vượt quá 1000 ký tự quy định của diễn đàn.
 
Lần chỉnh sửa cuối:
Upvote 0
Có ai xem giúp em với, em cố soát lại code mà không thấy vấn đề ở đâu.
 
Upvote 0
Code này đúng là đang có vấn đề , nó là Sub Cong_ver25052017() ở Module CPU. Cùng một dữ liệu xử lý mà mỗi lần bấm chạy lại là thời gian xử lý tăng dần lên. Em không hiểu nó đang có vấn đề gì nữa. Mong mọi người chỉ dạy.
 
Upvote 0
Hay là do file của em có vấn đề. Chứ cùng xử lý một dữ liệu, cùng là một code tại sao thời gian xử lý khác nhau. Mỗi lần em cho chạy code đó là time xử lý tăng lên dần đều.
 
Upvote 0
Em tìm ra nguyên nhân rồi, lỗi không phải ở code mà lỗi là ở trong sheet có cái name lạ, bấm Ctrl+F3 không thấy, đã dùng del name của thầy ndu rồi mà cũng không ăn thua. Lạ thật.
 
Upvote 0
Hãy làm lại từ đầu đi bạn; Xóa đi làm lại có khi hay hơn.

Tất nhiên Xóa không có nghĩa là bỏ, mà là cất kho 1 thời gian; chuyển sang hướng khác xem sao/

Chớ tiếc công sức bấy lâu nay & tái cấu trúc đi bạn!

Với mình cấu trúc CSDL mới là khâu quan trọng bật nhất & là duy nhất.
 
Upvote 0
Nhờ mọi người xem giúp em. Em đang không hiểu vì sao, sheet càng nhiều thì mỗi lần bấm chạy code bằng cách bấm vào biểu tượng mặt cười ở bên trái phía trên là thời gian xử lý ngày càng tăng. (Càng chạy nhiều lần code đó thì tốc độ xử lý càng ngày càng tăng lên).

Kết luận trên file này có thể thấy tốc độ code phụ thuộc vào hai yếu tố sau:

- Số lượng sheet
- Số lần chạy code (Cái này ưu tiên hơn bởi vì số lượng sheet dù có bao nhiêu đi nữa thì nếu em đóng file vào chạy lại 1 đến 2 lần đầu tốc độ xử lý vẫn rất nhanh, nhưng bấm chạy lại càng về sau thì tốc độ càng chậm). Khó hiểu (code nằm trong module Cong)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nhờ mọi người xem giúp em. Em đang không hiểu vì sao, sheet càng nhiều thì mỗi lần bấm chạy code bằng cách bấm vào biểu tượng mặt cười ở bên trái phía trên là thời gian xử lý ngày càng tăng. (Càng chạy nhiều lần code đó thì tốc độ xử lý càng ngày càng tăng lên).

Kết luận trên file này có thể thấy tốc độ code phụ thuộc vào hai yếu tố sau:

- Số lượng sheet
- Số lần chạy code (Cái này ưu tiên hơn bởi vì số lượng sheet dù có bao nhiêu đi nữa thì nếu em đóng file vào chạy lại 1 đến 2 lần đầu tốc độ xử lý vẫn rất nhanh, nhưng bấm chạy lại càng về sau thì tốc độ càng chậm). Khó hiểu (code nằm trong module Cong)
Có lẽ không ai "chịu" đọc hơn ngàn dòng code của bạn đâu.
Bạn muốn làm cái gì có thể tách từng phần (kết quả muốn có từng cột), nói rõ cách lấy kết quả, mọi người mới có thể nghĩ cách viết Code khác dựa theo yêu cầu của bạn, chứ đọc mà hiểu được bạn muốn gì trong cái "đống bòng bong" có lẽ "loạn óc".
 
Upvote 0
Có lẽ không ai "chịu" đọc hơn ngàn dòng code của bạn đâu.
Bạn muốn làm cái gì có thể tách từng phần (kết quả muốn có từng cột), nói rõ cách lấy kết quả, mọi người mới có thể nghĩ cách viết Code khác dựa theo yêu cầu của bạn, chứ đọc mà hiểu được bạn muốn gì trong cái "đống bòng bong" có lẽ "loạn óc".

Anh ơi, tạm thời file em đang có vấn đề nên nhờ mọi người check xem do vì đâu. Anh đã thử chạy file của em gửi lên chưa? Tại sao cùng một dữ liệu mà càng bấm chạy chấm công thì tốc độ lại càng chậm?
 
Upvote 0
Anh ơi, tạm thời file em đang có vấn đề nên nhờ mọi người check xem do vì đâu. Anh đã thử chạy file của em gửi lên chưa? Tại sao cùng một dữ liệu mà càng bấm chạy chấm công thì tốc độ lại càng chậm?
Bạn đọc kỹ bài #32 lại đi. Muốn biết tại sao thì phải đọc hiểu tất cả các dòng code bạn viết.
Trong file bài trước của bạn có những sheet ẩn, ví dụ Check, toàn công thức mảng, nếu không cần thiết thì xóa, nếu cần thì chuyển nó sang VBA.
 
Upvote 0
Bạn đọc kỹ bài #32 lại đi. Muốn biết tại sao thì phải đọc hiểu tất cả các dòng code bạn viết.
Trong file bài trước của bạn có những sheet ẩn, ví dụ Check, toàn công thức mảng, nếu không cần thiết thì xóa, nếu cần thì chuyển nó sang VBA.

File em mới gửi đã xóa hết các sheet đó chỉ để lại cái Form và các sheet chấm công. Công thức không có tí nào mà lại như vậy mới lạ anh ạ.

Để em viết lại nội dung chú thích trên từng code.
 
Upvote 0
Vì nội dung hơi dài nên em viết tạm nội dung các cột tính đầu tiên, các nội dung tiếp theo sau khi viết xong em sẽ tiếp tục post lên để anh chị em đỡ hoa mắt :(

1. Xét giờ ra vào tại cột H, I và ca tại cột F (Sau đây em xin gọi giờ vào là Vào, giờ ra là Ra, ca là Ca) nếu thỏa mãn thì gán dữ liệu vào cột O và P:


- Ca là H (ca hành chính) khung giờ quy định từ 8h đến 17h nếu:
+ 6h < Vào <= 8h và 17h <= Ra < 18h thì gán giờ vào tại cột O là 8h và giờ ra tại cột P là 17h


- Ca là N (ca ngày) khung giờ quy định từ 8h đến 20h nếu:
+ 6h < Vào <= 8h và 20h <= Ra < 21h thì gán giờ vào tại cột O là 8h và giờ ra tại cột P là 20h


- Ca là D (ca đêm) khung giờ quy định từ 20h đến 08h hôm sau nếu:
+ 18h < Vào <= 20h và 8h <= Ra < 9h thì gán giờ vào tại cột O là 20h và giờ ra tại cột P là 32h


- Ca là X (ca 1) khung giờ quy định từ 6h đến 14h nếu:
+ 6h <= Vào và 14h <= Ra < 15h thì gán giờ vào tại cột O là 6h và giờ ra tại cột P là 14h


- Ca là Y (ca 2) khung giờ quy định từ 14h đến 22h nếu:
+ 12h < Vào <= 14 và 22h <= Ra thì gán giờ vào tại cột O là 14h và giờ ra tại cột P là 22h


- Ca là Z (ca 3) khung giờ quy định từ 22h đến 6h hôm sau nếu:
+ 20h < Vào <= 22h và 6h <= Ra < 7h thì gán giờ vào tại cột O là 22h và giờ ra tại cột P là 30h

*Các trường hợp ngoài các điều kiện trên thì ta xét xem dữ liệu giờ tại cột K và L có hay không, nếu có thì gán dữ liệu ra và vào tại cột K và L cho dữ liệu ra và vào tại cột O và P


2. Tiếp tục Tính khoảng thời gian giữa thời gian vào và ra sau đó cho vào cột Q

3. Tính giờ ăn 1 và 2 (Cột T và W)

- Thời gian ăn 1: Nếu khoảng thời gian ăn giữa Bắt đầu và kết thúc tại cột R và S mà bằng 0.5 (30 phút) thì cộng thêm 0.5 cho tròn 1. Các trường hợp khác tính ra bao nhiêu thì gán bấy nhiêu vào cột T

- Thời gian ăn 2: Tính khoảng thời gian giữa bắt đầu và kết thúc tại cột U và V sau đó gán vào cột W

4. Thời gian hưởng chế độ (Cột Y):

- Nếu cột lý do tính công (M) có chứa giá trị S thì gán 1 vào cột Y (Theo quy định nghỉ 1 tiêng cho trường hợp thai sản, nuôi con nhỏ)
 
Lần chỉnh sửa cuối:
Upvote 0
Em post tiếp nhé, đi đến đây là gần cuối con đường rồi, phù

5. Tính thời gian người lao động được tính công và giờ làm thêm

- Đối với ca ngày, hành chính thời: Lấy thời gian ở cột Q trừ đi thời gian ăn 1

- Các ca còn lại không trừ giờ ăn mà lấy luôn thời gian ở cột Q

6. Tính công ngày (cột AA) và công đêm (Cột AB)

- Tùy từng ca làm việc mà công được tính ở khoảng thời gian khác nhau:
+ Ca ngày, hành chính giờ công được tính trong khoảng từ 8h đến 17h trừ đi giờ ăn 1. Khung giờ làm phát sinh mà ngoài khoảng trên thì không phải là công mà sẽ quy thành giờ làm thêm.
+ Ca 1, giờ công được tính trong khoảng từ 6h đến 14h. Ngoài khoảng này sẽ là giờ làm thêm.
+ Ca 2, giờ công được tính trong khoảng từ 14h đến 22h. Ngoài khoảng này sẽ là giờ làm thêm.
+ Ca 1, giờ công được tính trong khoảng từ 22h đến 30h (6h sáng hôm sau). Ngoài khoảng này sẽ là giờ làm thêm.

7. Tính giờ làm thêm (OVT ngày - cột AC, OVT Đ1 cột AD, OVT Đ2 cột AE)

- Như phần 6 đã trình bày thì khoảng thời gian ngoài khoảng công sẽ được quy là OVT.
+Ca ngày, hành chính, ca 1, ca 2: OVT ngày sẽ lấy mốc 22h, sau 22h sẽ là OVT đêm
+Ca đêm, ca 3: OVT ngày sẽ là khoảng thởi gian làm việc trước 22h. OVT phát sinh sau đó sẽ được tính là OVT đêm.

*Lưu ý: Việc quy định phân chia làm OVT đêm 1 (Đ1) và OVT đêm 2 (Đ2) lý do như sau: Nếu như người lao động phát sinh OVT ngày, thì nếu tiếp tục phát sinh OVT đêm thì OVT đêm đó sẽ quy là OVT Đ1 (được hưởng 210%) còn nếu không phát sinh OVT ngày mà có OVT đêm thì sẽ được tính là OVT Đ2 (được hưởng 200%)
 
Lần chỉnh sửa cuối:
Upvote 0
1. Xét giờ ra vào tại cột H, I và ca tại cột F (Sau đây em xin gọi giờ vào là Vào, giờ ra là Ra, ca là Ca) nếu thỏa mãn thì gán dữ liệu vào cột O và P:
2. Tính khoảng thời gian giữa vào và ra sau đó cho vào cột Q
Tạo bảng phụ trong sheet Form: Giờ Vào Ra từng ca.
Format cột Q dạng "hh:mm"
 

File đính kèm

Upvote 0
1. Xét giờ ra vào tại cột H, I và ca tại cột F (Sau đây em xin gọi giờ vào là Vào, giờ ra là Ra, ca là Ca) nếu thỏa mãn thì gán dữ liệu vào cột O và P:
2. Tính khoảng thời gian giữa vào và ra sau đó cho vào cột Q
Tạo bảng phụ trong sheet Form: Giờ Vào Ra từng ca.
Format cột Q dạng "hh:mm"

Anh ơi, anh thử lại các trường hợp ca khác nhau cho em nhé. Theo như file nó là ca H vậy thì không thể nào nhập ca X Y và Z nó vẫn tính ra được. Cho nên ở trên em miêu tả rất kỹ điều kiện đặt ra. Anh xem lại giúp em nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom