Cần rút số dư của một cột và tính tổng bằng VBA

Liên hệ QC

ducmagic88

Thành viên chính thức
Tham gia
14/4/20
Bài viết
65
Được thích
4
Em chào các bác, hiện tại em đang tạo một file công nợ. Em đang bị vướng chỗ rút số dư không biết nên code thế nào cho đúng và làm sao để tính tổng bằng VBA. Các bác giúp em với ạ! Em cảm ơn nhiều!
Nếu các bác thấy code còn rườm rà chỗ nào thì sửa giúp em với ạ ^^!
 

File đính kèm

  • Cong_No_131.xlsm
    2.2 MB · Đọc: 22
Sau dòng lệnh
Thoat:
bạn thêm dòng lệnh này để biết bạn đang vướng lỗi gì cái đã
Mã:
38    If Err Then MsgBox Error(), , Err
(Đó đang là lỗi có mã 424, phải không?)
Tiếp theo là chu trình tìm dòng lệnh bị lỗi; 1 cách nhanh nhất sẽ là
a./ Bạn đánh số cho các dòng lệnh cách nhau 5 dòng lệnh theo thứ tự tăng dần
& tiến hành sửa lại lệnh vừa thêm có nội dung như dau:
PHP:
38    If Err Then MsgBox Error(), , Erl
Sau khi chạy macro ta sẽ biết sau dòng lệnh nào là đang lỗi;

(Giả dụ đang báo lỗi ở Erl = 4
Thì từ 4 đến dòng đánh số 5 ta lại thêm với cách đánh hàng chục như 40, 41,42, 43,44
& chạy lại macro để biết cụ thể dòng nào đang sai)

Tìm cách sửa sai của mình & nếu chưa sửa được thì 'kêu' tiếp!

(húc thành công!
 
Upvote 0
Em chào các bác, hiện tại em đang tạo một file công nợ. Em đang bị vướng chỗ rút số dư không biết nên code thế nào cho đúng và làm sao để tính tổng bằng VBA. Các bác giúp em với ạ! Em cảm ơn nhiều!
Nếu các bác thấy code còn rườm rà chỗ nào thì sửa giúp em với ạ ^^!
Chạy code
Mã:
Option Compare Text

Sub XYZ()
  Dim sArr(), Res(), KhachHang$
  Dim sRow&, sRow_1&, i&, k&

  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  With Sheets("DATA")
    sArr = .range("B2:K" & .range("E65000").End(xlUp).row).Value
  End With
  sRow = UBound(sArr)
  ReDim Res(0 To sRow, 1 To 8)
 
  With Sheets("CHI_TIET_131")
    .range("A6:H100000").ClearContents
    KhachHang = .range("C1").Value
    If KhachHang = Empty Then
      MsgBox "Khong ton tai ten khach hang!", vbSystemModal, "Thông báo"
      Application.Calculation = xlCalculationAutomatic
      Application.ScreenUpdating = True
      Exit Sub
    End If
    Res(0, 2) = .range("B5").Value
    Res(0, 7) = .range("G5").Value
    Res(0, 8) = Res(0, 7)
  End With
 
  For i = 1 To sRow
    If sArr(i, 4) Like KhachHang Then
      k = k + 1
      Res(k, 1) = sArr(i, 1)
      Res(k, 2) = sArr(i, 3)
      Res(k, 3) = sArr(i, 10)
      Res(k, 4) = sArr(i, 8)
      Res(k, 5) = sArr(i, 7)
      Res(k, 6) = sArr(i, 9)
      Res(k, 7) = Res(k, 3) - Res(k, 4) - Res(k, 5) - Res(k, 6)
      Res(k, 8) = Res(k - 1, 8) + Res(k, 7)
    End If
  Next i
  If k Then
    For i = 1 To k
      For j = 3 To 7
        Res(k + 1, j) = Res(k + 1, j) + Res(i, j)
      Next j
    Next i
    With Sheets("CHI_TIET_131")
      .range("A5").Resize(k + 2, 8).Value = Res
      .range("C5").Resize(k + 2, 6).NumberFormat = "#,##0_);[Red](#,##0)"
      .range("A5").Resize(k + 2, 8).Borders.LineStyle = 1
      .range("A5").Resize(k + 2, 8).Borders(xlInsideHorizontal).Weight = xlHairline
    End With
    MsgBox ("Lay du lieu thanh cong!")
  Else
    MsgBox "Khong ton tai ten khach hang!", vbSystemModal, "Thông báo"
  End If
  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True
End Sub
 
Upvote 0
Sau dòng lệnh
Thoat:
bạn thêm dòng lệnh này để biết bạn đang vướng lỗi gì cái đã
Mã:
38    If Err Then MsgBox Error(), , Err
(Đó đang là lỗi có mã 424, phải không?)
Tiếp theo là chu trình tìm dòng lệnh bị lỗi; 1 cách nhanh nhất sẽ là
a./ Bạn đánh số cho các dòng lệnh cách nhau 5 dòng lệnh theo thứ tự tăng dần
& tiến hành sửa lại lệnh vừa thêm có nội dung như dau:
PHP:
38    If Err Then MsgBox Error(), , Erl
Sau khi chạy macro ta sẽ biết sau dòng lệnh nào là đang lỗi;

(Giả dụ đang báo lỗi ở Erl = 4
Thì từ 4 đến dòng đánh số 5 ta lại thêm với cách đánh hàng chục như 40, 41,42, 43,44
& chạy lại macro để biết cụ thể dòng nào đang sai)

Tìm cách sửa sai của mình & nếu chưa sửa được thì 'kêu' tiếp!

(húc thành công!
đang lỗi ở dòng này phải không bác ơi: "kq(k, 8) = kq(k, 7) + arr(k, 8).Offset(k - 1).Value", dòng này là dòng lấy số dư mà do em code sai dòng này nhưng đang để lại cho các bác xem dòng này sai gì nên code bị lỗi ạ
 
Upvote 0
Chạy code
Mã:
Option Compare Text

Sub XYZ()
  Dim sArr(), Res(), KhachHang$
  Dim sRow&, sRow_1&, i&, k&

  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  With Sheets("DATA")
    sArr = .range("B2:K" & .range("E65000").End(xlUp).row).Value
  End With
  sRow = UBound(sArr)
  ReDim Res(0 To sRow, 1 To 8)

  With Sheets("CHI_TIET_131")
    .range("A6:H100000").ClearContents
    KhachHang = .range("C1").Value
    If KhachHang = Empty Then
      MsgBox "Khong ton tai ten khach hang!", vbSystemModal, "Thông báo"
      Application.Calculation = xlCalculationAutomatic
      Application.ScreenUpdating = True
      Exit Sub
    End If
    Res(0, 2) = .range("B5").Value
    Res(0, 7) = .range("G5").Value
    Res(0, 8) = Res(0, 7)
  End With

  For i = 1 To sRow
    If sArr(i, 4) Like KhachHang Then
      k = k + 1
      Res(k, 1) = sArr(i, 1)
      Res(k, 2) = sArr(i, 3)
      Res(k, 3) = sArr(i, 10)
      Res(k, 4) = sArr(i, 8)
      Res(k, 5) = sArr(i, 7)
      Res(k, 6) = sArr(i, 9)
      Res(k, 7) = Res(k, 3) - Res(k, 4) - Res(k, 5) - Res(k, 6)
      Res(k, 8) = Res(k - 1, 8) + Res(k, 7)
    End If
  Next i
  If k Then
    For i = 1 To k
      For j = 3 To 7
        Res(k + 1, j) = Res(k + 1, j) + Res(i, j)
      Next j
    Next i
    With Sheets("CHI_TIET_131")
      .range("A5").Resize(k + 2, 8).Value = Res
      .range("C5").Resize(k + 2, 6).NumberFormat = "#,##0_);[Red](#,##0)"
      .range("A5").Resize(k + 2, 8).Borders.LineStyle = 1
      .range("A5").Resize(k + 2, 8).Borders(xlInsideHorizontal).Weight = xlHairline
    End With
    MsgBox ("Lay du lieu thanh cong!")
  Else
    MsgBox "Khong ton tai ten khach hang!", vbSystemModal, "Thông báo"
  End If
  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True
End Sub
Em cảm ơn bác, em sử dụng được code của bác rồi ^^ mà chỉ còn chỗ co dãn các dòng kẻ cho vừa với dữ liệu nữa bác có thể giúp em được không ạ?
 
Upvote 0
Em cảm ơn bác, em sử dụng được code của bác rồi ^^ mà chỉ còn chỗ co dãn các dòng kẻ cho vừa với dữ liệu nữa bác có thể giúp em được không ạ?
Bạn thêm 02 dòng dưới đây:
Mã:
.range("C4").Resize(k + 2, 6).Columns.AutoFit
      ActiveWindow.DisplayGridlines = False
phía sau dòng lệnh:
Mã:
      .range("A5").Resize(k + 2, 8).Borders(xlInsideHorizontal).Weight = xlHairline
thử xem nhé !
 
Upvote 0
đang lỗi ở dòng này phải không bác ơi: "kq(k, 8) = kq(k, 7) + arr(k, 8).Offset(k - 1).Value", dòng này là dòng lấy số dư mà do em code sai dòng này nhưng đang để lại cho các bác xem dòng này sai gì nên code bị lỗi ạ
Về tổng quát, dòng lệnh này là 1 phép cọng đại số :
A = B + C
Để tìm chổ sai, bạn thử thay lần lượt các biến đó trở thành các trị cụ thể xem lần thay nào báo lỗi.

Bạn nên tự tập cho mình cách tự tìm ra lỗi; /(hi ý mới nhớ lâu thì phải.
 
Upvote 0
Về tổng quát, dòng lệnh này là 1 phép cọng đại số :
A = B + C
Để tìm chổ sai, bạn thử thay lần lượt các biến đó trở thành các trị cụ thể xem lần thay nào báo lỗi.

Bạn nên tự tập cho mình cách tự tìm ra lỗi; /(hi ý mới nhớ lâu thì phải.
Em hoàn chỉnh ở đây rồi, bác có thể giúp em xem tại sao file của em lại nặng như vậy được không ạ, em không hiểu sao lại nặng đến thế!
 

File đính kèm

  • FILE_CONG_NO.xlsm
    4.7 MB · Đọc: 12
Upvote 0
Em hoàn chỉnh ở đây rồi, bác có thể giúp em xem tại sao file của em lại nặng như vậy được không ạ, em không hiểu sao lại nặng đến thế!
Mình không thể giúp bạn chuyện file nặng nhẹ được rồi: Mình không có cân tiểu li!
 
Upvote 0

File đính kèm

  • FILE_CONG_NO.xlsm
    75.6 KB · Đọc: 6
Upvote 0
Bác ơi, bác chỉ cho em cách làm giảm dung lượng thế này được không ạ, file của em dính gì mà dung lương tăng cao vậy ạ
Bạn chọn sheet: "CHI_TIET_131" rồi bấm phím Ctrl + End => bạn xóa hết các dòng thừa này cho tới dòng cuối của dữ liệu thực tế mà bạn có.
Rồi bạn làm tương tự cho 2 sheet còn lại.
Xong lưu lại file và ra kiểm tra kết quả sẽ thấy dung lượng file bạn giảm đáng kể.
 
Upvote 0
Bạn chọn sheet: "CHI_TIET_131" rồi bấm phím Ctrl + End => bạn xóa hết các dòng thừa này cho tới dòng cuối của dữ liệu thực tế mà bạn có.
Rồi bạn làm tương tự cho 2 sheet còn lại.
Xong lưu lại file và ra kiểm tra kết quả sẽ thấy dung lượng file bạn giảm đáng kể.
Em cảm ơn bác, đúng là như vậy bác ạ
 
Upvote 0
Bác ơi, bác chỉ cho em cách làm giảm dung lượng thế này được không ạ, file của em dính gì mà dung lương tăng cao vậy ạ

Hãy thử Move or Copy từng Sheet của bạn ra new workbook Khác và save lại bạn sẽ thấy sheet nào của bạn chiếm nhiều dung lượng nhất. sau đó bạn hãy xem dữ liệu từng sheet và nếu có thể hãy format lại hạn chế định dạng màu sắc và nếu đã biết 1 chút VBA nên sử dụng VBA thay thế cho các hàm sử dụng trong cells. . bước cuối cùng khi xác định được vùng dữ liệu hãy xóa Rows và Colums không sử dụng tới. bằng cách Ctrl+Shift + Mũi tên và Delete đi là được.

:friends::friends::friends:
Thực ra thì tôi cũng mới tập làm quen với excel được hơn 3 tháng nay.Do hay mò linh tinh nên suy cũng ngẫm ra 1 số điều. Toàn phải lên diễn đàn này học hỏi chứ cũng không ai dạy. Mong muốn nếu có gì hay mọi người chia sẻ để học hỏi thêm .
 
Upvote 0
Hãy thử Move or Copy từng Sheet của bạn ra new workbook Khác và save lại bạn sẽ thấy sheet nào của bạn chiếm nhiều dung lượng nhất. sau đó bạn hãy xem dữ liệu từng sheet và nếu có thể hãy format lại hạn chế định dạng màu sắc và nếu đã biết 1 chút VBA nên sử dụng VBA thay thế cho các hàm sử dụng trong cells. . bước cuối cùng khi xác định được vùng dữ liệu hãy xóa Rows và Colums không sử dụng tới. bằng cách Ctrl+Shift + Mũi tên và Delete đi là được.

:friends::friends::friends:
Thực ra thì tôi cũng mới tập làm quen với excel được hơn 3 tháng nay.Do hay mò linh tinh nên suy cũng ngẫm ra 1 số điều. Toàn phải lên diễn đàn này học hỏi chứ cũng không ai dạy. Mong muốn nếu có gì hay mọi người chia sẻ để học hỏi thêm .
Vâng em làm được rồi bác, em cũng mới học VBA nên giờ đang muốn tự động hóa VBA hết cho nhẹ chứ dùng hàm file chạy nặng mà hay lỗi lắm ạ
 
Upvote 0
Web KT

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

Back
Top Bottom