File theo dõi tình hình nghỉ của CBNV (1 người xem)

Liên hệ QC

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

hoangluong

Thành viên mới
Tham gia
2/10/07
Bài viết
18
Được thích
94
Xin chào ACE!
Mình làm file theo dõi tình hình nghỉ của CBNV bao gồm các loại: Nghỉ phép, nghỉ có lương, nghỉ không lương, nghỉ ốm, nghỉ chế độ...Tuy nhiên, công thức mình làm thì file rất nặng, chờ đợi để rất lâu.
ACE giúp mình xem có công thức nào nhẹ hơn không?
 

File đính kèm

Mình làm file theo dõi tình hình nghỉ của CBNV bao gồm các loại: Nghỉ phép, nghỉ có lương, nghỉ không lương, nghỉ ốm, nghỉ chế độ...Tuy nhiên, công thức mình làm thì file rất nặng, chờ đợi để rất lâu. ACE giúp mình xem có công thức nào nhẹ hơn không?
Nếu công thức nặng thì có thể chuyển sang hàm tự tạo;

Cũng muốn thử lập cho bạn 1 hàm xem sao. nhưng bạn quá tiết kiệm khi đưa dữ liệu lên, nó chưa tiêu biểu ở chổ:

(*) bạn chỉ đưa lên ngày phép năm, sao không thêm 1 dòng cho loại công khác nữa (chí ít) có hơn không!

(*) Danh sách Cơ quan bạn chắc nhiều (Mới gây lặc lè khi chạy công thúc); Vậy mà bạn đưa lên được chỉ có hai người, không có lấy thêm 1 mống thứ ba, thứ tư, . . . nữa là làm sao?

(+) Thường xưa những loại công này cùng theo dõi với các loại công khác trong bảng chấm công hàng ngày; Cuối mỗi tháng người thống kê tổng hợp 1 lần để ra lương. Đây bạn tách ra; Vậy hãy cho biết luôn, trong bảng chấm công tháng của bạn có nội dung rặng?

Rất chờ tin bạn!
 
Mình có file theo dõi công nghỉ của CNV chạy rất chậm. mong các bạn trên diễn đàn sửa giúp. Xin chân thành cám ơn!
 

File đính kèm

Mình có file theo dõi công nghỉ của CNV chạy rất chậm. mong các bạn trên diễn đàn sửa giúp. Xin chân thành cám ơn!
Theo tôi hình như tất cả các công thức, các name của bạn đều cho tính trên cả cột nên khi tính toán máy sẽ chạy chậm - Bạn thử sửa lại công thức vừa đủ xem sao.
Thân
 
Cám ơn minhtri0827. mình đã theo góp ý của diễn đàn cho tính các name động nhưng vẫn chậm. Mong được sự giúp đỡ bằng VBA.
 
Nếu công thức nặng thì có thể chuyển sang hàm tự tạo;

Cũng muốn thử lập cho bạn 1 hàm xem sao. nhưng bạn quá tiết kiệm khi đưa dữ liệu lên, nó chưa tiêu biểu ở chổ:

(*) bạn chỉ đưa lên ngày phép năm, sao không thêm 1 dòng cho loại công khác nữa (chí ít) có hơn không!

(*) Danh sách Cơ quan bạn chắc nhiều (Mới gây lặc lè khi chạy công thúc); Vậy mà bạn đưa lên được chỉ có hai người, không có lấy thêm 1 mống thứ ba, thứ tư, . . . nữa là làm sao?

(+) Thường xưa những loại công này cùng theo dõi với các loại công khác trong bảng chấm công hàng ngày; Cuối mỗi tháng người thống kê tổng hợp 1 lần để ra lương. Đây bạn tách ra; Vậy hãy cho biết luôn, trong bảng chấm công tháng của bạn có nội dung rặng?

Rất chờ tin bạn!

Chào bạn!

+ trong phần file theo dõi, ngoài nghỉ phép mình có đưa thêm nghỉ ốm, nghỉ con ốm, nghỉ có lương, nghỉ không lương...Bạn xem tại sheet 2
+ CBNV bên mình khoảng gần 400, nên khi chạy công thức đó rất nặng nên nhờ ACE xem có công thức thay thế để nhẹ hơn không?
+ Trong file theo dõi của mình có tất cả 3 sheet:
* sheet1: là bảng gốc để lấy mã của CBNV, tổng hợp ngày nghỉ phép, nghỉ ốm...của cả năm (Để CB có thể theo dõi CB nghỉ bao nhiêu ngày rồi, đã hết ngày nghỉ phép chưa....)
* Sheet 2: là phần nhập dữ liệu: khi CBNV nghỉ thì sẽ có phiếu xin nghỉ, CB chấm công sẽ có trách nhiệm nhập dữ liệu hàng ngày vào
* Sheet 3: Đây là phần tự động xuất số liệu ra từng tháng để lấy dữ liệu làm bảng lương.

ACE đóp góp ý kiến nhé
 
Như mình, muốn chuyển hoàn toàn sang VBA thì:

Mình có file theo dõi công nghỉ của CNV chạy rất chậm. mong các bạn trên diễn đàn sửa giúp. Xin chân thành cám ơn!

(1) Bỏ toàn bộ 726 * 31 công thức đồ sộ bên "Cham Cong";

(2) Bỏ hoàn toàn 200 * 4 công thức vĩ đại bên "Cong Nghi"
Thay vô đó bằng macro sẽ giúp bạn trong nháy mắt tìm & gán đúng tên khi bạn đã biết & nhập mã nhân viên vố các cột có MOD(Column,4) = 2 ("B,"F",. . . )

(2.1) Có thể sửa lại cấu trúc trang tính này chỉ còn 5 trường mà thôi; 4 trường đầu & thêm trường [loaiCong]; Trường cuối sẽ chứa các ký tự loại công mà đơn vị bạn quy ước;

Xin hỏi thêm: Bạn xài Font gì mà mình không thể chuyển đổi được sang Unicode được vậy?

Nêu bạn đồng ý, chúng ta sẽ bắt tay vào việc; Mình hứa chắc sẽ viết các macro cho bạn đạt kết quả như hiện tại yêu cầu chỉ không quá 1 phút; Chắc đó nghe!
 
Cám ơn bạn chanhTQ@. Thực sự mình rất bí về đoạn này, rất mong bạn giúp đỡ. Xin cám ơn nhiều
 
Cải tổ toàn bộ kế`t cấu luôn; Nếu ưng í ta tiếp tục

Cám ơn bạn chanhTQ@. Thực sự mình rất bí về đoạn này, rất mong bạn giúp đỡ. Xin cám ơn nhiều

Chú í khi sử dụng:

(*) Mình đã đổi tên các trang tính; Cũ của bạn rườm rà hơn đó;

(*) Thay đổi mã đơn vị tại 'DonVi'[D2] để xem macro đưa ra kết quả. (Nhưng chỉ chưa nhiều các đơn vị có công phép; Bạn thử nhập tiếp vô 'CongNghi' để chiêm nghiệm);
(Hiện tại mới có vài đơn vị có người có công nghỉ)

(*) Có thể chạy riêng macro 'CopyToChamCong' bằng tổ hợp fím nóng cài sẵn
PHP:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, [D2]) Is Nothing Then
   Dim Sh As Worksheet, Rng As Range, sRng As Range
   Dim MyAdd As String
   
   Application.ScreenUpdating = False:       CopyToChamCong
   Sheets("DonVi").Select
   Set Sh = Sheets("ChamCong"):          Range("B5:AI138").ClearContents
   Set Rng = Sh.Range(Sh.[d3], Sh.[d65500].End(xlUp))
   Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
   If Not sRng Is Nothing Then
      MyAdd = sRng.Address
      Do
         [B138].End(xlUp).Offset(1).Resize(, 34).Value = _
            sRng.Offset(, -2).Resize(, 34).Value
         Set sRng = Rng.FindNext(sRng)
      Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
   End If
   
 End If
End Sub

(*) . . . . Chúc vui!
 

File đính kèm

Ừ hử, còn chưa chỉnh & nó phải là vầy:

Xin chân thành cảm ơn bạn HYen17. Tôi đã nhận được file theo dõi công nghỉ bạn đã sửa chữa cho. Song trong quá trình thao tác thì số ngày copy sang bảng chấm công không thể hiện được ngày bắt đầu, VD ngày bắt đầu là ngày 12/9 thì sang ngày 13/9 mới thể hiện trong bảng chấm công. Mong bạn sửa giúp. Xin cám ơn nhiều. ĐChỉ của mình: tulaphl@yahoo.com
PHP:
Option Explicit
Sub CopyToChamCong()
0 Dim Sh As Worksheet, Rng As Range, sRng As Range
 Dim Clls As Range, Rng0 As Range
 Dim SoNgay As Byte, NgayBD As Integer, Jj As Byte
 
 Set Sh = Sheets("CongNghi"):       Sheets("ChamCong").Select
 [e4].Resize([A65500].End(xlUp).Row, 31).ClearContents
 
 Set Rng = Range([C3], [C65500].End(xlUp))
 Set Rng0 = [e2].Resize(, 31)
 Rng0.NumberFormat = "MM/DD/yyyy"
 For Each Clls In Sh.Range(Sh.[B3], Sh.[b65500].End(xlUp))
   Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
   If Not sRng Is Nothing Then
      sRng.Interior.ColorIndex = 35
      With Clls.Offset(, 1)
         NgayBD = Day(.Value):        SoNgay = .Offset(, 1).Value - .Value
      End With
      For Jj = NgayBD - 1 To (NgayBD + SoNgay) '*'
         If Weekday([e2].Offset(, Jj).Value) <> 1 Then
            Cells(sRng.Row, [e2].Offset(, Jj).Column).Value = Clls.Offset(, 3).Value
         Else
            Cells(sRng.Row, [e2].Offset(, Jj).Column).Value = "CN"
         End If
      Next Jj
   End If
 Next Clls
Rng0.NumberFormat = "DD"
End Sub
 
Cám ơn bạn HYen17, bạn thật giỏi, đoạn code bạn sửa lại cho chạy rất tốt. Khi nào mình gặp phải trường hợp khó lại mong bạn giúp đỡ nhé, xin đừng từ chối. Hẹn gặp lại
 
Tiếp tục bỏ các công thức tại vùng 'AL5:AP138' của trang tính DonVị

Thay vào đó là đoạn macro như sau:

Mã:
[B]Private Sub Worksheet_Change(ByVal Target As Range)[/B]
  [COLOR=silver] ' . . . . . . ' [/COLOR]
  [COLOR=silver] ' . . . . . . ' [/COLOR]
  [COLOR=silver] ' . . . . . . ' [/COLOR]
[COLOR=silver]  End If[/COLOR]
   
   Set Rng = [AL5]
   Rng.FormulaR1C1 = "=COUNTIF(R[1]C5:R[1]C35,R4C)"
   Rng.Select
   Selection.AutoFill Destination:=Range("AL5:AO5"), Type:=xlFillDefault
   Rng.Offset(, 4).FormulaR1C1 = "=SUM(RC[-4]:RC[-1])"
   Rng.Resize(, 5).AutoFill Destination:=Range("AL5:AP" & _
      [c5].End(xlDown).Row), Type:=xlFillDefault
[COLOR=silver]End If[/COLOR]
[B]End Sub[/B]

Thêm đoạn này nó chỉ điền công thức tới đủ thì dừng, chứ không như bạn, điền công thức phải chắc dư: Dẫn đến hao tài nguyên của chúng ta, nói chung!
 
Chào bạn HYen17, xin cám ơn và chúc một ngày tốt đẹp vui vẻ. Các đoạn Code bạn viết cho tôi thật hữu dụng, nhưng có một ý nhỏ tôi muốn hỏi bạn: hiện tai file hoạt động tốt nhưng mỗi khi nhập số liệu xong thì cứ phải kích hoạt tại Sheet"Donvi" thì số liệu mới chạy, mong bạn chỉ bảo. Thân chào
 
Tuy bạn thấy là chuyện nhỏ, nhưng mình chưa hiểu hết í, nên thành lớn chuyện

Các đoạn Code thật hữu dụng, nhưng có một ý nhỏ tôi muốn hỏi bạn: hiện tai file hoạt động tốt nhưng mỗi khi nhập số liệu xong thì cứ phải kích hoạt tại Sheet"Donvi" thì số liệu mới chạy, mong bạn chỉ bảo. Thân chào
Chúng ta đang có 2 macro;

Cái thứ 2 đang ở module 1; ta có thể & đã gán fím tắc cho nó & chạy lúc nào ta muốn nó cập nhựt dữ liệu từ CongNghi sang ChamCong (& chỉ có thế mà thôi)

Cái thư nhứt macro đang ở trong trang tính DonVi; Trong cái này giữa chừng có gọi cái thứ hai để làm phần việc cập nhựt này.

Nếu bạn muốn macro này chạy bất cú từ địa điểm nào bạn đang đứng thí ta tách macro ấy ra; Phần chủ yếu macro phải để trong module 1 (Tạm gọi macro này là GPE);

Khi ấy ta có thể triệu gọi GPE này từ việc kích hoạt [D2] của trang 'DonVi' hay từ 1 macro sẽ phải tạo (Tạm gọi là NEW) để cung cấp mã đơn vị cho GPE làm việc trơn tru; NEW sẽ được chúng ta gán fím tắc để ới lúc nào ta muốn.

(Thật ra mình chưa dám khẳng định là hiểu chu trình vận hành WorkBook này của bạn;
Cứ xem như ta nhập vô trang CongNghi; Chạy hay không chạy macro thứ 2;
Khi cần báo cáo (hay in ấn) ta sang DonVi để chạy ra cái đơn vị cần thiết để xem hay in
). Nếu không phải, làm ơn cho mình biết đặng cùng nhau thống nhứt trong hình dung sự việc tổng thể.

Chúc vui!
 
Đúng như bạn nói, dữ liệu được nhập vào trang congnghi và mình muốn nó được cập nhật ngay sang trang chamcong, còn trang Donvi khi nào in tì mình mới kích hoạt [D2]. Bạn nói đã gán phím tắt đó là phím nào. mình rất cảm ơn bạn đã giúp mình. Thân chào
 
Ái dzà, có lẽ chúng ta phải quay lại từ đầu?!

Hiện tại, macro ở bài 11 nó chép toàn bộ các records trong CongNghi đến ChamCong;
Để thấy được fím nóng của nó, bạn thực hiện các công đoạn sau:
Vô menu Tool -> Macro -> Macro. . .
Ta sẽ thấy tên một số các macro có trong workbook;
Bạn chọn vô ngăn Option để xem;

Nếu bạn muốn chép từng dòng từ CongNghi sang ngay ChamCong ta phải đổi lại nội dung macro này;
(Vì trước đây cấu trúc CongNghi khác bây chừ, giờ có thuận tiện hơn)

Lúc đó khi chọn DonVi bên trang tính thứ 3 sẽ không cần triệu gọi macro thứ hai nữa;

Nhưng có điều này cần nói trước; Trang ChamCong phải làm lại từ đầu mỗi tháng. (Điều này có thể tự động hóa được, . . .)

Tóm lại làm lại toàn bộ thì dễ hơn!. . . Việc này sẽ phải tốn thời gian một chút.
Nhưng để vậy, cho hỏi các dòng tổng hợp ở dưới & bên phải của trang chamCong có dùng làm gì không? Bạn hãy cho biết nha!

Chờ tin bạn!
 
Cám ơn HYen17, tôi đã tìm được rồi. Bảng theo dõi công nghỉ này là dùng tốt lắm rồi, rất cảm ơn bạn. Các dòng tổng hợp bên dưới & bên phải dùng để biết mỗi ngày có bao nhiêu người nghỉ và bên phải là tổng hợp công nghỉ các loại của từng người trong tháng. Thân chào và hẹn gặp lại!
 
Nhờ sửa giúp file Excel
Hôm trước bạn đã giúp mình sửa file theo dõi công nghỉ hiện thời hoạt động rất tốt nhưng trong đó chưa có công nghỉ lễ. Bạn giúp mình:
(*) Cho thêm công nghỉ lễ "L" vào trang "chamcong" như các công "CN" khi gặp ngày chủ nhật, vì ngày lễ là công chế độ mà ở Công ty mình thì ngoài các ngày lễ theo quy định chung của Nhà Nước còn được nghỉ một số ngày của ngành.

Những ngày lễ này có thể được ấn định ở một vùng nào đó hoặc được ghi thẳng vào các ngày của tháng đang theo dõi. Mình mong bạn giúp đỡ, Thân chào và hẹn gặp lại.​


Mình sẽ làm 1 macro để tháng nào có ngày nghĩ của Nhà nước, hay CTi quy định thì sẽ thêm công 'L' vô;
Nhưng để làm việc đó, mình sẽ yêu cầu bạn 2 vấn đề:
(.) Ngày âm lịch bạn tự điền vô hàng năm
(.) Bạn cho biết CTi bạn có cho nghĩ vào các ngày nào trong năm; Nếu đó là ngày truyền thống của ngành thì hãy cho biết; Còn đó là ngày sinh/tử của vị chức sắc nào đó mà tính theo âm lịch thì bạn cũng phải tự nhập hàng năm;

Dự định của mình là sẽ lấy 1 vùng trên trang tính 'CongNghi' như 'H:I' để liệt kê các công nghĩ bạn sẽ cung cấp (Cũng như sau này bạn sã phải sửa đổi/bổ sung vào đầu năm nếu đó là ngày âm)

Chờ thông tin từ bạn!

 
Xin cám ơn HYen17.Công ty mình có các ngày lễ sau: Các ngày dương lịch 01/01; 30/04; 01/05;02/09;12/11 (ngày truyền thống công nhân mỏ). Các ngày âm lịch 30/12; 01/01; 02/01; 03/01 (tết nguyên đán); 10/03 (giỗ tổ Hùng Vương). Mong bạn giúp mình; xin chân thành cám ơn và xin được kết bạn để mình được học hỏi thêm.
 
Xin mời!

Bạn đặt macro này trong ThisWorkBoook
PHP:
Option Explicit
Private Sub Workbook_Open()
 Dim Rng As Range, Clls As Range, Sh As Worksheet
 Dim sRng As Range, Rngd As Range, Col As Byte
 
1 Set Rng = Range("NghiLe"):            Set Sh = Sheets("Chamcong")
 Set Rngd = Sh.[E2].Resize(, 31)
3 If Day(Date) > 5 Then Exit Sub
 For Each Clls In Rng
   Set sRng = Rngd.Find(Clls.Value, , xlFormulas, xlWhole)
   If Not sRng Is Nothing Then
      Col = sRng.Column
      Sh.Range(Sh.Cells(4, Col), Sh.Cells(Sh.[B65500].End(xlUp).Row, Col)).Value = "L"
   End If
Next Clls
End Sub
Nhưng khoan cho nó chạy; Mà phải thêm các động tác sau:
Tại trang 'CongNghi' bạn phải có chí ít dữ liệu như sau:
|. .| H | I |
2|| Ngày Lễ ||
3||1/1/2009|Đầu năm|
4|| 2/1/2009 | Ba mươi Tết |
5|| 2/2/2009 | Mùng MộtTết |
6|| 2/3/2009 | Mùng Hai Tết |
7|| 2/4/2009 | Mùng Ba Tết |
8|| 3/10/2009 | Gỗ Tổ |
9||4/30/2009|Ngày Thống nhất|
10||5/1/2009|Lao động|
11||9/2/2009|Quốc khánh|
12||11/12/2009|Truyền thống
13|||..|
Sau đó tô chọn vùng 'H3:H15' & gán nó với cái tên 'NghiLe' (ứng với dòng lệnh 1)
Hiện tại macro chỉ làm việc trong 5 ngày đầu của tháng (dòng lệnh 3);
Nếu ngày nghĩ lễ có ai đi làm thì bạn phải nhập bằng tay sau ngày 5 hàng tháng

Một số lưu í

(+) Để an tâm với các ngày dương lịch ta sử dụng công thức =DATE(Year(TODAY()),1,1) cho ô [H3]
=DATE(YEAR(TODAY()),9,2) cho [H11] , . . .
Chuyện này không thể áp dụng cho ngày âm!

(+) Chú í khi ngày lễ trùng với ngày CN,

(+) Lúc đầu, trong quá trình thử nghiệm, ta có thể vô hiệu hóa dòng lệnh 5; Khi đó cứ mở file lên là macro sẽ cập nhựt ngày lễ có trong tháng. Việc này sẽ làm ta tốn thêm thời gian. Việc tốn này về lâu dài là không cần thiết. Lúc đó ta lại hiệu lực hóa dòng lệnh 3 đó lại!
 
Thấy nhau chẳng nói lên lời
Nay mượn bàn phím ngỏ lời chúc nhau
Chúc cho bạn được mạnh giầu
Chúc cho tôi được bắc cầu học thêm
...
 
HYen17 ơi! mình đã làm theo đúng việc sửa lại của bạn nhưng file không chạy được ngày lễ. Mình gửi file đã sửa nhờ bạn kiểm tra giúp. Xin cám ơn bạn!
 

File đính kèm

Lần chỉnh sửa cuối:
Xem kỹ hướng dẫn xíu đi nghe!

Hôm nay đã là ngày 11 của tháng; Hơn ngày 5 rất nhiều, thì macro chỉ chạy đến dòng lệnh 3 mà thôi;

Muốn thử tiếp bạn phải vô hiệu hóa dòng lệnh 3 í đi bằng cách thêm dấu nháy đơn ngay sau con số 3 ấy ngay đi;

Lưu & đónmg nó lại;

Sau đó mở lên xem ngày 1 của tháng 1 í có gì mới không vậy?

Hiện tại macro chỉ làm việc trong 5 ngày đầu của tháng (dòng lệnh 3);
 
Cám ơn ChanhTQ@. mình đã sửa theo đúng ý của bạn, nhưng file chỉ chạy copy được sang chấm công mà chưa copy được sang trang "Donvi". Nhờ bạn sửa giúp, xin cám ơn
 
Lần chỉnh sửa cuối:
Hiện file chỉ copy sang chamCong mà chưa copy được sang "Donvi". Nhờ bạn sửa giúp

Lí do chưa Copy sang 'DonVi vì macro tại bài #11 có 2 dòng lệnh sau:
PHP:
   Sheets("ChamCong").Select
    [e4].Resize([A65500].End(xlUp).Row, 31).ClearContents
Có nghĩa là những gì macro WorkBook_Open làm từ đầu tháng đã bị xóa sạch còn đâu!

Một trong các cách sửa có thể là như vầy:

(1) Bạn vô ThíWorkBook, dùng chuột tô chọn toàn bộ vùng từ lệnh Dim . . .
cho đến hết dòng Nex Clls
Và thật mạnh tay & dứt khoát nhấn {CTRL} & 'X" để cắt chúng vô bộ nhớ trung gian;

(2) Tìm đến module 1

Ta nhập câu lệnh:
Sub GPE , sau đó nhấn phím {ENTER}

VBA sẽ tạo ra macro mới với 2 dòng lệnh sau:

PHP:
Sub GPE()
 
End Sub

Bạn để con trỏ vô giữa 2 dòng lệnh & bâm tổ hợp phím {CTRL} & 'V' để dán những gì trong bộ nhớ vô đó

(3) Quay lại ThisBook, macro WorkBook_Open giờ chỉ còn 2 dòng lệnh;
Ta thêm dòng thứ 3 vô giữa 2 dòng nói trên câu lệnh sau:

Mã:
[COLOR=#000000]if  day(date()) < 5 then gpe[/COLOR]
Nếu ta sau khi {ENTER} nó tự đổi một số chữ cái trong dòng lệnh thành chữ hoa & cả 3 ký tự 'gpe' giờ thành 'GPE' như ta nhập để tạo tên macro là OK!

(4) Vô lại macro của bài #11
(Sub CopyToChamCong(). . . End Sub)
Sau 2 dòng lệnh trích dẫn từ đầu của bài này, ta lại nhập 'gpe' & lại {ENTER}

Đó là cách ta gọi thực hiện lại 1 macro

(5) Ta vô hiệu hóa dòng lệnh số 3 ấy đi/ hay là xóa hẵn càng nên)


Hãy thử sức, bạn sẽ luôn được sự hỗ trợ khi cần thiết!
 
Lần chỉnh sửa cuối:
Cám ơn ChanhTQ@. Mình làm bạn mất nhiều thời gian về mình quá, tôi đã thay như hướng dẫn của bạn nhưng không được. Nay tôi gửi file đính kèm để bạn kiểm tra giúp, mình dang dùng Font .Vntime
Xin cám ơn bạn nhiều
 

File đính kèm

Lần chỉnh sửa cuối:
File của bạn còn sai 2 chỗ

(1) Bạn đang dư 1 dòng lệnh
Mã:
If Day(Date) < 5 Then GPE
Nó chênh vênh, vì không thuộc Sub. . . End Sub nào hết;

Để tìm dòng này, bạn mở 1 macro nào đó bất kỳ;

Trên thanh menu của Microsoft Vissúal Basic ta vô Debug & bấm vô dòng Compile VBAProject
(Hay đơn giản ta bấm {F5}) thì VBA sẽ đưa ta đến dòng lỗi này; Bạn chỉ việc xóa bén nó đi & thử lặp lại các động tác kiểm 1 lần nữa; Nếu VBA không báo lỗi nữa thi OK!

(2) Trong macro sau, bạn chưa thêm dòng lệnh (được tô đậm như dưới đây:

Mã:
[COLOR=Gray][B]Sub CopyToChamCong()[/B][/COLOR]
 [COLOR=Gray]Dim Sh As Worksheet, Rng As Range, sRng As Range
 Dim Clls As Range, Rng0 As Range
 Dim SoNgay As Byte, NgayBD As Integer, Jj As Byte
 
 Set Sh = Sheets("CongNghi"):       Sheets("ChamCong").Select
 [e4].Resize([A65500].End(xlUp).Row, 31).ClearContents[/COLOR]
 GPE
[COLOR=Gray] Set Rng = Range([C3], [C65500].End(xlUp))[/COLOR]
[COLOR=Blue]' . . . . .  '
'. . . . . . . .  .'
'. . . . . . . '[/COLOR]

[B][COLOR=Gray]End Sub[/COLOR][/B]

Hẹn dịp sau!
 
Chào HYen17, mình đã sửa theo đúng ý bạn và đã chạy thử nhưng có một điểm là khi chấm công nghỉ qua các ngày "L" thì ngày "L" không được phản ảnh như ngày "CN"
 
HYen17 ơi! việc chấm các ngày lễ thật phức tạp, theo ý mình liệu có thể đánh thẳng "L" vào các ô tại dòng 3 khi có ngày "L" thì vùng chấm công tự điền "L" vào hoặc khi chấm công qua ô "L" thì được ghi là "L" như ngày "CN". Mình nghĩ thế có ớ ẩn không
 
Việc chấm các ngày lễ thật phức tạp, theo ý mình liệu có thể đánh thẳng "L" vào các ô tại dòng 3 khi có ngày "L" thì vùng chấm công tự điền "L" vào hoặc khi chấm công qua ô "L" thì được ghi là "L" như ngày "CN". Mình nghĩ thế có ớ ẩn không

Vấn đề là chúng ta chưa làm đúng như sự việc cần phải có;

Thực tế là, đã là ngày lễ thì không có công nào khác (như B, F, Ro, B, VLD0) được chấm đề lên như của chúng ta hiện nay) Chỉ có thể sau đó được ghép thêm công thêm giờ hay công làm việc khác mà thôi (như công trực,. . .). Nhưng chuyện ghép này ta chưa thể làm gì khác mà tạm làm bằng tay.

Hãy chờ 1 thời gian & giải quyết công lễ này sẽ là vấn đề không đơn giản rồi.

Hãy gắn chờ đợi ha! :-= --=0 :-=
 
Bạn hãy kiểm thử theo file đính kèm, thay vì chờ đợi

Có lẽ chờ còn khá lâu;

Bạn thử nghiệm xem trong file đính kèm còn gì chưa thực sự diễn ra trong thực tế tại đơn vị bạn! --=0 :-= --=0

Lưu í:

Mình đã bỏ macro trong ThisBook đi rồi, vì đằng nào cũng phải gọi nó trong khi chép công.

Mình đảo thứ tự gọi macro GPE, thay vì gọi trước khi gọi Sub CopyToChamCong, nay ta đang gọi sau nó.

(Thử với tháng 9 xong, bạn chịu khó thử với tháng 1 xem nha. Chú í & cho mình biết những gì chưa thực sự hợp lý)
 

File đính kèm

Cám ơn HYen17, bạn giỏi quá, mình rất biết ơn bạn. Mình đã thay vào và tính thử tháng 1/09 các công khác đã không đè lên ngày lễ, nhưng ngày lễ lại đè lên ngày chủ nhât. Nhưng việc này không sao cả vì số ngày lễ có ít, mình sẽ chú ý khi nào gặp trường hợp này mình sẽ điều chỉnh cộng thêm sau, Chân thành cảm ơn bạn, thân chào và hẹn gặp lại!
 
Cám ơn HYen17, bạn giỏi quá, mình rất biết ơn bạn. Mình đã thay vào và tính thử tháng 1/09 các công khác đã không đè lên ngày lễ, nhưng ngày lễ lại đè lên ngày chủ nhât. Nhưng việc này không sao cả vì số ngày lễ có ít, mình sẽ chú ý khi nào gặp trường hợp này mình sẽ điều chỉnh cộng thêm sau, Chân thành cảm ơn bạn, thân chào và hẹn gặp lại!
Chào bạn tlaphl, bạn gửi tôi xin "File theo dõi tình hình nghỉ của CBNV" bạn đang dùng. Bạn gửi giúp vào btuong88@gmail.com. Cảm ơn bạn.
 
Ừ hử, còn chưa chỉnh & nó phải là vầy:


PHP:
Option Explicit
Sub CopyToChamCong()
0 Dim Sh As Worksheet, Rng As Range, sRng As Range
 Dim Clls As Range, Rng0 As Range
 Dim SoNgay As Byte, NgayBD As Integer, Jj As Byte
 
 Set Sh = Sheets("CongNghi"):       Sheets("ChamCong").Select
 [e4].Resize([A65500].End(xlUp).Row, 31).ClearContents
 
 Set Rng = Range([C3], [C65500].End(xlUp))
 Set Rng0 = [e2].Resize(, 31)
 Rng0.NumberFormat = "MM/DD/yyyy"
 For Each Clls In Sh.Range(Sh.[B3], Sh.[b65500].End(xlUp))
   Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
   If Not sRng Is Nothing Then
      sRng.Interior.ColorIndex = 35
      With Clls.Offset(, 1)
         NgayBD = Day(.Value):        SoNgay = .Offset(, 1).Value - .Value
      End With
      For Jj = NgayBD - 1 To (NgayBD + SoNgay) '*'
         If Weekday([e2].Offset(, Jj).Value) <> 1 Then
            Cells(sRng.Row, [e2].Offset(, Jj).Column).Value = Clls.Offset(, 3).Value
         Else
            Cells(sRng.Row, [e2].Offset(, Jj).Column).Value = "CN"
         End If
      Next Jj
   End If
 Next Clls
Rng0.NumberFormat = "DD"
End Sub
Anh ơi, Em đang cần file này. Nhưng em muốn chạy từ ngày bắt đầu 01/09/2009 đến ngày kết thúc 01/09/2009 là chỉ có 1 ngày. Hiện tại nó nhảy sang ngày 02/09/2009. Anh sửa giúp em được không ạ. Em cảm ơn !
 

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

Back
Top Bottom