Nhờ sửa Code file "Chamcong_luong" (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ị trên GPE, lần trước đã nhờ các anh chị làm giúp File "Chamcong_luong"
Sau khi thực hiện, em gặp một số vấn đề và cần chỉnh sửa lại cho phù hợp, Kính mong anh chị giúp đỡ
File em gửi đính kèm, cần chỉnh sửa lại như sau ạ:

1. Tại Sheet "Chamcong" , Sửa lại code Update_list sao cho danh sách nhân viên chuyển từ Sheet "Danhsach_NV" vào Sheet "Chamcong", trừ những người em đã đánh ngày thôi việc tại cột "V" của Sheet "Danhsach-NV", đồng thời tự động đánh dấu "X" vào các ô từ "F đến AJ" trừ những ngày chủ nhật là không đánh dấu "X"
*** Code chấm công hiện tại đang dùng, mỗi đơn vị số tương ứng với 0.5 giờ, ví dụ "P3" nghỉ phép năm 1,5 tiếng,
Em muốn chỉnh lại theo số thực tế: Ví dự: P4: Nghỉ phép năm 4 tiếng, V4.5: Nghỉ việc riêng 4,5 tiếng

2. Các cột "Vắng mặt" (các loại phép) và các cột ghi các loại tăng ca (Từ AK đến AY) em có ghi chú ví dụ cho minh họa cho nhân viên HA1709004, anh chị sửa lại Code giúp ạ

3. Phần Code "Kết xuất" bảng chấm công sau khi kết xuất thì Ô AI4 không kết xuất được, anh chị chỉnh sửa giúp ạ

4. Do Sheet Payroll_luong, phải chi dòng để phân biệt chi phí quản lý và chi phí nhân công trực tiếp cho bộ phận kế toán theo dõi, nên khi chạy lệnh "Update_List" bị báo lỗi, anh chị sửa lại giúp ạ!
 

File đính kèm

Tạo trước cho bạn 2 code cập nhật danh sách và tính công
Khi cần thì bấm chạy cập nhật danh sách
Sau khi chấm công đầy đủ bấm lệnh tính công
Dạ, Cảm ơn anh "HieuCD", em down về và áp dụng, nếu có vấn đề gì nữa mong tiếp tục nhận được sự giúp đỡ từ anh nhé, ngòai ra, còn một số hạng mục như nêu trên, cũng mong anh giúp ạ
Chúc anh đầu tuần vui vẻ và thành công
Chúc tất cả những vị giáo viên (Nhất là những vị trong diễn đàn này) , ngày 20-11 tràn đầy niềm vui và hạnh phúc, sức khỏe và thành công ạ!
Trân trọng!
 
Upvote 0
Dạ, Cảm ơn anh "HieuCD", em down về và áp dụng, nếu có vấn đề gì nữa mong tiếp tục nhận được sự giúp đỡ từ anh nhé, ngòai ra, còn một số hạng mục như nêu trên, cũng mong anh giúp ạ
Chúc anh đầu tuần vui vẻ và thành công
Chúc tất cả những vị giáo viên (Nhất là những vị trong diễn đàn này) , ngày 20-11 tràn đầy niềm vui và hạnh phúc, sức khỏe và thành công ạ!
Trân trọng!
Anh "HieuCD" ơi, Em cho chạy thử File rồi, nhưng cột "KR" em đánh nghỉ không phép "K" (nghỉ không phép 8 tiếng) hoặc ví dụ "K4"(nghỉ không phép 4 tiếng) thì lệnh không thể hiện số giờ tại cột "KR"
Ngoài ra, cột "AZ" (Ngày phép phép còn lại), em thử thêm một nhân viên mới vào và cho Update List thì cũng không chạy được ạ
Anh xem giúp em nhé
Tks anh!

TB: Anh có thể cho em số điện thoại hay Email để tiện liên lạc không ạ?
 
Upvote 0
Dạ, Cảm ơn anh "HieuCD", em down về và áp dụng, nếu có vấn đề gì nữa mong tiếp tục nhận được sự giúp đỡ từ anh nhé, ngòai ra, còn một số hạng mục như nêu trên, cũng mong anh giúp ạ
Chúc anh đầu tuần vui vẻ và thành công
Chúc tất cả những vị giáo viên (Nhất là những vị trong diễn đàn này) , ngày 20-11 tràn đầy niềm vui và hạnh phúc, sức khỏe và thành công ạ!
Trân trọng!
Chỉnh lại code, thêm sheet Payroll_Luong
Còn các phần khác không hiểu ý bạn như thế nào
Mã:
Sub Update_List()
    Dim sArr, dArr, cArr, VP, SX, dkVP As String
    Dim I As Long, J As Long, stt As Long, K As Long, Thu As Long, k1 As Long, k2 As Long
    Application.ScreenUpdating = False
    With Sheets("Danhsach_NV")
        sArr = .Range("A7", .Range("A65535").End(3)).Resize(, 34).Value
    End With
    With Sheets("Chamcong")
      cArr = .Range("C7:C12").Value
    End With
    ReDim dArr(1 To UBound(sArr) * 7, 1 To 36)
    dkVP = Sheets("Payroll_Luong").Range("BN1").Value
    ReDim VP(1 To UBound(sArr), 1 To 3)
    ReDim SX(1 To UBound(sArr), 1 To 3)
    For I = 1 To UBound(sArr)
        If sArr(I, 2) <> Empty And sArr(I, 22) = Empty Then
            K = K + 1
            stt = stt + 1
            dArr(K, 1) = stt
            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 = 1 To 6
                K = K + 1
                dArr(K, 3) = cArr(J, 1)
            Next J
            If sArr(I, 7) = dkVP Then
              k1 = k1 + 1
              VP(k1, 1) = k1
              VP(k1, 2) = sArr(I, 2)
              VP(k1, 3) = sArr(I, 3)
            Else
              k2 = k2 + 1
              SX(k2, 2) = sArr(I, 2)
              SX(k2, 3) = sArr(I, 3)
            End If
        End If
    Next I
    For I = 1 To k2
      SX(I, 1) = I + k1
    Next I
    With Sheets("Chamcong")
        I = .Range("C65535").End(xlUp).Row
        If I > 12 Then
          I = Int((I - 6) / 7 + 1) * 7 + 5
          .Range("A13:BA" & I).Clear
          .Range("A6:BA12").ClearContents
        End If
        .Range("A6").Resize(K, 36) = dArr
        .Range("A6:BA12").Copy
        .Range("A13").Resize(K - 7, 53).PasteSpecial Paste:=xlPasteFormats
        Application.CutCopyMode = False
        For I = 1 To UBound(dArr) Step 7
          .Range("AS" & I + 5).FormulaR1C1 = "=COUNTIF(RC[-39]:RC[-9],""X*"")*8-SUM(RC[-6]:RC[-1])"
          .Range("AZ" & I + 5).FormulaR1C1 = "=VLOOKUP(RC[-50],Phepnam!R7C2:R54C46,34,0)"
        Next I
    End With
   
    With Sheets("Payroll_Luong")
        K = .Range("B65535").End(xlUp).Row
        For I = 12 To 65500
          If InStr(.Cells(I, 1), "II") Then
            If K > k2 + I Then
              .Range("A" & I + 2).Resize(K - k2 - I).EntireRow.Delete
            ElseIf K < k2 + I Then
              .Range("A" & I + 2).Resize(k2 + I - K).EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
              .Range("N" & I + 1).Resize(, 39).Copy
              .Range("N" & I + 1).Resize(k2 - 1, 39).PasteSpecial Paste:=xlPasteFormulas
              Application.CutCopyMode = False
            End If
            .Range("A" & I + 1).Resize(k2, 3) = SX
           
            If I > k1 + 12 + 1 Then
              .Range("A13").Resize(I - (k1 + 12 + 1)).EntireRow.Delete
            ElseIf I < k1 + 12 + 1 Then
              .Range("A13").Resize(k1 + 12 + 1 - I).EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
              .Range("N12").Resize(, 39).Copy
              .Range("N13").Resize(k1 - 1, 39).PasteSpecial Paste:=xlPasteFormulas
              Application.CutCopyMode = False
            End If
            .Range("A12").Resize(k1, 3) = VP
          End If
        Next I
    End With
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
Chỉnh lại code, thêm sheet Payroll_Luong
Còn các phần khác không hiểu ý bạn như thế nào
Mã:
Sub Update_List()
    Dim sArr, dArr, cArr, VP, SX, dkVP As String
    Dim I As Long, J As Long, stt As Long, K As Long, Thu As Long, k1 As Long, k2 As Long
    Application.ScreenUpdating = False
    With Sheets("Danhsach_NV")
        sArr = .Range("A7", .Range("A65535").End(3)).Resize(, 34).Value
    End With
    With Sheets("Chamcong")
      cArr = .Range("C7:C12").Value
    End With
    ReDim dArr(1 To UBound(sArr) * 7, 1 To 36)
    dkVP = Sheets("Payroll_Luong").Range("BN1").Value
    ReDim VP(1 To UBound(sArr), 1 To 3)
    ReDim SX(1 To UBound(sArr), 1 To 3)
    For I = 1 To UBound(sArr)
        If sArr(I, 2) <> Empty And sArr(I, 22) = Empty Then
            K = K + 1
            stt = stt + 1
            dArr(K, 1) = stt
            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 = 1 To 6
                K = K + 1
                dArr(K, 3) = cArr(J, 1)
            Next J
            If sArr(I, 7) = dkVP Then
              k1 = k1 + 1
              VP(k1, 1) = k1
              VP(k1, 2) = sArr(I, 2)
              VP(k1, 3) = sArr(I, 3)
            Else
              k2 = k2 + 1
              SX(k2, 2) = sArr(I, 2)
              SX(k2, 3) = sArr(I, 3)
            End If
        End If
    Next I
    For I = 1 To k2
      SX(I, 1) = I + k1
    Next I
    With Sheets("Chamcong")
        I = .Range("C65535").End(xlUp).Row
        If I > 12 Then
          I = Int((I - 6) / 7 + 1) * 7 + 5
          .Range("A13:BA" & I).Clear
          .Range("A6:BA12").ClearContents
        End If
        .Range("A6").Resize(K, 36) = dArr
        .Range("A6:BA12").Copy
        .Range("A13").Resize(K - 7, 53).PasteSpecial Paste:=xlPasteFormats
        Application.CutCopyMode = False
        For I = 1 To UBound(dArr) Step 7
          .Range("AS" & I + 5).FormulaR1C1 = "=COUNTIF(RC[-39]:RC[-9],""X*"")*8-SUM(RC[-6]:RC[-1])"
          .Range("AZ" & I + 5).FormulaR1C1 = "=VLOOKUP(RC[-50],Phepnam!R7C2:R54C46,34,0)"
        Next I
    End With
  
    With Sheets("Payroll_Luong")
        K = .Range("B65535").End(xlUp).Row
        For I = 12 To 65500
          If InStr(.Cells(I, 1), "II") Then
            If K > k2 + I Then
              .Range("A" & I + 2).Resize(K - k2 - I).EntireRow.Delete
            ElseIf K < k2 + I Then
              .Range("A" & I + 2).Resize(k2 + I - K).EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
              .Range("N" & I + 1).Resize(, 39).Copy
              .Range("N" & I + 1).Resize(k2 - 1, 39).PasteSpecial Paste:=xlPasteFormulas
              Application.CutCopyMode = False
            End If
            .Range("A" & I + 1).Resize(k2, 3) = SX
          
            If I > k1 + 12 + 1 Then
              .Range("A13").Resize(I - (k1 + 12 + 1)).EntireRow.Delete
            ElseIf I < k1 + 12 + 1 Then
              .Range("A13").Resize(k1 + 12 + 1 - I).EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
              .Range("N12").Resize(, 39).Copy
              .Range("N13").Resize(k1 - 1, 39).PasteSpecial Paste:=xlPasteFormulas
              Application.CutCopyMode = False
            End If
            .Range("A12").Resize(k1, 3) = VP
          End If
        Next I
    End With
    Application.ScreenUpdating = True
End Sub
Em Coppy vào thì báo lỗi ở đoạn này ạ!: ".Range("A12").Resize(k1, 3) = VP"
 
Upvote 0

File đính kèm

Upvote 0
Do dkVP lấy giá trị từ ô BN1, mình quên dặn bạn nhập điều kiện, chỉnh lại code bỏ biến dkVP
Bạn cần gì cứ nhắn tin trên diễn đàn
Chào anh, em down về và chạy thử thì phát hiện còn vài vấn đề ở "sheet Chamcong", em có ghi chú trong sheet luôn rồi ạ!
Anh xem giúp em với nhé
Cảm ơn anh!
Trân trọng!
 

File đính kèm

Upvote 0
Chào anh, em down về và chạy thử thì phát hiện còn vài vấn đề ở "sheet Chamcong", em có ghi chú trong sheet luôn rồi ạ!
Anh xem giúp em với nhé
Cảm ơn anh!
Trân trọng!
Code viết theo vị trí dòng cột qui định trước, bạn không thể tự insert thêm dòng 6 được, toàn bộ 2 code đều phá sản không chạy được, dòng 6 bạn thêm vào là gì vậy?
 
Upvote 0
Code viết theo vị trí dòng cột qui định trước, bạn không thể tự insert thêm dòng 6 được, toàn bộ 2 code đều phá sản không chạy được, dòng 6 bạn thêm vào là gì vậy?
Dạ em biết khi thêm dòng vào thì lại phải chỉnh lại Code, ý của em là muốn đặt riêng "ký hiệu những loại phép" dành riêng cho ngày làm ca đêm, em không biết là có cần thiết không, nên có hỏi là "Có cần thiết không ạ?" trong phần chú thích trong Sheet chamcong đó ạ!
 
Upvote 0
Dạ em biết khi thêm dòng vào thì lại phải chỉnh lại Code, ý của em là muốn đặt riêng "ký hiệu những loại phép" dành riêng cho ngày làm ca đêm, em không biết là có cần thiết không, nên có hỏi là "Có cần thiết không ạ?" trong phần chú thích trong Sheet chamcong đó ạ!
Mình tính dựa vào dòng 5, thêm cột làm đêm "D" không có vấn đề gì, vấn đề là mấy ký tự ở dòng 6 là gì? có cần không?
 
Upvote 0
Mình tính dựa vào dòng 5, thêm cột làm đêm "D" không có vấn đề gì, vấn đề là mấy ký tự ở dòng 6 là gì? có cần không?
Dạ, ý em là khi mình chấm "D" vào trong khoảng từ "F:AJ" , và trong ngày nào đó, bạn nào đó nghỉ phép vào ngày đi ca đêm, mà dùng ký hiệu tại dòng 5 thì em sợ bị trừ nhầm lẫn giữa phép của ca ngày và phép của ca đêm, như vậy giờ công sẽ không chính xác ạ! (Đó là em nghĩ vậy, nên em cũng muốn xin ý kiến khai sáng của anh ạ!) .
 
Upvote 0
Dạ, ý em là khi mình chấm "D" vào trong khoảng từ "F:AJ" , và trong ngày nào đó, bạn nào đó nghỉ phép vào ngày đi ca đêm, mà dùng ký hiệu tại dòng 5 thì em sợ bị trừ nhầm lẫn giữa phép của ca ngày và phép của ca đêm, như vậy giờ công sẽ không chính xác ạ! (Đó là em nghĩ vậy, nên em cũng muốn xin ý kiến khai sáng của anh ạ!) .
Vậy thay gì đánh "X" bạn đánh "D" là biết công ngày hay đêm là được rồi
 
Upvote 0
dạ vâng, nhưng "D" là ngày công đêm, nhưng trong những ngày làm công đêm, có thể có bạn nghỉ phép, thì mình dùng chung ký hiệu nghỉ phép tại dòng 5, như vậy giờ công có bị trừ nhầm qua lại giữa 2 loại công không ạ?
 
Upvote 0
dạ vâng, nhưng "D" là ngày công đêm, nhưng trong những ngày làm công đêm, có thể có bạn nghỉ phép, thì mình dùng chung ký hiệu nghỉ phép tại dòng 5, như vậy giờ công có bị trừ nhầm qua lại giữa 2 loại công không ạ?
Nếu là "D" thì trừ đêm "X" thì trừ ngày, thì làm sao nhằm được
 
Upvote 0
Anh "HieuCD" giúp tiếp em với ạk!
Cảm ơn anh
 
Upvote 0
Đã chỉnh code tính công, bạn kiểm tra lại
Chào anh, em mới kiểm tra xong, những điều kiện trong File chạy gần như đúng ý em, nhưng còn một vấn đề ạ!
Phần tăng ca, nếu ô đi làm mà không tích dấu (X hoặc D) thì phía dưới có chấm tăng ca công thức sẽ không chạy, như vậy không sao (và cũng rất hợp lý, vì không đi làm thì sao mà tăng ca), nhưng...
- Nếu vào ngày chủ nhật mà có người nào đó tăng ca, em sẽ chấm công vào hàng "Tăng ca ngày chủ nhật 200%" ( Ví dụ: tại Ô "V9" , đồng thời phải tích (X hoặc D) vào dòng đi làm (Ví dụ Ô "V6", như vậy công thức sẽ tự động tính giờ làm vào Ô "AW6", đồng thời lại tính dư ra một ngày làm ví dụ tại "AS6", như thế qua sheet Payroll_luong , số ngày làm bị tăng lên so với thực tế.
-Nếu em không tích (X hoặc D) vào dòng đi làm (Ví dụ tại "AC6") Thì giờ công tăng ca sẽ không được hiển thị tại "AW6"
- Tương tự các dòng tăng ca phía dưới cũng bị hiện tượng này ạ!
Mong anh giúp đỡ
Trân trọng!
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom