Nhờ anh, chị lập giúp code VBA cho dòng cộng và tổng cộng.

Liên hệ QC

hoangminh2018

Thành viên chính thức
Tham gia
31/10/18
Bài viết
58
Được thích
4
Em có file này trước đây có một anh trên diễn đàn giúp làm ra phần phát sinh.
Nhưng nay em muốn thêm vào dòng cộng và tổng cộng bằng code vba luôn (các dòng tô màu vàng), mong nhận được sự giúp đỡ của mọi người.
Code trong Module 2
Em xin cảm ơn.
 

File đính kèm

  • Bao Cao Thu Chi vba 2016 hoi.xlsm
    70 KB · Đọc: 36
Em có file này trước đây có một anh trên diễn đàn giúp làm ra phần phát sinh.
Nhưng nay em muốn thêm vào dòng cộng và tổng cộng bằng code vba luôn (các dòng tô màu vàng), mong nhận được sự giúp đỡ của mọi người.
Code trong Module 2
Em xin cảm ơn.
Chạy code
Mã:
Sub GPE()
  Dim i As Long, ik As Long, d As Long, sRow As Long
  Dim sArr(), tArr(), Res(), dic As Object, iKey As String
  Dim eDate As Long, fDate As Long, Ngay As Long

  Set dic = CreateObject("Scripting.dictionary")
  With Sheets("NhapLieu")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox "khong co du lieu": Exit Sub
    sArr = .Range("B3:I" & i).Value
  End With
  With Sheets("THTien")
    fDate = CLng(.Range("D7").Value)
    eDate = CLng(.Range("G7").Value)
    tArr = .Range("B11:E" & .Range("B" & Rows.Count).End(xlUp).Row + 1).Value
    sRow = UBound(tArr)
  End With
  ReDim Res(1 To sRow + 1, 1 To 5)
  For i = 1 To sRow - 1
    iKey = tArr(i, 1)
    If Len(iKey) > 0 Then
      dic.Add iKey, i
      Res(i, 1) = tArr(i, 4): Res(i, 2) = tArr(i, 4): Res(i, 5) = tArr(i, 4)
    End If
  Next i
  For i = 1 To UBound(sArr)
    ik = dic.Item(sArr(i, 8))
    If ik > 0 Then
      If IsDate(sArr(i, 1)) Then
        Ngay = CLng(sArr(i, 1))
        If Len(sArr(i, 2)) > 0 Then d = 1 Else d = -1
        If Ngay < fDate Then
          Res(ik, 2) = Res(ik, 2) + sArr(i, 7) * d
          Res(ik, 5) = Res(ik, 5) + sArr(i, 7) * d
        ElseIf Ngay <= eDate Then
          Res(ik, 5) = Res(ik, 5) + sArr(i, 7) * d
          Res(ik, (7 - d) / 2) = Res(ik, (7 - d) / 2) + sArr(i, 7)
        End If
      End If
    End If
  Next i
  For i = sRow To 1 Step -1
    If Len(tArr(i, 1)) = 0 Then
      ik = i
    Else
      For d = 1 To 5
        If Len(Res(i, d)) > 0 Then
          Res(ik, d) = Res(ik, d) + Res(i, d)
          Res(sRow + 1, d) = Res(sRow + 1, d) + Res(i, d)
        End If
      Next d
    End If
  Next i
  Sheets("THTien").Range("E11").Resize(sRow + 1, 5) = Res
End Sub
 
Upvote 0
Chạy code
Mã:
Sub GPE()
  Dim i As Long, ik As Long, d As Long, sRow As Long
  Dim sArr(), tArr(), Res(), dic As Object, iKey As String
  Dim eDate As Long, fDate As Long, Ngay As Long

  Set dic = CreateObject("Scripting.dictionary")
  With Sheets("NhapLieu")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox "khong co du lieu": Exit Sub
    sArr = .Range("B3:I" & i).Value
  End With
  With Sheets("THTien")
    fDate = CLng(.Range("D7").Value)
    eDate = CLng(.Range("G7").Value)
    tArr = .Range("B11:E" & .Range("B" & Rows.Count).End(xlUp).Row + 1).Value
    sRow = UBound(tArr)
  End With
  ReDim Res(1 To sRow + 1, 1 To 5)
  For i = 1 To sRow - 1
    iKey = tArr(i, 1)
    If Len(iKey) > 0 Then
      dic.Add iKey, i
      Res(i, 1) = tArr(i, 4): Res(i, 2) = tArr(i, 4): Res(i, 5) = tArr(i, 4)
    End If
  Next i
  For i = 1 To UBound(sArr)
    ik = dic.Item(sArr(i, 8))
    If ik > 0 Then
      If IsDate(sArr(i, 1)) Then
        Ngay = CLng(sArr(i, 1))
        If Len(sArr(i, 2)) > 0 Then d = 1 Else d = -1
        If Ngay < fDate Then
          Res(ik, 2) = Res(ik, 2) + sArr(i, 7) * d
          Res(ik, 5) = Res(ik, 5) + sArr(i, 7) * d
        ElseIf Ngay <= eDate Then
          Res(ik, 5) = Res(ik, 5) + sArr(i, 7) * d
          Res(ik, (7 - d) / 2) = Res(ik, (7 - d) / 2) + sArr(i, 7)
        End If
      End If
    End If
  Next i
  For i = sRow To 1 Step -1
    If Len(tArr(i, 1)) = 0 Then
      ik = i
    Else
      For d = 1 To 5
        If Len(Res(i, d)) > 0 Then
          Res(ik, d) = Res(ik, d) + Res(i, d)
          Res(sRow + 1, d) = Res(sRow + 1, d) + Res(i, d)
        End If
      Next d
    End If
  Next i
  Sheets("THTien").Range("E11").Resize(sRow + 1, 5) = Res
End Sub
Dạ em chạy thử rồi, ra kết quả đúng luôn, em xin cảm ơn.
 
Upvote 0
Góp ý thêm với bạn hoangminh2018
Theo mình các ô trong vùng nhập liệu cột I của sheet NhapLieu bạn nên để chế độ DataValidation để kiểm soát việc bổ sung Mã ngân hàng, hoặc bổ sung Mã quỹ tiền mặt
Vì khi sheet NhapLieu có thêm Mã Ngân hàng hoặc mã quỹ tiền mặt mới thì bên Sheet THTien không tự động cập nhập mà User phải có 1 bước Insert thêm dòng, khi đó code mới chạy tổng cho dòng mã mới đó.
Vậy nên Nếu không có 1 DataValidation List để kiểm soát Mã ngân hàng, hoặc Mã quỹ tiền mặt thì có thể sẽ bị sót khi tổng cộng
 
Upvote 0
Góp ý thêm với bạn hoangminh2018
Theo mình các ô trong vùng nhập liệu cột I của sheet NhapLieu bạn nên để chế độ DataValidation để kiểm soát việc bổ sung Mã ngân hàng, hoặc bổ sung Mã quỹ tiền mặt
Vì khi sheet NhapLieu có thêm Mã Ngân hàng hoặc mã quỹ tiền mặt mới thì bên Sheet THTien không tự động cập nhập mà User phải có 1 bước Insert thêm dòng, khi đó code mới chạy tổng cho dòng mã mới đó.
Vậy nên Nếu không có 1 DataValidation List để kiểm soát Mã ngân hàng, hoặc Mã quỹ tiền mặt thì có thể sẽ bị sót khi tổng cộng
Cảm ơn anh đã cho em ý kiến ạ.
 
Upvote 0
Cảm ơn anh đã cho em ý kiến ạ.
Xem thử cái này nhé (tất cả vẫn là của bạn đấy thôi)
Code Tổng hợp dữ liệu về sheet THTien là của anh HieuCD
Mình chỉ bổ sung thêm datavalidation và 1 chút để kiểm soát danh sách Mã và cập nhập mã sang sheet tổng hợp
 

File đính kèm

  • Form Bao Cao Thu Chi vba GPE.xlsm
    78.2 KB · Đọc: 6
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom