Xin hỗ trợ code VBA này để nhập Bảng chấm công không tính chủ nhật

Liên hệ QC

MinhKhai

Giải pháp Ếc-xào
Tham gia
16/4/08
Bài viết
939
Được thích
571
Em có file chấm công gửi kèm. Nhờ các bác bổ sung, thay đổi code VBA để khi bấm nút Nhap Cac Dau x thì Excel chỉ nhập các dấu X trong vùng nhưng không gồm những ngày CN (cột nền cam) (Hoặc nếu nhập đủ thì ngay lập tức xóa các dấu X ở các cột màu cam.

https://dl.dropbox.com/s/pjm68ulg1h...L6ARgXKt0nYcqzgjbMRQjV2IAlEc6QcBLGKNwusA&dl=1

Sửa code của bạn thành vầy nhé:
Mã:
Sub Nhap()
  Dim aDat, rng As Range
  Dim i As Long
  On Error Resume Next
  With Range("C5:AG5")
    aDat = .Value
    For i = 1 To UBound(aDat, 2)
      If Len(aDat(1, i)) Then
        If Weekday(aDat(1, i)) <> 1 Then
          If rng Is Nothing Then
            Set rng = .Cells(3, i).Resize(15)
          Else
            Set rng = Union(rng, .Cells(3, i).Resize(15))
          End If
        End If
      End If
    Next
  End With
  If Not rng Is Nothing Then rng.Value = "x"
  MsgBox "Da them dau x vao cac o. Xoa nhung dau x thua", , "Xin chao (*_*) (^_^)"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Sửa code của bạn thành vầy nhé:
Mã:
Sub Nhap()
  Dim aDat, rng As Range
  Dim i As Long
  On Error Resume Next
  With Range("C5:AG5")
    aDat = .Value
    For i = 1 To UBound(aDat, 2)
      If Len(aDat(1, i)) Then
        If Weekday(aDat(1, i)) <> 1 Then
          If rng Is Nothing Then
            Set rng = .Cells(3, i).Resize(15)
          Else
            Set rng = Union(rng, .Cells(3, i).Resize(15))
          End If
        End If
      End If
    Next
  End With
  If Not rng Is Nothing Then rng.Value = "x"
  MsgBox "Da them dau x vao cac o. Xoa nhung dau x thua", , "Xin chao (*_*) (^_^)"
End Sub
Nhân đây xin đố mọi người 1 câu: Code trên có thể sửa lại như thế nào để không cần dùng vòng lập?
 
Upvote 0
Thất nghiệp quá, thiết kế lại file này theo kiểu khác:
- Chọn năm, tháng bằng ComboBox
- Điền dấu "X" bằng CheckBox


Capture.JPG





























Gần như dùng code toàn bộ, không có công thức nào cả
Xem file
 

File đính kèm

Upvote 0
Thất nghiệp quá, thiết kế lại file này theo kiểu khác:
- Chọn năm, tháng bằng ComboBox
- Điền dấu "X" bằng CheckBox
Gần như dùng code toàn bộ, không có công thức nào cả
Xem file

Chân thành cảm ơn bác. Bác cho em hỏi tiếp nhé: File chấm công trên, mỗi tháng làm 1 sheet (Để lưu các tháng trước) vì thế khi sang tháng mới, em copy sheet. Tuy nhiên code của bác lại không hoạt động trên sheet mới được nhân bản. Vậy làm sao đây ??
 
Upvote 0
Chân thành cảm ơn bác. Bác cho em hỏi tiếp nhé: File chấm công trên, mỗi tháng làm 1 sheet (Để lưu các tháng trước) vì thế khi sang tháng mới, em copy sheet. Tuy nhiên code của bác lại không hoạt động trên sheet mới được nhân bản. Vậy làm sao đây ??

Muốn vậy thì bạn chỉ cần sửa đúng 1 dòng thôi. Tại Sub Main, sửa câu lệnh:
Set wks = Worksheets("T1")
thành:
Set wks = ActiveSheet
Xong!
-------------
Tuy nhiên tôi lấy làm lạ: Cái file ấy đã thiết kế để chạy cho mọi tháng, vậy bạn cần gì phải copy ra các tháng khác chứ? Nếu muốn copy chỉ để lưu thì ta copy và Paste Values, cớ sao lại muốn chạy code lần nữa
Đúng là cách thiết kế của bạn có vấn đề ---> Rất khó hiểu
 
Upvote 0
Tuy nhiên tôi lấy làm lạ: Cái file ấy đã thiết kế để chạy cho mọi tháng, vậy bạn cần gì phải copy ra các tháng khác chứ? Nếu muốn copy chỉ để lưu thì ta copy và Paste Values, cớ sao lại muốn chạy code lần nữa
Đúng là cách thiết kế của bạn có vấn đề ---> Rất khó hiểu

Bác nói chính xác. Đúng là để lưu thì chỉ Copy--> Paste Value. Tuy nhiên vấn đề ở đây chính là thói quen thao tác của người sử dụng, cụ thể là em.
Thông thường khi sang tháng mới, em giữ phím Ctrl và kéo sheet định copy sang bên cạnh, thế là được thêm sheet mới -- Đổi tên sheet mới này và chọn ngày tháng là xong. Đây là thao tác như 1 thói quen vì vậy, tư duy của em là hướng các mô hình hoạt động để phù hợp với thói quen này. Nếu so sánh số thao tác cần thực hiện thì cách này của em là tương đối nhanh.
Cảm ơn bác đã giúp đỡ trong nhiều vấn đề. Còn nhiều vấn đề em mong được tiếp tục giúp đỡ.
 
Upvote 0
Bác nói chính xác. Đúng là để lưu thì chỉ Copy--> Paste Value. Tuy nhiên vấn đề ở đây chính là thói quen thao tác của người sử dụng, cụ thể là em.
Thông thường khi sang tháng mới, em giữ phím Ctrl và kéo sheet định copy sang bên cạnh, thế là được thêm sheet mới -- Đổi tên sheet mới này và chọn ngày tháng là xong. Đây là thao tác như 1 thói quen vì vậy, tư duy của em là hướng các mô hình hoạt động để phù hợp với thói quen này. Nếu so sánh số thao tác cần thực hiện thì cách này của em là tương đối nhanh.
Cảm ơn bác đã giúp đỡ trong nhiều vấn đề. Còn nhiều vấn đề em mong được tiếp tục giúp đỡ.
Thì đúng thao tác như vậy là nhanh nhất. Nhưng cũng chính vì nhanh nên có nhược điểm: Sheet lưu lại chứa các Object không cần thiết (các ComboBox) mà lý ra chỉ nên chứa dữ liệu thô mà thôi
Tôi nghĩ nên làm thế này: Viết 1 code để lưu. Code sẽ copy ActiveSheet ra 1 sheet khác (hoặc 1 file khác), còn sheet hiện hành thì không thay đổi gì
Bạn thử nghiên cứu xem ---> Vấn đề này tôi nghĩ không quá khó (với lại, đã code VBA thì nên dẹp mấy vụ "chân tay" ở đây, nhất là với những thao tác thường lập đi lập lại)
 
Upvote 0
Thì đúng thao tác như vậy là nhanh nhất. Nhưng cũng chính vì nhanh nên có nhược điểm: Sheet lưu lại chứa các Object không cần thiết (các ComboBox) mà lý ra chỉ nên chứa dữ liệu thô mà thôi
Bác nói đúng, Cách lưu file hiện tại đang có hiện tượng dư thừa (trùng lặp) dữ liệu, thậm chí nếu đây là bảng chấm công theo ngày thì mỗi năm có hàng trăm sheet trong 1 file thì hỏng bét. Cách đây mấy tháng, khi chưa biết cót két là gì thì em đã bố trí dữ liệu trong 1 sheet và có AutoFilter, khi in thì mình lọc theo tháng rồi in. Cách này phần đầu và phần cuối bảng dùng chung nhau, Có lẽ cách này đơn giản và tối ưu về dữ liệu, dễ thao tác, Tuy nhiên cách này cần nhiều thời gian chuẩn bị và nặng về "tay chân"
Như bác gợi ý về cách tổ chức dữ liệu, em thấy rất hay, tuy nhiên với em ngoài tình yêu với Ex thì kiến thức về lập trình em chả có gì nên một dòng code đơn giản em cũng không biết và không hiểu. Em sẽ thử với ý tưởng của bác, nhưng chắc chắn em vẫn cần sự trợ giúp "Gọi điện cho người thân"
 
Upvote 0
Xin giúp chỉnh lại bảng chấm công của Thầy ndu96081631 cho phù hợp với công việc.
Nội dung chỉnh có ghi trong file.
Cảm ơn các anh chị đã quan tâm giúp giùm.View attachment Bang cham cong_2.xlsm
 
Upvote 0
Bạn tham khảo cái này cho đơn giản trong vận hành cho bạn nè!

-=09= -=09= -=09=
-0-/. -0-/. -0-/.
-\\/. -\\/. -\\/.
 

File đính kèm

Upvote 0
Cảm ơn bạn. Bạn có thể chỉnh một tí nữa giúp mình:
mình muốn khi thực hiện code dấu "x" không ghi đè lên ô T7 hay CN.
 
Upvote 0
À cái đó là mình làm cho 1 bạn để chấm công giả/đối fó với ai đó!

Mình cải tiến cái nớ theo í bạn rồi đây;
Qui trình là chạy macro sự kiện trước đó nha.
 

File đính kèm

Upvote 0
Xin nhờ bạn giúp chút xíu nữa.
Mình áp dụng vào file của mình bị báo lỗi
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn chỉ chưa đúng về số dòng trong tiêu đề thôi. Bạn lấy cái này nè & chép đè lên:
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, [ak3:AK4]) Is Nothing Then
    Dim Rws As Long, Thg As Byte
    Dim Cls As Range
    
    Rws = [b10].CurrentRegion.Rows.Count - 3    '1->3'
    [c10].Resize(Rws, 31).ClearContents
    Thg = [AK3].Value
    For Each Cls In [C8].Resize(, 31)
        If Month(Cls.Value) = Thg Then
            If Weekday(Cls.Value) = 1 Then
                Cls.Offset(2).Resize(Rws).Value = "CN"  '1->2'
            ElseIf Weekday(Cls.Value) = 7 Then
                Cls.Offset(2).Resize(Rws).Value = "TB"  '1->2'
            Else
                Cls.Offset(2).Resize(Rws).Value = "+"   '+'
            End If
        End If
    Next Cls
 End If
End Sub
 
Upvote 0
Anh ơi, Anh giúp em bảng chấm công theo thời gian. Trong sheet tổng chỉ lấy số giờ thực tế làm việc của NV thôi, chứ không đánh dấu X
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom