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
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!
Cái đó bạn thu Macro xong copy công thức vào thử xem. Hiện mình không ngồi máy tính vì vậy không làm hộ bạn được :)
 
Upvote 0
Cái đó bạn thu Macro xong copy công thức vào thử xem. Hiện mình không ngồi máy tính vì vậy không làm hộ bạn được :)
Mình đã thử, nhưng những dòng kế tiếp vẫn cố định mà không đổi dòng từ "=(Worklam(MONTH($F$3),0,YEAR($F$3))*8)-AM6-AN6-AO6-AP6-AQ6-AR6" qua "=(Worklam(MONTH($F$3),0,YEAR($F$3))*8)-AM7-AN7-AO7-AP7-AQ7-AR7" và và các dòng tiếp theo
Mong bạn giúp
Cảm ơn bạn!
 
Upvote 0
Cái đó bạn thu Macro xong copy công thức vào thử xem. Hiện mình không ngồi máy tính vì vậy không làm hộ bạn được :)
Chào bạn!
Nhờ bạn giúp đỡ nốt phần còn lại nhé, làm phiền bạn ạ!
Mình đã thử, nhưng những dòng kế tiếp vẫn cố định mà không đổi dòng từ "=(Worklam(MONTH($F$3),0,YEAR($F$3))*8)-AM6-AN6-AO6-AP6-AQ6-AR6" qua "=(Worklam(MONTH($F$3),0,YEAR($F$3))*8)-AM7-AN7-AO7-AP7-AQ7-AR7" và và các dòng tiếp theo.

Xin chân thành cảm ơn bạn! :)
 
Upvote 0
Chào bạn!
Nhờ bạn giúp đỡ nốt phần còn lại nhé, làm phiền bạn ạ!
Mình đã thử, nhưng những dòng kế tiếp vẫn cố định mà không đổi dòng từ "=(Worklam(MONTH($F$3),0,YEAR($F$3))*8)-AM6-AN6-AO6-AP6-AQ6-AR6" qua "=(Worklam(MONTH($F$3),0,YEAR($F$3))*8)-AM7-AN7-AO7-AP7-AQ7-AR7" và và các dòng tiếp theo.

Xin chân thành cảm ơn bạn! :)
Bạn thay dòng cũ bằng dòng này thử xem
Mã:
dArr(K, 45) = "=Worklam(MONTH(R3C6),0,YEAR(R3C6))*8-SUM(RC[-6]:RC[-1])"
 
Upvote 0
Bạn thay dòng cũ bằng dòng này thử xem
Mã:
dArr(K, 45) = "=Worklam(MONTH(R3C6),0,YEAR(R3C6))*8-SUM(RC[-6]:RC[-1])"
Bạn ơi, xin giúp thêm vài vấn đề nữa nhé
Các vấn đề mình gặp phải tại sheet "Chamcong" và sheet "Payroll_Luong" mình có viết chi tiết tại phần chữ tô màu đỏ
Mong bạn giúp đỡ giùm ạ!
Chân thành cảm ơn
 

File đính kèm

Upvote 0
Bạn ơi, xin giúp thêm vài vấn đề nữa nhé
Các vấn đề mình gặp phải tại sheet "Chamcong" và sheet "Payroll_Luong" mình có viết chi tiết tại phần chữ tô màu đỏ
Mong bạn giúp đỡ giùm ạ!
Chân thành cảm ơn
Làm sao mà biết ngày nào nghỉ mà bỏ dấu X vậy bạn
 
Upvote 0
Bạn cho chạy dấu "X" vào tất cả các ô, trừ những ngày Chủ nhật, còn ngày nào người nào nghỉ, mình xóa tay ngày đó ạ
Bạn thay cái Code cũ bằng Code này thử
PHP:
Sub Update_List()
    Dim sArr, dArr, I As Long, J As Long, K As Long, NameCol As String, Thu As Long
    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 = 6 To 36
                Thu = Application.Weekday(Sheets("ChamCong").Cells(5, J), 2)
                If Thu <> 7 Then dArr(K, J) = "X"
                Next J
                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) = "=countif(rc[-39]:rc[-9],""X*"")*8-SUM(RC[-6]:RC[-1])"
                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
 
Upvote 0
Bạn thay cái Code cũ bằng Code này thử
PHP:
Sub Update_List()
    Dim sArr, dArr, I As Long, J As Long, K As Long, NameCol As String, Thu As Long
    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 = 6 To 36
                Thu = Application.Weekday(Sheets("ChamCong").Cells(5, J), 2)
                If Thu <> 7 Then dArr(K, J) = "X"
                Next J
                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) = "=countif(rc[-39]:rc[-9],""X*"")*8-SUM(RC[-6]:RC[-1])"
                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
Dạ, chạy tốt rồi ạ,
Còn bên Sheet "Payroll_Luong" nó bị ảnh hưởng bởi lệnh Update_list,
Anh chỉ xem ở file đính kèm, em có ghi cụ thể, nhờ anh chị giúp giùm ạk!
 
Upvote 0
Dạ, chạy tốt rồi ạ,
Còn bên Sheet "Payroll_Luong" nó bị ảnh hưởng bởi lệnh Update_list,
Anh chỉ xem ở file đính kèm, em có ghi cụ thể, nhờ anh chị giúp giùm ạk!
Bạn thêm dòng này vào trên chỗ End Sub
Mã:
 With Sheets("Payroll_Luong")
        .Range("A8:B1000").ClearContents
        .Range("A8").Resize(K, 2) = dArr
    End With
 
Upvote 0
Bạn thêm dòng này vào trên chỗ End Sub
Mã:
 With Sheets("Payroll_Luong")
        .Range("A8:B1000").ClearContents
        .Range("A8").Resize(K, 2) = dArr
    End With
Em thử rồi mà vẫn chưa được, em có gửi báo lỗi debug anh (chị) kiểm tra giúp em với ạ!
 

File đính kèm

Upvote 0
Cái hàm Vlookup mình không có lấy vào chỉ lấy Số TT và Mã thôi. Cái đó kéo thủ công xuống nhiều nhiều dòng xong thêm dòng lệnh ẩn dòng trống trong vùng là được :D
 
Upvote 0
Cái hàm Vlookup mình không có lấy vào chỉ lấy Số TT và Mã thôi. Cái đó kéo thủ công xuống nhiều nhiều dòng xong thêm dòng lệnh ẩn dòng trống trong vùng là được :D
Dạ, nhưng không hiểu sao khi em đặt công thức như tại cột "C" sheet "Payroll_luong" (như dòng số 7) (file đính kèm "truoc") và fill xuống thì sau khi em nhấn lệnh "Update List" bên Sheet "chamcong" thì sheet "Payroll_Luong" lại tự trả về như file đính kèm "Sau"
Vấn đề của em là như vậy ạ!
Giúp em sau khi Đặt công thức (thủ công) bên sheet "Payroll_Luong"xong, mỗi khi em Update_List thì công thức lại bị xóa sạch và em lại phải đặt lại từ đầu ạ!
Chỉ riêng những cột nào em dùng Vlookup và lấy dữ liệu vùng bên Sheet "Chamcong" là bị ảnh hưởng (ví dụ như cột "N; O; P; Q; R; S và AB; AC; AD; AE; AF")
Anh chị lỡ thương thì thương em cho trót ạ, xin được giúp đỡ ạ
Chân thành cảm ơn anh chị!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Dạ, nhưng không hiểu sao khi em đặt công thức như tại cột "C" sheet "Payroll_luong" (như dòng số 7) (file đính kèm "truoc") và fill xuống thì sau khi em nhấn lệnh "Update List" bên Sheet "chamcong" thì sheet "Payroll_Luong" lại tự trả về như file đính kèm "Sau"
Vấn đề của em là như vậy ạ!
Giúp em sau khi Đặt công thức (thủ công) bên sheet "Payroll_Luong"xong, mỗi khi em Update_List thì công thức lại bị xóa sạch và em lại phải đặt lại từ đầu ạ!
Chỉ riêng những cột nào em dùng Vlookup và lấy dữ liệu vùng bên Sheet "Chamcong" là bị ảnh hưởng (ví dụ như cột "N; O; P; Q; R; S và AB; AC; AD; AE; AF")
Anh chị lỡ thương thì thương em cho trót ạ, xin được giúp đỡ ạ
Chân thành cảm ơn anh chị!
Anh chị vui lòng giúp em với ạ!
 
Upvote 0
Dạ, nhưng không hiểu sao khi em đặt công thức như tại cột "C" sheet "Payroll_luong" (như dòng số 7) (file đính kèm "truoc") và fill xuống thì sau khi em nhấn lệnh "Update List" bên Sheet "chamcong" thì sheet "Payroll_Luong" lại tự trả về như file đính kèm "Sau"
Vấn đề của em là như vậy ạ!
Giúp em sau khi Đặt công thức (thủ công) bên sheet "Payroll_Luong"xong, mỗi khi em Update_List thì công thức lại bị xóa sạch và em lại phải đặt lại từ đầu ạ!
Chỉ riêng những cột nào em dùng Vlookup và lấy dữ liệu vùng bên Sheet "Chamcong" là bị ảnh hưởng (ví dụ như cột "N; O; P; Q; R; S và AB; AC; AD; AE; AF")
Anh chị lỡ thương thì thương em cho trót ạ, xin được giúp đỡ ạ
Chân thành cảm ơn anh chị!
Chắc là bác "PacificPR" bận việc rồi, mình mong chờ sự giúp đỡ từ tất cả các anh chị trong GPE ạ
Chân thành cảm ơn
 
Upvote 0
Chắc là bác "PacificPR" bận việc rồi, mình mong chờ sự giúp đỡ từ tất cả các anh chị trong GPE ạ
Chân thành cảm ơn
Cái công thức này có vấn đề rồi VLOOKUP(B9;ChamCong!$B$6:$BJ$6;2;0) sao bạn không để như thế này VLOOKUP(B9;ChamCong!$B$6:$BJ$1000;2;0) có mất mát gì đâu :D
 

File đính kèm

Upvote 0
Dạ. Đúng rồi. Anh (chị) vui lòng mở file đính kèm. Em cũng để VLOOKUP(B9;ChamCong!$B$6:$BJ$1000;2;0) Sau đó nhấn nút updatelist thì bên sheet payroll luong tu động chuyển về VLOOKUP(B9;ChamCong!$B$6:$BJ$6;2;0). Anh chị thử đặt lại vlookup bên sheet payroll va trở về sheet chamcong nhấn nút updatelist sẽ thấy vấn đề ạ
 
Upvote 0
Dạ. Đúng rồi. Anh (chị) vui lòng mở file đính kèm. Em cũng để VLOOKUP(B9;ChamCong!$B$6:$BJ$1000;2;0) Sau đó nhấn nút updatelist thì bên sheet payroll luong tu động chuyển về VLOOKUP(B9;ChamCong!$B$6:$BJ$6;2;0). Anh chị thử đặt lại vlookup bên sheet payroll va trở về sheet chamcong nhấn nút updatelist sẽ thấy vấn đề ạ
Đúng thật. Không biết nguyên nhân tại đâu nữa . Thôi chơi lụi vầy đị :p
 

File đính kèm

Upvote 0
Đúng thật. Không biết nguyên nhân tại đâu nữa . Thôi chơi lụi vầy đị :p
oái...anh chị xệp hạng là VBA Prosesional rồi nên lụi được, em học mót lượm lặt, nên không biết lụi kiểu gì
Anh chị chỉ giúp em sao giờ em down file về làm thì lại được rồi, anh chị đã làm gì vậy, chỉ em với ạ!
 
Upvote 0
oái...anh chị xệp hạng là VBA Prosesional rồi nên lụi được, em học mót lượm lặt, nên không biết lụi kiểu gì
Anh chị chỉ giúp em sao giờ em down file về làm thì lại được rồi, anh chị đã làm gì vậy, chỉ em với ạ!
À mình hiểu rồi. Do câu lệnh này .Range("A7", Range("A65535")).EntireRow.Delete mà ra. Hi hi
 
Upvote 0
Đúng thật. Không biết nguyên nhân tại đâu nữa . Thôi chơi lụi vầy đị :p
oái...anh chị xệp hạng là VBA Prosesional rồi nên lụi được, em học mót lượm lặt, nên không biết lụi kiểu gì
Anh chị chỉ giúp em sao giờ em down file về làm thì lại được rồi, anh chị đã làm gì vậy, chỉ em với ạ!
Vậy là vấn đề đượ giải quyết rồi phải không ạ?
Thay bằng đoạn này phải không ạ?
With Sheets("Payroll_Luong")
.Range("B6:B162").EntireRow.Hidden = False
.Range("A8:B163").ClearContents
.Range("A8").Resize(K, 2) = dArr
.Cells.Replace What:="ChamCong!$B$6:$BJ$6", Replacement:= _
"ChamCong!$B$6:$BJ$440", LookAt:=xlPart, SearchOrder:=xlByRows
.Range("B6:B162").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
End With
:):):);););)
 
Upvote 0
Làm theo kiểu Ctrl+H ấy . Thay thế cụm từ ChamCong!$B$6:$BJ$6 thành ChamCong!$B$6:$BJ$440
Mã:
.Cells.Replace What:="ChamCong!$B$6:$BJ$6", Replacement:= _
        "ChamCong!$B$6:$BJ$440", LookAt:=xlPart, SearchOrder:=xlByRows
 
Upvote 0
oái...anh chị xệp hạng là VBA Prosesional rồi nên lụi được, em học mót lượm lặt, nên không biết lụi kiểu gì
Anh chị chỉ giúp em sao giờ em down file về làm thì lại được rồi, anh chị đã làm gì vậy, chỉ em với ạ!
Vậy là vấn đề đượ giải quyết rồi phải không ạ?
Thay bằng đoạn này phải không ạ?
With Sheets("Payroll_Luong")
.Range("B6:B162").EntireRow.Hidden = False
.Range("A8:B163").ClearContents
.Range("A8").Resize(K, 2) = dArr
.Cells.Replace What:="ChamCong!$B$6:$BJ$6", Replacement:= _
"ChamCong!$B$6:$BJ$440", LookAt:=xlPart, SearchOrder:=xlByRows
.Range("B6:B162").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
End With
:):):);););)
Đúng ra phải là cái này hì hì ( Thay cái chỗ B6 thành B8)
Mã:
 With Sheets("Payroll_Luong")
        .Range("B8:B162").EntireRow.Hidden = False
        .Range("A8:B163").ClearContents
        .Range("A8").Resize(K, 2) = dArr
        .Cells.Replace What:="ChamCong!$B$6:$BJ$6", Replacement:= _
                "ChamCong!$B$6:$BJ$440", LookAt:=xlPart, SearchOrder:=xlByRows
        .Range("B8:B162").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
    End With
 
Upvote 0
Làm theo kiểu Ctrl+H ấy . Thay thế cụm từ ChamCong!$B$6:$BJ$6 thành ChamCong!$B$6:$BJ$440
Mã:
.Cells.Replace What:="ChamCong!$B$6:$BJ$6", Replacement:= _
        "ChamCong!$B$6:$BJ$440", LookAt:=xlPart, SearchOrder:=xlByRows
:):):);););)
NGOÀI CHÂN THÀNH CẢM ƠN RA, THÌ ... VẪN LÀ CHÂN THÀNH CẢM ƠN Ạ!!!
 
Upvote 0
Đúng ra phải là cái này hì hì ( Thay cái chỗ B6 thành B8)
Mã:
 With Sheets("Payroll_Luong")
        .Range("B8:B162").EntireRow.Hidden = False
        .Range("A8:B163").ClearContents
        .Range("A8").Resize(K, 2) = dArr
        .Cells.Replace What:="ChamCong!$B$6:$BJ$6", Replacement:= _
                "ChamCong!$B$6:$BJ$440", LookAt:=xlPart, SearchOrder:=xlByRows
        .Range("B8:B162").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
    End With
Bác PacificPR ơi, cột AH vẫn bị lỗi khi em đặt công thức là sao ạ!
Em có kèm theo hình chụp màn hình, bác xem giúp em với
Cảm ơn ạ!
 

File đính kèm

  • LOI - COT AH.png
    LOI - COT AH.png
    227.8 KB · Đọc: 2
Upvote 0

File đính kèm

Upvote 0

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

Back
Top Bottom