Xin giúp đỡ về thanh toán vượt định mức

Liên hệ QC

Thuyanhanoi

Thành viên thường trực
Tham gia
15/10/12
Bài viết
304
Được thích
154
Nghề nghiệp
Nhân viên
Mong được các anh chị và các bạn giúp đỡ code vba chép và tổng hợp dữ liệu để thanh toán vượt định mức tại sheet(Thanh_toan_vuot_dinh_muc) cụ thể như sau:
- Sheet(Thanh_toan_vuot_dinh_muc) này là kết quả mong muốn mà em làm thủ công. Dữ liệu được lấy từ sheet (Tong_hop)
- Số lượng vượt chi tiết theo danh mục (Cột J) tại sheet(Thanh_toán_vượt_định_mức) của mỗi mã nhân viên là số còn lại được chép sáng từ sheet(Tổng_hợp) sau khi đã cộng dồn từ trên xuống dưới và trừ đi định mức ở (cột S) sheet (Tổng_hợp).
- Rất mong được các anh chị và các bạn giúp đỡ!.
 

File đính kèm

Mong mọi người giúp em với ạ!.
Ví dụ: Khi làm thủ công cho trường hợp nhân viên Nguyễn Quang Đông em thực hiện như sau:
Em tính tổng số lượng ở cột R [SUM(R10:R32)] được tổng là 521.2 tương đương với danh mục tại dòng G32 sẽ bắt đầu có vượt so với định mức là 521.2-480 = 41.2.
Như vậy em tìm được các danh mục còn lại vượt định mức như sau:
1542384335212.png

Sau đó em chép sang sheet(Thanh_toan_vuot_dinh_muc) để tính.

Cứ như vậy em tổng hợp cho các nhân viên có cột số lượng Tổng > cột định mức
Vì danh sách tổng hợp có số lượng nhân viên nhiều. Nên rất mong được sự giúp đỡ của mọi người!
 

File đính kèm

Upvote 0
Rất mong được các thành viên giúp đỡ, cho ý kiến, giải pháp thực hiện với ạ!.
 
Upvote 0
bạn có thể nói rõ hơn được không mình ko hiểu lắm.nói rõ cách tính định mức.xem nào.
Cảm ơn bạn!. Mình xin giải thích như sau:
- Ở sheet (Tong_hop) mình có các Mình có Cột F (đơn vị); G(Danh mục); R(Số lượng); S(Định mức); T(Thừa/Thiếu). Với mỗi mã nhân viên mình có dòng Tổng:
+ Dòng Tổng này là số liệu tổng cộng của cột R(Số lượng) Như trong file đính kèm của mình với nhân viên đầu tiên: Nguyễn Quang Đông là: 582.2
+ Nhân viên này có định mức số lượng thực hiện (ở Cột S) là 480 nên Số lượng mà nhân viên này đã thực hiện vượt định mức (Thừa) là 102.2 (ở dòng Tổng: cột T).
+ Mình phải chép tất cả các Số lượng Vượt (Thừa) sang sheet(Thanh_toan_vuot_dinh_muc) để tính [Số lượng thừa tương ứng với từng Danh mục, đơn vị tính]
+ Như vậy ở cột R(Số lượng) bên sheet (Tong_hop) của mỗi nhân viên được tính tổng từ trên xuống đến khi đủ định mức Ví dụ như Nguyễn Quang Đông là: 480; Các Số lượng còn lại là vượt được chép sang Cột J bên sheet(Thanh_toan_vuot_dinh_muc).
- Đơn giá tính vượt (Cột L) ở sheet(Thanh_toán_vượt_định_mức) = 150000*[ đơn vị (Cột K) tương ứng]/100
Mình đã làm ở sheet(Thanh_toan_vuot_dinh_muc).
- Trong file đính kèm, Sheet (Thanh_toan_vuot_dinh_muc) là kết quả mình cần; Mình đã làm thủ công!. Bây giờ mình muốn được các bạn giúp mình code vba để được kết quả đó.

Xin cảm ơn các bạn đã quan tâm giúp mình!.
 
Upvote 0
Mong được các anh chị và các bạn giúp đỡ code vba chép và tổng hợp dữ liệu để thanh toán vượt định mức tại sheet(Thanh_toan_vuot_dinh_muc) cụ thể như sau:
- Sheet(Thanh_toan_vuot_dinh_muc) này là kết quả mong muốn mà em làm thủ công. Dữ liệu được lấy từ sheet (Tong_hop)
- Số lượng vượt chi tiết theo danh mục (Cột J) tại sheet(Thanh_toán_vượt_định_mức) của mỗi mã nhân viên là số còn lại được chép sáng từ sheet(Tổng_hợp) sau khi đã cộng dồn từ trên xuống dưới và trừ đi định mức ở (cột S) sheet (Tổng_hợp).
- Rất mong được các anh chị và các bạn giúp đỡ!.
Mã:
Sub GPE()
  Dim sArr(), dArr(), Res(), Dic As Object
  Dim Dm As Double, Sl As Double, Vuot As Double, TT As Double
  Dim i As Long, ik As Long, n As Long, sRow As Long
  Dim tongStr As String
  With Sheets("danh_sach")
    dArr = .Range("B6:I" & .Range("B" & Rows.Count).End(xlUp).Row).Value
  End With
  Set Dic = CreateObject("scripting.dictionary")
  For i = 1 To UBound(dArr)
    Dic.Item(dArr(i, 1)) = dArr(i, 8)
  Next i
  With Sheets("Tong_hop")
    sArr = .Range("B10:R" & .Range("G" & Rows.Count).End(xlUp).Row).Value
    sRow = UBound(sArr)
  End With
  tongStr = Sheets("Thanh_toan_vuot_dinh_muc").Range("E8").Value
  ReDim Res(1 To sRow, 1 To 13)

  For i = 1 To sRow
    If Len(sArr(i, 1)) > 0 Then
      Dm = Dic.Item(sArr(i, 1))
      Sl = 0: TT = 0: Vuot = 0
      
      ik = k + 1
      For n = i To sRow
        If Len(sArr(n, 5)) = 0 Then
          If TT > 0 Then
            stt = stt + 1
            Res(ik, 1) = stt
            Res(ik, 2) = sArr(i, 1)
            Res(ik, 3) = sArr(i, 2)
            Res(ik, 4) = sArr(i, 3)
            Res(ik, 5) = Sl
            Res(ik, 8) = Dm
            Res(ik, 9) = Vuot
            
            k = k + 1
            Res(k, 9) = tongStr
            Res(k, 10) = Vuot
            Res(k, 13) = TT
          End If
          i = n
          Exit For
        End If
        Sl = Round(Sl + sArr(n, 17), 2)
        If Sl > Dm Then
          k = k + 1
          If k = ik Then Res(k, 10) = Sl - Dm Else Res(k, 10) = sArr(n, 17)
          Vuot = Vuot + Res(k, 10)
          Res(k, 11) = sArr(n, 5)
          Res(k, 12) = Res(k, 11) * 1500
          Res(k, 13) = Res(k, 10) * Res(k, 12)
          TT = TT + Res(k, 13)
        End If
      Next n
    End If
  Next i
  Sheets("Thanh_toan_vuot_dinh_muc").Range("A10:M10").Resize(k) = Res
End Sub
 

File đính kèm

Upvote 0
Mã:
Sub GPE()
  Dim sArr(), dArr(), Res(), Dic As Object
  Dim Dm As Double, Sl As Double, Vuot As Double, TT As Double
  Dim i As Long, ik As Long, n As Long, sRow As Long
  Dim tongStr As String
  With Sheets("danh_sach")
    dArr = .Range("B6:I" & .Range("B" & Rows.Count).End(xlUp).Row).Value
  End With
  Set Dic = CreateObject("scripting.dictionary")
  For i = 1 To UBound(dArr)
    Dic.Item(dArr(i, 1)) = dArr(i, 8)
  Next i
  With Sheets("Tong_hop")
    sArr = .Range("B10:R" & .Range("G" & Rows.Count).End(xlUp).Row).Value
    sRow = UBound(sArr)
  End With
  tongStr = Sheets("Thanh_toan_vuot_dinh_muc").Range("E8").Value
  ReDim Res(1 To sRow, 1 To 13)

  For i = 1 To sRow
    If Len(sArr(i, 1)) > 0 Then
      Dm = Dic.Item(sArr(i, 1))
      Sl = 0: TT = 0: Vuot = 0
   
      ik = k + 1
      For n = i To sRow
        If Len(sArr(n, 5)) = 0 Then
          If TT > 0 Then
            stt = stt + 1
            Res(ik, 1) = stt
            Res(ik, 2) = sArr(i, 1)
            Res(ik, 3) = sArr(i, 2)
            Res(ik, 4) = sArr(i, 3)
            Res(ik, 5) = Sl
            Res(ik, 8) = Dm
            Res(ik, 9) = Vuot
         
            k = k + 1
            Res(k, 9) = tongStr
            Res(k, 10) = Vuot
            Res(k, 13) = TT
          End If
          i = n
          Exit For
        End If
        Sl = Round(Sl + sArr(n, 17), 2)
        If Sl > Dm Then
          k = k + 1
          If k = ik Then Res(k, 10) = Sl - Dm Else Res(k, 10) = sArr(n, 17)
          Vuot = Vuot + Res(k, 10)
          Res(k, 11) = sArr(n, 5)
          Res(k, 12) = Res(k, 11) * 1500
          Res(k, 13) = Res(k, 10) * Res(k, 12)
          TT = TT + Res(k, 13)
        End If
      Next n
    End If
  Next i
  Sheets("Thanh_toan_vuot_dinh_muc").Range("A10:M10").Resize(k) = Res
End Sub
Cảm ơn Anh!
- Với dữ liệu hiện tại của file em gửi thì code chay tốt rồi ạ!. Em sẽ kiểm tra lại khi code chay với dữ liệu nhiều hơn!.
- Em muốn kẻ khung và tô màu cho dòng tổng tuy nhiên với code trên của Anh em chỉ thêm để kẻ được khung; Còn tô màu là bôi đậm dòng Tổng thì em chỉ là được dòng cuối. Mong Anh sửa giùm để em tô đậm được các dòng Tổng với ạ!. Em cảm ơn Anh.
Mã:
Sub GPE()
  Dim sArr(), dArr(), Res(), Dic As Object
  Dim Dm As Double, Sl As Double, Vuot As Double, TT As Double
  Dim i As Long, ik As Long, n As Long, sRow As Long
  Dim tongStr As String
  With Sheets("danh_sach")
    dArr = .Range("B6:I" & .Range("B" & Rows.Count).End(xlUp).Row).Value
  End With
  Set Dic = CreateObject("scripting.dictionary")
  For i = 1 To UBound(dArr)
    Dic.Item(dArr(i, 1)) = dArr(i, 8)
  Next i
  With Sheets("Tong_hop")
    sArr = .Range("B10:R" & .Range("G" & Rows.Count).End(xlUp).Row).Value
    sRow = UBound(sArr)
  End With
  tongStr = Sheets("Thanh_toan_vuot_dinh_muc").Range("E8").Value
  ReDim Res(1 To sRow, 1 To 15)

  For i = 1 To sRow
    If Len(sArr(i, 1)) > 0 Then
      Dm = Dic.Item(sArr(i, 1))
      Sl = 0: TT = 0: Vuot = 0
     
      ik = K + 1
      For n = i To sRow
        If Len(sArr(n, 5)) = 0 Then
          If TT > 0 Then
            stt = stt + 1
            Res(ik, 1) = stt
            Res(ik, 2) = sArr(i, 1)
            Res(ik, 3) = sArr(i, 2)
            Res(ik, 4) = sArr(i, 3)
            Res(ik, 5) = Sl
            Res(ik, 8) = Dm
            Res(ik, 9) = Vuot
           
            K = K + 1
            Res(K, 9) = tongStr
            Res(K, 10) = Vuot
            Res(K, 13) = TT
          End If
          i = n
          Exit For
        End If
        Sl = Round(Sl + sArr(n, 17), 2)
        If Sl > Dm Then
          K = K + 1
          If K = ik Then Res(K, 10) = Sl - Dm Else Res(K, 10) = sArr(n, 17)
          Vuot = Vuot + Res(K, 10)
          Res(K, 11) = sArr(n, 5)
          Res(K, 12) = Res(K, 11) * 1500
          Res(K, 13) = Res(K, 10) * Res(K, 12)
          TT = TT + Res(K, 13)
        End If
      Next n
    End If
  Next i
  Sheets("Thanh_toan_vuot_dinh_muc").Range("A10:M10").Resize(K) = Res
With Sheets("Thanh_toan_vuot_dinh_muc")
    Range("A10").Resize(K, 15).Borders.LineStyle = 1
    Range("A10").Resize(K, 15).Borders(xlInsideHorizontal).Weight = xlHairline
    Range("C10:D10").Resize(K).Borders(xlInsideVertical).LineStyle = xlNone
    Range("A" & K + 9).Resize(, 15).Interior.ColorIndex = 36
    Range("A" & K + 9).Resize(, 15).Font.Bold = True
End With
End Sub
 
Upvote 0
Cảm ơn Anh!
- Với dữ liệu hiện tại của file em gửi thì code chay tốt rồi ạ!. Em sẽ kiểm tra lại khi code chay với dữ liệu nhiều hơn!.
- Em muốn kẻ khung và tô màu cho dòng tổng tuy nhiên với code trên của Anh em chỉ thêm để kẻ được khung; Còn tô màu là bôi đậm dòng Tổng thì em chỉ là được dòng cuối. Mong Anh sửa giùm để em tô đậm được các dòng Tổng với ạ!. Em cảm ơn Anh.
Mã:
Sub GPE()
  Dim sArr(), dArr(), Res(), Dic As Object
  Dim Dm As Double, Sl As Double, Vuot As Double, TT As Double
  Dim i As Long, ik As Long, n As Long, sRow As Long
  Dim tongStr As String
  With Sheets("danh_sach")
    dArr = .Range("B6:I" & .Range("B" & Rows.Count).End(xlUp).Row).Value
  End With
  Set Dic = CreateObject("scripting.dictionary")
  For i = 1 To UBound(dArr)
    Dic.Item(dArr(i, 1)) = dArr(i, 8)
  Next i
  With Sheets("Tong_hop")
    sArr = .Range("B10:R" & .Range("G" & Rows.Count).End(xlUp).Row).Value
    sRow = UBound(sArr)
  End With
  tongStr = Sheets("Thanh_toan_vuot_dinh_muc").Range("E8").Value
  ReDim Res(1 To sRow, 1 To 15)

  For i = 1 To sRow
    If Len(sArr(i, 1)) > 0 Then
      Dm = Dic.Item(sArr(i, 1))
      Sl = 0: TT = 0: Vuot = 0
    
      ik = K + 1
      For n = i To sRow
        If Len(sArr(n, 5)) = 0 Then
          If TT > 0 Then
            stt = stt + 1
            Res(ik, 1) = stt
            Res(ik, 2) = sArr(i, 1)
            Res(ik, 3) = sArr(i, 2)
            Res(ik, 4) = sArr(i, 3)
            Res(ik, 5) = Sl
            Res(ik, 8) = Dm
            Res(ik, 9) = Vuot
          
            K = K + 1
            Res(K, 9) = tongStr
            Res(K, 10) = Vuot
            Res(K, 13) = TT
          End If
          i = n
          Exit For
        End If
        Sl = Round(Sl + sArr(n, 17), 2)
        If Sl > Dm Then
          K = K + 1
          If K = ik Then Res(K, 10) = Sl - Dm Else Res(K, 10) = sArr(n, 17)
          Vuot = Vuot + Res(K, 10)
          Res(K, 11) = sArr(n, 5)
          Res(K, 12) = Res(K, 11) * 1500
          Res(K, 13) = Res(K, 10) * Res(K, 12)
          TT = TT + Res(K, 13)
        End If
      Next n
    End If
  Next i
  Sheets("Thanh_toan_vuot_dinh_muc").Range("A10:M10").Resize(K) = Res
With Sheets("Thanh_toan_vuot_dinh_muc")
    Range("A10").Resize(K, 15).Borders.LineStyle = 1
    Range("A10").Resize(K, 15).Borders(xlInsideHorizontal).Weight = xlHairline
    Range("C10:D10").Resize(K).Borders(xlInsideVertical).LineStyle = xlNone
    Range("A" & K + 9).Resize(, 15).Interior.ColorIndex = 36
    Range("A" & K + 9).Resize(, 15).Font.Bold = True
End With
End Sub
Thêm biến Rng, nếu số lượng nhân viên nhiều có thể code hơi chậm
Mã:
Sub GPE()
  Dim sArr(), dArr(), Res(), Dic As Object, Rng As Range
  Dim Dm As Double, Sl As Double, Vuot As Double, TT As Double
  Dim i As Long, ik As Long, n As Long, sRow As Long
  Dim tongStr As String
  With Sheets("danh_sach")
    dArr = .Range("B6:I" & .Range("B" & Rows.Count).End(xlUp).Row).Value
  End With
  Set Dic = CreateObject("scripting.dictionary")
  For i = 1 To UBound(dArr)
    Dic.Item(dArr(i, 1)) = dArr(i, 8)
  Next i
  With Sheets("Tong_hop")
    sArr = .Range("B10:R" & .Range("G" & Rows.Count).End(xlUp).Row).Value
    sRow = UBound(sArr)
  End With
  tongStr = Sheets("Thanh_toan_vuot_dinh_muc").Range("E8").Value
  ReDim Res(1 To sRow, 1 To 13)
 
  With Sheets("Thanh_toan_vuot_dinh_muc")
    For i = 1 To sRow
      If Len(sArr(i, 1)) > 0 Then
        Dm = Dic.Item(sArr(i, 1))
        Sl = 0: TT = 0: Vuot = 0
      
        ik = k + 1
        For n = i To sRow
          If Len(sArr(n, 5)) = 0 Then
            If TT > 0 Then
              stt = stt + 1
              Res(ik, 1) = stt
              Res(ik, 2) = sArr(i, 1)
              Res(ik, 3) = sArr(i, 2)
              Res(ik, 4) = sArr(i, 3)
              Res(ik, 5) = Sl
              Res(ik, 8) = Dm
              Res(ik, 9) = Vuot
            
              k = k + 1
              Res(k, 9) = tongStr
              Res(k, 10) = Vuot
              Res(k, 13) = TT
            
              If Rng Is Nothing Then
                Set Rng = .Range("A" & k + 9).Resize(, 15)
              Else
                Set Rng = Union(Rng, .Range("A" & k + 9).Resize(, 15))
              End If
            End If
            i = n
            Exit For
          End If
          Sl = Round(Sl + sArr(n, 17), 2)
          If Sl > Dm Then
            k = k + 1
            If k = ik Then Res(k, 10) = Sl - Dm Else Res(k, 10) = sArr(n, 17)
            Vuot = Vuot + Res(k, 10)
            Res(k, 11) = sArr(n, 5)
            Res(k, 12) = Res(k, 11) * 1500
            Res(k, 13) = Res(k, 10) * Res(k, 12)
            TT = TT + Res(k, 13)
          End If
        Next n
      End If
    Next i
    Set Dic = Nothing
    
    Application.ScreenUpdating = False
    i = .Range("I" & Rows.Count).End(xlUp).Row
    If i > 9 Then .Range("A10:O" & i).Clear
    If k > 0 Then
      Rng.Interior.ColorIndex = 36
      Rng.Font.Bold = True
      Set Rng = Nothing
      .Range("A10:M10").Resize(k) = Res
      .Range("A10").Resize(k, 15).Borders.LineStyle = 1
      .Range("A10").Resize(k, 15).Borders(xlInsideHorizontal).Weight = xlHairline
      .Range("C10:D10").Resize(k).Borders(xlInsideVertical).LineStyle = xlNone
    End If
    Application.ScreenUpdating = True
  End With
End Sub
 
Upvote 0
Filter theo "Tổng", chọn vùng cần định dạng, nhấn Ctrl B, hủy lọc.
Thật ngại quá loay hoay mãi em mới để cho nó Filter theo "Tổng", còn code the nào các Anh
Thêm biến Rng, nếu số lượng nhân viên nhiều có thể code hơi chậm
Mã:
Sub GPE()
  Dim sArr(), dArr(), Res(), Dic As Object, Rng As Range
  Dim Dm As Double, Sl As Double, Vuot As Double, TT As Double
  Dim i As Long, ik As Long, n As Long, sRow As Long
  Dim tongStr As String
  With Sheets("danh_sach")
    dArr = .Range("B6:I" & .Range("B" & Rows.Count).End(xlUp).Row).Value
  End With
  Set Dic = CreateObject("scripting.dictionary")
  For i = 1 To UBound(dArr)
    Dic.Item(dArr(i, 1)) = dArr(i, 8)
  Next i
  With Sheets("Tong_hop")
    sArr = .Range("B10:R" & .Range("G" & Rows.Count).End(xlUp).Row).Value
    sRow = UBound(sArr)
  End With
  tongStr = Sheets("Thanh_toan_vuot_dinh_muc").Range("E8").Value
  ReDim Res(1 To sRow, 1 To 13)

  With Sheets("Thanh_toan_vuot_dinh_muc")
    For i = 1 To sRow
      If Len(sArr(i, 1)) > 0 Then
        Dm = Dic.Item(sArr(i, 1))
        Sl = 0: TT = 0: Vuot = 0
     
        ik = k + 1
        For n = i To sRow
          If Len(sArr(n, 5)) = 0 Then
            If TT > 0 Then
              stt = stt + 1
              Res(ik, 1) = stt
              Res(ik, 2) = sArr(i, 1)
              Res(ik, 3) = sArr(i, 2)
              Res(ik, 4) = sArr(i, 3)
              Res(ik, 5) = Sl
              Res(ik, 8) = Dm
              Res(ik, 9) = Vuot
           
              k = k + 1
              Res(k, 9) = tongStr
              Res(k, 10) = Vuot
              Res(k, 13) = TT
           
              If Rng Is Nothing Then
                Set Rng = .Range("A" & k + 9).Resize(, 15)
              Else
                Set Rng = Union(Rng, .Range("A" & k + 9).Resize(, 15))
              End If
            End If
            i = n
            Exit For
          End If
          Sl = Round(Sl + sArr(n, 17), 2)
          If Sl > Dm Then
            k = k + 1
            If k = ik Then Res(k, 10) = Sl - Dm Else Res(k, 10) = sArr(n, 17)
            Vuot = Vuot + Res(k, 10)
            Res(k, 11) = sArr(n, 5)
            Res(k, 12) = Res(k, 11) * 1500
            Res(k, 13) = Res(k, 10) * Res(k, 12)
            TT = TT + Res(k, 13)
          End If
        Next n
      End If
    Next i
    Set Dic = Nothing
   
    Application.ScreenUpdating = False
    i = .Range("I" & Rows.Count).End(xlUp).Row
    If i > 9 Then .Range("A10:O" & i).Clear
    If k > 0 Then
      Rng.Interior.ColorIndex = 36
      Rng.Font.Bold = True
      Set Rng = Nothing
      .Range("A10:M10").Resize(k) = Res
      .Range("A10").Resize(k, 15).Borders.LineStyle = 1
      .Range("A10").Resize(k, 15).Borders(xlInsideHorizontal).Weight = xlHairline
      .Range("C10:D10").Resize(k).Borders(xlInsideVertical).LineStyle = xlNone
    End If
    Application.ScreenUpdating = True
  End With
End Sub
Code chạy như mong đợi của em rồi ạ!.
Em xin cảm ơn các anh, chị, các ban đã quan tâm và giúp em. Em xin cảm ạ!.
 
Upvote 0
Web KT

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

Back
Top Bottom