File theo dõi tình hình nghỉ của CBNV

Liên hệ QC
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

  • CongNghi_12_09.rar
    65.1 KB · Đọc: 76
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

  • CongNghi.rar
    65 KB · Đọc: 51
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

  • GPE.rar
    65.5 KB · Đọc: 289
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 !
 
Web KT
Back
Top Bottom