Cần viết 1 Add-In tính ngày công cho bảng chấm công.

Liên hệ QC

redevinte

Thành viên chính thức
Tham gia
27/10/10
Bài viết
65
Được thích
15
Mình gặp phải vài khó khăn khi tính bảng lương, rất mong các bạn giúp!
Mình nghĩ chắc phải viết một Add-In mới được. Các bạn xem file đính kèm nhé!
 

File đính kèm

  • BANG LUONG.xls
    29 KB · Đọc: 100
PHP:
Function CountColor(CountRange As Range, Clor As String) As Single
Application.Volatile
tmp = 0
For Each Cll In CountRange
    If UCase(Clor) = "RED" Then
        If Cll.Font.ColorIndex = 3 Then
            If Cll.Value = "+" Then tmp = tmp + 1
            If Cll.Value = "-" Then tmp = tmp + 0.5
        End If
    Else
        If Cll.Font.ColorIndex = -4105 Then
            If Cll.Value = "+" Then tmp = tmp + 1
            If Cll.Value = "-" Then tmp = tmp + 0.5
        End If
    End If

Next
CountColor = tmp
End Function
Cú pháp:

- Đếm ngày:
AL3 =CountColor(F3:AJ3;"black")

- Đếm đêm:
AM3 =CountColor(F3:AJ3;"red")

Làm chơi thôi (hoặc làm như 1 bài tập), chứ ứng dụng không hay. Vì khi đổi màu chữ nó không tự tính lại.
 
Lần chỉnh sửa cuối:
Mình gặp phải vài khó khăn khi tính bảng lương, rất mong các bạn giúp!
Mình nghĩ chắc phải viết một Add-In mới được. Các bạn xem file đính kèm nhé!
Việc viết 1 hàm đáp ứng nhu cầu của bạn thật chẳng có gì đáng nói (sư phụ PTM đã làm rồi), có điều xin góp ý về phần quy định:

+
Một công làm ca đêm
- Nửa công làm ca đêm
+ Một công làm ca ngày
- Nửa công làm ca ngày
Tức màu đỏ là ĐÊM
Theo tôi bạn nên thay đổi mấy quy định này, đừng lấy màu sắc làm quy định ---> Thiếu chi cách có thể suy nghĩ đến, ví dụ:
D Một công làm ca đêm
d Nửa công làm ca đêm
N Một công làm ca ngày
n Nửa công làm ca ngày
 
Có thể viết thành một hàm bao quát hơn không bạn, ví dụ sẽ lấy màu sắc và ký tự từ một ô mẫu, và tuỳ nhập vào biến để đếm tương ứng không (Ví dụ nhé: Lấy thông tin màu sắc và ký hiệu từ một ô mẫu, Nhập vào bảng cần đếm, nhập vào bước để đếm: 1 hoăc 0.5 hay bất kỳ số nào khác). Mình cũng thử làm rồi nhưng nó bị lỗi! Giúp mình nhé! Không tự động đếm lại khi thay đổi màu sắc thì cũng không hay lắm thật!
 
Việc viết 1 hàm đáp ứng nhu cầu của bạn thật chẳng có gì đáng nói (sư phụ PTM đã làm rồi), có điều xin góp ý về phần quy định:
Tức màu đỏ là ĐÊM
Theo tôi bạn nên thay đổi mấy quy định này, đừng lấy màu sắc làm quy định ---> Thiếu chi cách có thể suy nghĩ đến, ví dụ:
Nếu thay đổi được ký tự như bạn nói thì dễ quá, tôi thay đổi tuốt rồi dùng countif đếm quá dễ, cái này đăng ký rồi không thay đổi được. Thanks bạn góp ý!
 
Nếu thay đổi được ký tự như bạn nói thì dễ quá, tôi thay đổi tuốt rồi dùng countif đếm quá dễ, cái này đăng ký rồi không thay đổi được. Thanks bạn góp ý!
Sở dĩ tôi phải nói thế là vì bạn nên biết rằng: EXCEL KHÔNG XEM VIỆC THAY ĐỔI MÀU SẮC, FONT CHỮ, SIZE CHỮ... LÀ NHỮNG SỰ KIỆN CHANGE ----> Vì thế dù bạn có đổi màu thì hàm cũng chẳng TỰ ĐỘNG CẬP NHẬT đâu
Thật ra cách chẳng phải là không có, chẳng hạn có thể dùng hàm API SetTimer để quét liên tục (theo chu kỳ ngắn), bất cứ thay đổi nào trên sheet (kể cả việc thay đổi màu) nó cũng nhận biết được
Chẳng hạn bài này:
http://www.giaiphapexcel.com/forum/showthread.php?42956-Kh%C3%B4ng-cho-ph%C3%A9p-%C4%91%E1%BB%95i-t%C3%AAn-Sheet&p=282303#post282303
Nhưng nói chung là... hơi nguy hiểm (nếu có ý định lưu thành 1 AddIn)
 
Lần chỉnh sửa cuối:
Có thể viết thành một hàm bao quát hơn không bạn, ví dụ sẽ lấy màu sắc và ký tự từ một ô mẫu, ...
Vậy còn dễ hơn.
PHP:
Function CountColor(CountRange As Range, ColorCell As Range) As Single
Application.Volatile
If ColorCell.Count > 1 Then CountColor = [NA()]: Exit Function
tmp = 0
For Each Cll In CountRange
        If Cll.Font.ColorIndex = ColorCell.Font.ColorIndex Then
            If Cll.Value = "+" Then tmp = tmp + 1
            If Cll.Value = "-" Then tmp = tmp + 0.5
        End If
Next
CountColor = tmp
End Function
Cú pháp:
AL3 =CountColor(F3:AJ3;$F$11)
AM3 =CountColor(F3:AJ3;$F$9)

cái này đăng ký rồi không thay đổi được
Sao lại phải đăng ký quy ước chấm công nhỉ? Với lại, sao lại chọn cách chấm công màu từ đầu nhỉ? Với lại, chấm công màu chả lẽ khi in ra cũng in màu? Với lại, ...
 
- Mình không rõ lắm, mình không làm về kế toán, cái này chị kế toán nhờ nên tìm hiểu, khó khăn quá mới mang lên nhờ mọi người giúp. Mà bạn thử lại lệnh đi, mình cũng thử rồi nhưng đếm không đúng!
- Ban kiểm tra lại giúp mình nhé, nó chỉ đếm từ ngày 1 đến ngày 28, còn 29, 30, 31 thì không. Chắc là kiểu dữ liệu Range chỉ rộng có bấy nhiêu thôi sao?
 
Lần chỉnh sửa cuối:
Mình không rõ lắm, mình không làm về kế toán, cái này chị kế toán nhờ nên tìm hiểu, khó khăn quá mới mang lên nhờ mọi người giúp. Mà bạn thử lại lệnh đi, mình cũng thử rồi nhưng đếm không đúng!
Cụ thể là không đúng chổ nào (phải nói mới biết chứ)
Lưu ý rằng cell AH3 và AJ3, trước dấu + có 1 khoảng trắng đó nha ---> Dữ liệu nhập sai, nó đếm ra sai là lỗi của bạn chứ không phải lỗi do code!
 
Cụ thể là không đúng chổ nào (phải nói mới biết chứ)
Lưu ý rằng cell AH3 và AJ3, trước dấu + có 1 khoảng trắng đó nha ---> Dữ liệu nhập sai, nó đếm ra sai là lỗi của bạn chứ không phải lỗi do code!

Mình đã xem lại, mình gõ dấu + và kiểm tra không thấy khoảng trắng, kết quả không có gì thay đổi cả. Nhưng mình nhập bằng cách copy dữ liệu từ các ô phía trước vào thì nó đếm đúng. Ban xem file mình gửi kem nên nhe: AL3 thì đúng mà AL4 thì chưa đúng, nếu bạn copy bằng cách kéo từ ô khác vào AJ4 thì kết quả lại đúng. Mình kiểm tra không thấy dấu cách trống trong ô trên mà. Ban xem giúp mình vì dùng để tính lương thật, nếu nhầm lẫn thì rất nguy hiểm!
 

File đính kèm

  • BANG LUONG - Copy.xls
    36 KB · Đọc: 72
Mình đã xem lại, mình gõ dấu + và kiểm tra không thấy khoảng trắng, kết quả không có gì thay đổi cả. Nhưng mình nhập bằng cách copy dữ liệu từ các ô phía trước vào thì nó đếm đúng. Ban xem file mình gửi kem nên nhe: AL3 thì đúng mà AL4 thì chưa đúng, nếu bạn copy bằng cách kéo từ ô khác vào AJ4 thì kết quả lại đúng. Mình kiểm tra không thấy dấu cách trống trong ô trên mà. Ban xem giúp mình vì dùng để tính lương thật, nếu nhầm lẫn thì rất nguy hiểm!
Bạn chọn cell AJ4, tô màu font thành Automatic rồi bấm F9 xem thử nhé

untitled.JPG


Đã gọi là SO SÁNH thì dù khác có 1 tí xíu cũng coi như là khác (con mắt của ta đâu tinh bằng máy tính)
 
Màu font của ô AJ4 không giống màu các ô khác.

Nguy hiểm vô cùng! Lẩm cẩm hay quên như tôi sẽ báo cáo sai và bị đuổi việc mất.
 
Màu font của ô AJ4 không giống màu các ô khác.

Nguy hiểm vô cùng! Lẩm cẩm hay quên như tôi sẽ báo cáo sai và bị đuổi việc mất.
Em còn phát hiện ra cái này mới thật tức cười
- Cell AL3 đang có kết quả = 18.5
- Bôi đen công thức trên thành Formula rồi bấm F9, ta thấy kết quả = 22
Là sao ta?
 
Em còn phát hiện ra cái này mới thật tức cười
- Cell AL3 đang có kết quả = 18.5
- Bôi đen công thức trên thành Formula rồi bấm F9, ta thấy kết quả = 22
Là sao ta?
Co cách nào tự động bỏ ký tự trắng trước hoặc sau ký tự "+", "-" để đếm cho chính xác không bạn?
 
Co cách nào tự động bỏ ký tự trắng trước hoặc sau ký tự "+", "-" để đếm cho chính xác không bạn?

Rất đơn giản: Dùng hàm Trim. Cụ thể là cho Trim vào các dòng sau:

PHP:
        If Cll.Font.ColorIndex = ColorCell.Font.ColorIndex Then
            If Trim(Cll.Value) = "+" Then tmp = tmp + 1
            If Trim(Cll.Value) = "-" Then tmp = tmp + 0.5
        End If
 
Rất đơn giản: Dùng hàm Trim. Cụ thể là cho Trim vào các dòng sau:

PHP:
        If Cll.Font.ColorIndex = ColorCell.Font.ColorIndex Then
            If Trim(Cll.Value) = "+" Then tmp = tmp + 1
            If Trim(Cll.Value) = "-" Then tmp = tmp + 0.5
        End If
Vậy là tạm ổn, cảm ơn bạn nhiều!
 
Web KT
Back
Top Bottom