Cộng theo loại

  • Thread starter Thread starter chibi
  • Ngày gửi Ngày gửi
Liên hệ QC

chibi

Thành viên tích cực
Thành viên danh dự
Tham gia
10/1/07
Bài viết
1,120
Được thích
623
Chào các bạn, hôm nay tìm mãi chẳng thấy "Trung tâm giải thích code" nằm chỗ nào nên đành đăng bài tại đây, mong các bạn giúp đỡ.
Có bảng dữ liệu gồm 2 cột: Loại (cột A), Tiền (cột B). Dòng 1 là tiêu đề, từ dòng 2 là số liệu được nhập liên tiếp, đã được sắp xếp theo "Loại".
Tôi muốn thêm các dòng tổng cộng sau mỗi loại và đã sử dụng
Mã:
Option Explicit
Sub vidu()
Dim dong_, loai_, tongtien_
dong_ = 2
loai_ = Range("A" & dong_).Value
Do While Len(Range("A" & dong_).Value) > 0
  tongtien_ = tongtien_ + Range("B" & dong_).Value
  If Range("A" & dong_).Value <> loai_ Then
    Rows(dong_).Insert
    Range("A" & dong_).Value = " Total " & loai_
    Range("B" & dong_).Value = tongtien_
    tongtien_ = 0
    dong_ = dong_ + 1
    loai_ = Range("A" & dong_).Value
  End If
  dong_ = dong_ + 1
Loop
Range("A" & dong_).Value = " Total " & loai_
Range("B" & dong_).Value = tongtien_
End Sub
Nhưng kết quả ra không đúng, xin các bạn trợ giúp.
 
Bạn nên gửi CSDL mẫu để mọi người test, chứ chỉ mỗi code không thì là đánh đố người khác rồi.
 
Upvote 0
Cũng đoạn code của pác nhưng em làm sửa vầy được không pác nhở-0-/.
Mã:
Option Explicit
Sub vidu()
Dim dong_, loai_, tongtien_
dong_ = 2
loai_ = Range("A" & dong_).Value
Do While Len(Range("A" & dong_).Value) > 0
  tongtien_ = tongtien_ + Range("B" & dong_).Value
  If Range("A" & dong_).Value <> loai_ Then
    Rows(dong_).Insert
    Range("A" & dong_).Value = " Total " & loai_
 
    Range("B" & dong_).FormulaR1C1 = _
        "=SUMPRODUCT(((R2C1:R" & dong_ - 1 & "C1)=R[-1]C1)*(R2C2:R" & dong_ - 1 & "C2))"
    Range("B" & dong_).Value = Range("B" & dong_).Value
    tongtien_ = 0
    dong_ = dong_ + 1
    loai_ = Range("A" & dong_).Value
  End If
  dong_ = dong_ + 1
Loop
Range("A" & dong_).Value = " Total " & loai_
Range("B" & dong_).FormulaR1C1 = _
        "=SUMPRODUCT(((R2C1:R" & dong_ - 1 & "C1)=R[-1]C1)*(R2C2:R" & dong_ - 1 & "C2))"
Range("B" & dong_).Value = Range("B" & dong_).Value
End Sub
 
Upvote 0
Cảm ơn darkmoon, mình không muốn đưa công thức vào ô.
Và mình gửi file ví dụ để mọi người giúp đỡ.
 

File đính kèm

Upvote 0
Nếu chỉ là cộng theo loại theo tôi cần gì phải dùng tới VBA, chỉ cần dùng SUBTOTAL là được mà(Chọn A1:B100 tuỳ dữ liệu trong File, Vào Data/Subtotals, mở hộp thoại,Combo trên cùng chọn Loại, Com bo giửa chọn Sum, Add Subtotal to Chọn Tiền, đánh dấu vào Replace... và Summary..., kích OK ==> Xem kết quả
 
Upvote 0
chibi đã viết:
Chào các bạn, hôm nay tìm mãi chẳng thấy "Trung tâm giải thích code" nằm chỗ nào nên đành đăng bài tại đây, mong các bạn giúp đỡ.
Có bảng dữ liệu gồm 2 cột: Loại (cột A), Tiền (cột B). Dòng 1 là tiêu đề, từ dòng 2 là số liệu được nhập liên tiếp, đã được sắp xếp theo "Loại".
Tôi muốn thêm các dòng tổng cộng sau mỗi loại và đã sử dụng
Mã:
Option Explicit
Sub vidu()
Dim dong_, loai_, tongtien_
dong_ = 2
loai_ = Range("A" & dong_).Value
Do While Len(Range("A" & dong_).Value) > 0
  tongtien_ = tongtien_ + Range("B" & dong_).Value
  If Range("A" & dong_).Value <> loai_ Then
    Rows(dong_).Insert
    Range("A" & dong_).Value = " Total " & loai_
    Range("B" & dong_).Value = tongtien_
    tongtien_ = 0
    dong_ = dong_ + 1
    loai_ = Range("A" & dong_).Value
  End If
  dong_ = dong_ + 1
Loop
Range("A" & dong_).Value = " Total " & loai_
Range("B" & dong_).Value = tongtien_
End Sub
Nhưng kết quả ra không đúng, xin các bạn trợ giúp.

Đây là cách làm của tôi. Tôi thêm cho bạn việc tính tổng cuối (Grand Total)
Mã:
Sub vidu()
Dim dong_, loai_, tongtien_
Dim fDone As Boolean, GrandTotal_ 'Them
dong_ = 2
loai_ = Range("A" & dong_).Value
fDone = False
Do While Not fDone
  
  If Range("A" & dong_).Value <> loai_ Then
    Rows(dong_).Insert
    Range("A" & dong_).Value = " Total " & loai_
    Range("B" & dong_).Value = tongtien_
    
    GrandTotal_ = GrandTotal_ + tongtien_
    
    tongtien_ = 0
    dong_ = dong_ + 1
    loai_ = Range("A" & dong_).Value
    
    If IsEmpty(Range("A" & dong_ + 1).Value) Then
        fDone = True
    End If
    
  End If
  tongtien_ = tongtien_ + Range("B" & dong_).Value
  dong_ = dong_ + 1
  
Loop

'Them Grand Total
dong_ = dong_ - 1

Range("A" & dong_).Value = " Grand Total "
Range("B" & dong_).Value = GrandTotal_

End Sub
 

File đính kèm

Upvote 0
Bạn Chibi có thể xem lại thử đoạn code sau đây:
Option Explicit
Sub vidu()
Dim dong_, loai_, tongtien_
dong_ = 2
loai_ = Range("A" & dong_).Value
Do While Len(Range("A" & dong_).Value) > 0
If Range("A" & dong_).Value <> loai_ Then
Rows(dong_).Insert
Range("A" & dong_).Value = " Total " & loai_
Range("B" & dong_).Value = tongtien_
tongtien_ = 0
dong_ = dong_ + 1
loai_ = Range("A" & dong_).Value
End If
tongtien_ = tongtien_ + Range("B" & dong_).Value
dong_ = dong_ + 1
Loop
Range("A" & dong_).Value = " Total " & loai_
Range("B" & dong_).Value = tongtien_
End Sub
 
Upvote 0
chibi đã viết:
Cảm ơn darkmoon, mình không muốn đưa công thức vào ô.
Và mình gửi file ví dụ để mọi người giúp đỡ.
Mã:
Sub vidu()
Dim dong_, loai_, tongtien_
dong_ = 2
loai_ = Range("A" & dong_).Value
Do While Len(Range("A" & dong_).Value) > 0
  If Range("A" & dong_).Value <> loai_ Then
    Rows(dong_).Insert
    Range("A" & dong_).Value = " Total " & loai_
    Range("B" & dong_).Value = tongtien_
    tongtien_ = 0
    dong_ = dong_ + 1
    loai_ = Range("A" & dong_).Value
  End If
[B]  tongtien_ = tongtien_ + Range("B" & dong_).Value[/B]
  dong_ = dong_ + 1
Loop
Range("A" & dong_).Value = " Total " & loai_
Range("B" & dong_).Value = tongtien_
End Sub
Chibi thử lại xem sao nhé

TDN
 
Upvote 0
Web KT

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

Back
Top Bottom