Nhờ sửa lỗi code trong bảng chấm công (1 người xem)

Liên hệ QC

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

tommybull

Thành viên hoạt động
Tham gia
21/7/08
Bài viết
191
Được thích
29
Giới tính
Nam
Kính chào các anh chị!
Mình có 3 vấn đề nhờ các anh chị giúp đỡ

1. Tại sheet "Add_NV" mình nhấn nút lệnh "Nhập danh sách" thì bị báo lỗi như trong hình kèm theo "LOI CODE ADD_NV"

2. Tại sheet "Danhsach_NV" (Cột "V") mình nhập "Ngày thôi việc" cho những người đã chấm dứt hợp đồng hoặc nghỉ việc trong tháng (ví dụ 2 người mình tô nền vàng) sau đó mình áp dụng Code sao cho khi mình nhấn nút lệnh "Update List" bên Sheet "Chamcong" thì những người đã nghỉ việc sẽ không hiển thị tên trong danh sách chấm công của tháng mới tại sheet "chamcong". Nhưng vấn đề là sau khi Update list, vẫn còn dòng trống tại sheet "chamcong" (Tô nền vàng) (em gửi theo file đính kèm "Chamcong_luong2017)

3. Tại sheet "chamcong" em đặt code (Code này em đọc được trên "GPE" và đem áp dụng) cho nút lệnh "Kết xuất chấm công" khi nhấn nút lệnh chọn Folder để kết xuất thì vẫn được, nhưng khi tìm vào Folder để mở file vừa được kết xuất lên thì không ra định dạng "Value" (không còn dạng công thức) và hiển thị lỗi như trong file đính kèm "Loi_ketxuat"

Với 3 vấn đề trên, chân thành kính mong các anh chị giúp đỡ ạ!
 

File đính kèm

  • LOI CODE ADD_NV.png
    LOI CODE ADD_NV.png
    343.4 KB · Đọc: 12
  • loi_ketxuat.png
    loi_ketxuat.png
    290.8 KB · Đọc: 11
  • chamcong_luong2017.xlsm
    chamcong_luong2017.xlsm
    1.5 MB · Đọc: 25

File đính kèm

Upvote 0
Mình góp í không trong 3 mục mà bạn iêu cầu:

1./ Trang tính 'QuiUoc' của bạn là rất hay & ít người xài như vậy; Mình chỉ gốp í thêm là:
Ở các cột 'Kí hiệu' trong các bảng danh mục này thay vì xài các kí số, ta nên chuyển sang các kí tự;

2./ (Fát huy chiến quả của (1) nêu trên, tại trang 'DanhSachNV' ( Nên chỉ là DSNV hay HSNV thôi, tên của bạn đang là lê thê) với 3 trường [Kỹ thuật],[Xăng xe] & [Chuyên cần] ta cũng nên xài danh mục như trên ;

2.2 Tên các trang tính nên xúc tích hơn

3./ Macro có tên dưới đây của bạn ta có thể thử rút gọn lại như sau:
PHP:
Sub cmdCancel_Add_NV()   
    Sheets("Add_NV").Select
    Union([e10:e15].Resize(, 4), [L10].Resize(, 2), [L13:L14].Resize(, 2)).ClearContents
    Union([e17:e30].Resize(, 2), [e16:m16], [H17:i17], [K17:M17], [j18:k18]).ClearContents   
End Sub

4./ Trang 'Thuế TNCN' ta nên chuyển vô trang 'QuiUoc'

. . . . ..
Rất vui nếu được bạn chấp thuận những đề đạt trên!
 
Upvote 0
Bạn thêm điều kiện nếu cột V có dữ liệu thì không lấy sang thử xem
Mình thêm ngày thôi việc cho nhân viên "Ngô thị B" và "Trần thị D" sau đó nhấn nút lệnh "Update List" bên sheet "Chamcong" thì hai nhân viên này không chạy qua, nhưng lại có dòng trống (mình tô nên vàng), mình muốn danh sách sau khi update qua sheet "chamcong" thì không bị có dòng trống bạn ạ
Bạn và các anh chị khác xem và làm lại giúp nhé
Chân thành cảm ơn
 
Upvote 0
Mình góp í không trong 3 mục mà bạn iêu cầu:

1./ Trang tính 'QuiUoc' của bạn là rất hay & ít người xài như vậy; Mình chỉ gốp í thêm là:
Ở các cột 'Kí hiệu' trong các bảng danh mục này thay vì xài các kí số, ta nên chuyển sang các kí tự;

2./ (Fát huy chiến quả của (1) nêu trên, tại trang 'DanhSachNV' ( Nên chỉ là DSNV hay HSNV thôi, tên của bạn đang là lê thê) với 3 trường [Kỹ thuật],[Xăng xe] & [Chuyên cần] ta cũng nên xài danh mục như trên ;

2.2 Tên các trang tính nên xúc tích hơn

3./ Macro có tên dưới đây của bạn ta có thể thử rút gọn lại như sau:
PHP:
Sub cmdCancel_Add_NV()  
    Sheets("Add_NV").Select
    Union([e10:e15].Resize(, 4), [L10].Resize(, 2), [L13:L14].Resize(, 2)).ClearContents
    Union([e17:e30].Resize(, 2), [e16:m16], [H17:i17], [K17:M17], [j18:k18]).ClearContents  
End Sub

4./ Trang 'Thuế TNCN' ta nên chuyển vô trang 'QuiUoc'

. . . . ..
Rất vui nếu được bạn chấp thuận những đề đạt trên!
Rất cảm ơn ý kiến đóng góp của bạn, mình sẽ thử áp dụng
Kể cả đoạn code mà bạn góp ý, mình cũng sửa lại như vậy xem sao, nếu có vấn đề gì, mong nhận được sự chỉ giáo
Chân thành cảm ơn ạ!
 
Upvote 0
Với Sub cmd_updatelist() mình có những í như vầy, chịu khó đọc những lời khó chịu:
Với câu lệnh
Mã:
 Dim i, n, m As Integer
Sao bạn xài n vô tri giác; Sao không là R (~Row), H (hàng), hay D (dòng)?
& chú ý là mình xài chữ cái hoa ấy nghe.

Câu lệnh
Mã:
m = Sheets("ChamCong").Cells(Rows.Count, 7).End(xlUp).Row
Có gì ở cột số 7 đặc biệt mà bạn lấy nó làm chuẩn để xác dịnh dòng cuối vậy; m sau dòng lênh này sẽ chứa số liệu gì bạn mong mõi?

Tạm thời là vậy, . . . .
 
Upvote 0
Chào bạn!
Bạn giúp mình làm Kết xuất sheet "Payroll_Luong" luôn nhé
Cảm ơn bạn
Bạn dùng thử Code này xem :
Mã:
Public Sub tachdulieu_Payroll()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
    Dim sArr, dArrr, I As Long, J As Long, Col As Long
    Dim Path As String, oFolder As Object, Ws As Worksheet, Wb As Workbook
With Sheets("Payroll_Luong")
    Col = .Range("IV6").End(xlToLeft).Column
    sArr = .Range("A8", .Range("A65535").End(3)).Resize(, Col)
    ReDim dArr(1 To UBound(sArr), 1 To UBound(sArr, 2))
    For I = 1 To UBound(sArr)
        For J = 1 To UBound(sArr, 2)
            dArr(I, J) = sArr(I, J)
        Next J
    Next I
End With
Set oFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Hay chon thu muc luu file", 0)
If oFolder Is Nothing Then
    MsgBox "Chua chon thu muc luu": Exit Sub
End If
Path = oFolder.Items.Item.Path
Sheets("Payroll_Luong").Copy
Set Wb = ActiveWorkbook
With Wb.Sheets("Payroll_Luong")
    .Range("A8").Resize(I - 1, Col) = dArr
End With
ActiveSheet.DrawingObjects.Delete
ActiveWorkbook.Close True, Path & "\" & "Payroll_Luong_01" & ".xlsx"
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
 
Upvote 0
Bạn dùng thử Code này xem :
Mã:
Public Sub tachdulieu_Payroll()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
    Dim sArr, dArrr, I As Long, J As Long, Col As Long
    Dim Path As String, oFolder As Object, Ws As Worksheet, Wb As Workbook
With Sheets("Payroll_Luong")
    Col = .Range("IV6").End(xlToLeft).Column
    sArr = .Range("A8", .Range("A65535").End(3)).Resize(, Col)
    ReDim dArr(1 To UBound(sArr), 1 To UBound(sArr, 2))
    For I = 1 To UBound(sArr)
        For J = 1 To UBound(sArr, 2)
            dArr(I, J) = sArr(I, J)
        Next J
    Next I
End With
Set oFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Hay chon thu muc luu file", 0)
If oFolder Is Nothing Then
    MsgBox "Chua chon thu muc luu": Exit Sub
End If
Path = oFolder.Items.Item.Path
Sheets("Payroll_Luong").Copy
Set Wb = ActiveWorkbook
With Wb.Sheets("Payroll_Luong")
    .Range("A8").Resize(I - 1, Col) = dArr
End With
ActiveSheet.DrawingObjects.Delete
ActiveWorkbook.Close True, Path & "\" & "Payroll_Luong_01" & ".xlsx"
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Mình cho chạy được rồi bạn ạ!
Cảm ơn bạn nhiều nhé
 
Upvote 0
2. Tại sheet "Danhsach_NV" (Cột "V") mình nhập "Ngày thôi việc" cho những người đã chấm dứt hợp đồng hoặc nghỉ việc trong tháng (ví dụ 2 người mình tô nền vàng) sau đó mình áp dụng Code sao cho khi mình nhấn nút lệnh "Update List" bên Sheet "Chamcong" thì những người đã nghỉ việc sẽ không hiển thị tên trong danh sách chấm công của tháng mới tại sheet "chamcong". Nhưng vấn đề là sau khi Update list, vẫn còn dòng trống tại sheet "chamcong" (Tô nền vàng) (em gửi theo file đính kèm "Chamcong_luong2017)
Còn vấn đề này nữa, rất mong nhận được sự giúp đỡ của các anh chị ạ!
Chân thành cảm ơn!
 
Upvote 0
2. Tại sheet "Danhsach_NV" (Cột "V") mình nhập "Ngày thôi việc" cho những người đã chấm dứt hợp đồng hoặc nghỉ việc trong tháng (ví dụ 2 người mình tô nền vàng) sau đó mình áp dụng Code sao cho khi mình nhấn nút lệnh "Update List" bên Sheet "Chamcong" thì những người đã nghỉ việc sẽ không hiển thị tên trong danh sách chấm công của tháng mới tại sheet "chamcong". Nhưng vấn đề là sau khi Update list, vẫn còn dòng trống tại sheet "chamcong" (Tô nền vàng) (em gửi theo file đính kèm "Chamcong_luong2017)
Còn vấn đề này nữa, rất mong nhận được sự giúp đỡ của các anh chị ạ!
Chân thành cảm ơn!
Bạn dùng cái Code này xem nha:
PHP:
Sub Update_List()
    Dim sArr, dArr, I As Long, J As Long, K As Long, NameCol As String
    With Sheets("Danhsach_NV")
        sArr = .Range("A7", .Range("A65535").End(3)).Resize(, 34).Value
    End With
    ReDim dArr(1 To UBound(sArr), 1 To 53)
    For I = 1 To UBound(sArr)
        If sArr(I, 2) <> Empty And sArr(I, 22) = Empty Then
            K = K + 1
            dArr(K, 1) = K
            For J = 2 To 4
                dArr(K, J) = sArr(I, J)
            Next J
            dArr(K, 5) = sArr(I, 9)
            For J = 37 To 44
                NameCol = Sheets("Chamcong").Cells(5, J).Address
                dArr(K, J) = "=TinhCong(F" & K + 5 & ":AJ" & K + 5 & "," & NameCol & ")"
            Next J
            dArr(K, 45) = "=Worklam(MONTH(R3C6),0,YEAR(R3C6))*8"
            For J = 46 To 52
                NameCol = Sheets("Chamcong").Cells(5, J).Address
                dArr(K, J) = "=TinhCong(F" & K + 5 & ":AJ" & K + 5 & "," & NameCol & ")"
            Next J
            dArr(K, 53) = "=IF(MONTH(R3C6)=1,(Danhsach_NV!R[1]C[-19])-RC[-16],IF(MONTH(R3C6)<4,Danhsach_NV!R[1]C[-19]-RC[-16],IF(Danhsach_NV!R[1]C[-19]>12,12-RC[-16],Danhsach_NV!R[1]C[-19]-RC[-16])))"
        End If
    Next I
    With Sheets("Chamcong")
        .Range("A7", Range("A65535")).EntireRow.Delete
        .Range("A6").Resize(K, 53) = dArr
        .Range("A6:BA6").Copy
        .Range("A7").Resize(K - 1, 53).PasteSpecial Paste:=xlPasteFormats
        Application.CutCopyMode = False
        .Range("A6").Select
    End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu dùng Code cũ của vạn thì sửa lại như vầy:
PHP:
Sub cmd_updatelist()
    Dim I, n, m As Integer, K As Long
    Dim confirm As Boolean
    n = Sheets("Danhsach_NV").Cells(Rows.Count, "B").End(xlUp).Row
    m = Sheets("ChamCong").Cells(Rows.Count, 7).End(xlUp).Row
    confirm = MsgBox("Da co du lieu, xem lai truoc khi import!", vbOKCancel, "Warning")
    If (Not IsEmpty(Sheets("ChamCong"))) And confirm Then
        K = 5
        For I = 7 To n
            If Not IsEmpty(Sheets("Danhsach_NV").Cells(I, 1).Value) And IsEmpty(Sheets("Danhsach_NV").Cells(I, 22).Value) Then
                If Sheets("Danhsach_NV").Range("V" & I) = Empty Then
                    K = K + 1
                    Sheets("ChamCong").Cells(K, 1).Value = K - 5
                    Sheets("ChamCong").Cells(K, 3).Value = Sheets("Danhsach_NV").Cells(I, 3)
                    Sheets("ChamCong").Cells(K, 4).Value = Sheets("Danhsach_NV").Cells(I, 4)
                    Sheets("ChamCong").Cells(K, 5).Value = Sheets("Danhsach_NV").Cells(I, 9)
                    Sheets("ChamCong").Cells(K, 2).Value = Sheets("Danhsach_NV").Cells(I, 2)
                    Sheets("chamCong").Range("f" & (K) & ": AJ" & (K)).Select
                    Selection.ClearContents
                End If
            End If
        Next
        MsgBox (n - 6) & " record imported successful", vbOKOnly, "Import status"
        Sheets("Chamcong").Cells(4, "L").Select
        I = 0
        For I = 0 To m - n
            Sheets("chamcong").Rows(n + I & ":" & n + I).Select
            Selection.ClearContents
        Next
        Else: Exit Sub
    End If
End Sub
 
Upvote 0
Nếu dùng Code cũ của vạn thì sửa lại như vầy:
PHP:
Sub cmd_updatelist()
    Dim I, n, m As Integer, K As Long
    Dim confirm As Boolean
    n = Sheets("Danhsach_NV").Cells(Rows.Count, "B").End(xlUp).Row
    m = Sheets("ChamCong").Cells(Rows.Count, 7).End(xlUp).Row
    confirm = MsgBox("Da co du lieu, xem lai truoc khi import!", vbOKCancel, "Warning")
    If (Not IsEmpty(Sheets("ChamCong"))) And confirm Then
        K = 5
        For I = 7 To n
            If Not IsEmpty(Sheets("Danhsach_NV").Cells(I, 1).Value) And IsEmpty(Sheets("Danhsach_NV").Cells(I, 22).Value) Then
                If Sheets("Danhsach_NV").Range("V" & I) = Empty Then
                    K = K + 1
                    Sheets("ChamCong").Cells(K, 1).Value = K - 5
                    Sheets("ChamCong").Cells(K, 3).Value = Sheets("Danhsach_NV").Cells(I, 3)
                    Sheets("ChamCong").Cells(K, 4).Value = Sheets("Danhsach_NV").Cells(I, 4)
                    Sheets("ChamCong").Cells(K, 5).Value = Sheets("Danhsach_NV").Cells(I, 9)
                    Sheets("ChamCong").Cells(K, 2).Value = Sheets("Danhsach_NV").Cells(I, 2)
                    Sheets("chamCong").Range("f" & (K) & ": AJ" & (K)).Select
                    Selection.ClearContents
                End If
            End If
        Next
        MsgBox (n - 6) & " record imported successful", vbOKOnly, "Import status"
        Sheets("Chamcong").Cells(4, "L").Select
        I = 0
        For I = 0 To m - n
            Sheets("chamcong").Rows(n + I & ":" & n + I).Select
            Selection.ClearContents
        Next
        Else: Exit Sub
    End If
End Sub

Quá tuyệt ạ!
Ngoài chân tình cảm ơn ra, thì vẫn là chân tình cảm ơn
 
Upvote 0
Quá tuyệt ạ!
Ngoài chân tình cảm ơn ra, thì vẫn là chân tình cảm ơn
Bạn dùng Code này cho cả 2 sheet ChamCongPayroll_Luong
PHP:
Public Sub tachdulieu()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
    Dim Arr, DK As Boolean, ShName As String, NameCell As String
    Dim sArr, dArrr, I As Long, J As Long, Col As Long
    Dim Path As String, oFolder As Object, Ws As Worksheet, Wb As Workbook
    Dim Rng As Range, sh As Worksheet, Sheettach As Worksheet
ShName = ActiveSheet.Name
Arr = Array(Sheet2.Name, Sheet4.Name)
If ShName = Sheet2.Name Then NameCell = "A6"
If ShName = Sheet4.Name Then NameCell = "A8"
For I = LBound(Arr) To UBound(Arr)
    If Arr(I) = ShName Then
        DK = True: Exit For
    End If
Next I
If DK = True Then
With Sheets(ShName)
    Col = .Range("IV6").End(xlToLeft).Column
    sArr = .Range(NameCell, .Range("A65535").End(3)).Resize(, Col)
    ReDim dArr(1 To UBound(sArr), 1 To UBound(sArr, 2))
    For I = 1 To UBound(sArr)
        For J = 1 To UBound(sArr, 2)
            dArr(I, J) = sArr(I, J)
        Next J
    Next I
End With
Set oFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Hay chon thu muc luu file", 0)
If oFolder Is Nothing Then
    MsgBox "Chua chon thu muc luu": Exit Sub
End If
Path = oFolder.Items.Item.Path
Sheets(ShName).Copy
Set Wb = ActiveWorkbook
With Wb.Sheets(ShName)
    .Range(NameCell).Resize(I - 1, Col) = dArr
End With
ActiveSheet.DrawingObjects.Delete
ActiveWorkbook.Close True, Path & "\" & ShName & "_01" & ".xlsx"
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
 

File đính kèm

Upvote 0
(A) Ta bàn thêm về trang tính 'ChamCong' (Nên là 'BCC' là đủ):
Nếu là mình, thì tại [f5] sẽ áp công thức =[F3]; & ô bên fải liền kề sẽ [F5]+1
Sau đó ta chép sang fải cho đến ngày 31;
Sau đó mình sã xài CF trên toàn bộ những ô trên dòng 5 này để:
1./ Nếu là ngày 29, 30 & 31 & tháng của [F5]<> tháng của [F3] thì Format Font màu mờ;
2./ Nếu hàm Weekday(f5)=1 thì màu xanh đậm & nếu bằng 7 thì xanh nhạc
Lúc đó ta có bảng chấm công chuẩn không cần chỉnh nhiều (chỉ cần chỉnh tại [F3] ta xài đến lúc nghỉ hưu luôn!

(B) Trang thứ 2 là 'Add_NV"; trang này có vài trường cần nhập bởi danh sách sổ xuống (Data Validation); Lúc đó sẽ tránh hẵn sai chính tả khi nhập không cần thiết.

Tóm lại trước tiên & quan trọng nhất là cân nhắc thật kỹ khâu thiết kế CSDL, trước khi đưa công thức hay VBA vô vận hành CSDL; Theo mình là như vậy.

Hiện mình còn chưa rõ bạn đổ dữ liệu vô 'BCC' sẽ như thế nào, nguồn ở đâu & chuyển sang đó bằng gì?

Theo mình, những người đã nghỉ ta không nên xóa hẵn khỏi CSDL; Nên đem những người này sang 1 trang tính lưu nào đó Hay đơn giả là xóa những dòng này chỉ trong 'BCC' mà thôi.
Trong trang HoSo (DSNV) thay kệ nó. Sau định kì 3 hay 6 tháng ta gôm 1 lần đem lưu.
 
Upvote 0
Bạn dùng cái Code này xem nha:
PHP:
Sub Update_List()
    Dim sArr, dArr, I As Long, J As Long, K As Long, NameCol As String
    With Sheets("Danhsach_NV")
        sArr = .Range("A7", .Range("A65535").End(3)).Resize(, 34).Value
    End With
    ReDim dArr(1 To UBound(sArr), 1 To 53)
    For I = 1 To UBound(sArr)
        If sArr(I, 2) <> Empty And sArr(I, 22) = Empty Then
            K = K + 1
            dArr(K, 1) = K
            For J = 2 To 4
                dArr(K, J) = sArr(I, J)
            Next J
            dArr(K, 5) = sArr(I, 9)
            For J = 37 To 44
                NameCol = Sheets("Chamcong").Cells(5, J).Address
                dArr(K, J) = "=TinhCong(F" & K + 5 & ":AJ" & K + 5 & "," & NameCol & ")"
            Next J
            dArr(K, 45) = "=Worklam(MONTH(R3C6),0,YEAR(R3C6))*8"
            For J = 46 To 52
                NameCol = Sheets("Chamcong").Cells(5, J).Address
                dArr(K, J) = "=TinhCong(F" & K + 5 & ":AJ" & K + 5 & "," & NameCol & ")"
            Next J
            dArr(K, 53) = "=IF(MONTH(R3C6)=1,(Danhsach_NV!R[1]C[-19])-RC[-16],IF(MONTH(R3C6)<4,Danhsach_NV!R[1]C[-19]-RC[-16],IF(Danhsach_NV!R[1]C[-19]>12,12-RC[-16],Danhsach_NV!R[1]C[-19]-RC[-16])))"
        End If
    Next I
    With Sheets("Chamcong")
        .Range("A7", Range("A65535")).EntireRow.Delete
        .Range("A6").Resize(K, 53) = dArr
        .Range("A6:BA6").Copy
        .Range("A7").Resize(K - 1, 53).PasteSpecial Paste:=xlPasteFormats
        Application.CutCopyMode = False
        .Range("A6").Select
    End With
End Sub
Chào bạn
Code Update_list này còn một vấn đề nữa, mong bạn ra tay giúp đỡ
Tại cột "AS" của sheet "chamcong" , bạn cho code đổ vào công thức "Worklam(MONTH($F$3),0,YEAR($F$3))*8"
Nhưng mình muốn khi chạy code Update_list thì công thức sẽ là: "=(Worklam(MONTH($F$3),0,YEAR($F$3))*8)-AM6-AN6-AO6-AP6-AQ6-AR6"
Và cứ như thế, có bao nhiêu nhân viên, sẽ sổ xuống bấy nhiêu dòng tương ứng ví dụ như tiếp theo là: "=(Worklam(MONTH($F$3),0,YEAR($F$3))*8)-AM7-AN7-AO7-AP7-AQ7-AR7"
Mong nhận được sự giúp đỡ ạ!
Chân thành cảm ơn bạn!
 
Upvote 0
Web KT

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

Back
Top Bottom