Hỏi về cách viết code để tự động tính tổng? (1 người xem)

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

Người dùng đang xem chủ đề này

anhbin

Thành viên mới
Tham gia
12/7/07
Bài viết
2
Được thích
0
Hi các bác, em muốn tìm đến dòng cuối cùng của 1 tài liệu trong excel đê ở tại dòng đó em có thể tính được tổng (Sum()) của toàn bộ dữ liệu ở phần phía trên.
note: ví dụ tài liệu của em có 2 hàng A(1,1) đến B(2,2), bây giờ em muốn viết code để tự động tính được và in tổng SUM tại vị trí B(3,3) và tương tự cho các phần khác tiếp theo ở phía bên dưới.
Em mong các bác giúp em với ah

Bài gộp:
Vâng em xin rút kinh nghiệm lần sau.
Em xin gửi file Demo.xls để các bác xem và giúp em. Em cảm ơn ạ.
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
anhbin đã viết:
Hi các bác, em muốn tìm đến dòng cuối cùng của 1 tài liệu trong excel đê ở tại dòng đó em có thể tính được tổng (Sum()) của toàn bộ dữ liệu ở phần phía trên.
note: ví dụ tài liệu của em có 2 hàng A(1,1) đến B(2,2), bây giờ em muốn viết code để tự động tính được và in tổng SUM tại vị trí B(3,3) và tương tự cho các phần khác tiếp theo ở phía bên dưới.
Em mong các bác giúp em với ah
Cái này hình như không cần viết code gì đó đâu. Làm thủ công một tý lại chính xác hơn đấy. Phần tương tự của bạn có bao gồm cả phần đã tính ở trên hay tách riêng ra?
 
Thứ nhất: bài viết phạm quy (tiêu đề ko rõ ràng)
Thứ hai: ko hiểu A(1,1), B(2,2), B(3,3) là cái gì cả
Thứ ba: Bạn post lại bài với tiêu đề thật rõ ràng (gợi ý: "Làm sao tính tổng đến cell cuối cùng có dử liệu")
Thứ tư: Nếu bạn chịu khó search trên diển đàn thì loại bài tập như vậy có rất nhiều...

Bài gộp:
Bài này cũng hơi khó, vì ko phải tìm cell cuối cùng.. mà là tìm cell rổng giửa 1 rừng dử liệu... Ở đây chỉ có 1 điểm duy nhất phải chú ý là nếu cell trong cột F và cột G là rổng thì sẽ SUM tại cột H... Tổng cuối cùng là tổng của tất cả các SUM con...
Bạn chở đi, tôi nghĩ các cao thủ sẽ có cách đấy!
ANH TUẤN
 
Chỉnh sửa lần cuối bởi điều hành viên:
Các bạn xem thử cái code này nhé:
Sub tinh_tong()
Dim x, i, kqua, tong
kqua = 0
tong = 0
i = Cells(Rows.Count, 7).End(xlUp).Row + 1
For x = 5 To i
kqua = kqua + Cells(x, 8)
If Cells(x, 6) = "" And Cells(x, 7) = "" Then
Cells(x, 8) = kqua - Cells(x, 8)
kqua = 0
tong = tong + Cells(x, 8)
End If
Next
Cells(i + 2, 8) = tong
End Sub
 
anhbin đã viết:
Vâng em xin rút kinh nghiệm lần sau.
Em xin gửi file Demo.xls để các bác xem và giúp em. Em cảm ơn ạ.

Có thể viết cho bạn 1 UF, tuy nhiên mình nghĩ bạn nên dùng hàm Subtotal thì hay hơn, vì nếu viết UF thì dữ liệu của bạn phải tuân theo những quy định nhất định.

Nhất định phải dùng VBA hả bạn ???

Thân!
 
Vâng em cảm ơn các bác ạ..
Thưa các bác, em muốn viết bằng Macro chỉ là do bởi vì bản thân trong cái file em đang tính toán em đã code bằng Macro rồi ạ, nhưng đến đoạn này em ngắc luôn ạ.
Mong các bác tiếp tục chỉ giúp ạ.
 
Cái này tui cũng gặp khi lập chương trình dự toán, phần tính đơn giá chi tiết ấy. cách của tui là: Với các tổng con thì dùng Do While ... Loop, với điều kiện là khi điều kiện Range.Value=""; thì kết thúc Do và tính Sum (số hàng để tính Sum thì căn cứ vào một biến có cấp số cộng là 1 ở trong vòng lặp Do). Với tổng chung thì điều kiện để tính là khi hai Cells (hay Range) liên tiếp đều rỗng. Còn Sum này thì bằng Sum tất tật trên xuống, chia đôi. //**/ *Trường hợp các Sum con, Sum bố đã có thì có thể căn cứ vào Formula của chúng hay Format (Italic, Bold) chẳng hạn để làm điều kiện ngừng Do While ... Loop và tính tổng. Cách này có vẻ k chính thống lắm nhưng chạy tốt phết. Kính các bác!
 
Lần chỉnh sửa cuối:
Nếu dùng công thức thì có thể làm thế này đây:
Nếu viết code bạn cũng có thể theo hướng này mà viết
ANH TUẤN
 

File đính kèm

Theo tôi nên qui hoạch lại bảng tính cho khoa học thì khỏe hơn là tìm cách giải quyết 1 bài toán lủng củng như vậy. Nhiều khi thuyết phục khách hàng hay xếp chấp nhận còn dễ hơn là làm theo cách "thửa hàng" này
 
anhtuan1066 oi! cho em nhờ tí nhé. Cách gải làm của anh em thấy rất hay nhưng anh ơi anh có thể cho kết quả đó nằm ở trên vùng mình cộng được không. Em thấy cái của Anh nó nằm ở dưới vùng được cộng. Trong bản demo của anh ở o H7 là kết quả của vùng 2 từ ô H8:H10 được ko anh. Cam ơn anh nhiều.

A moi người cho mình hỏi nếu một bảng tính mình đã lập toàn bộ công thức liên kết với nhau rồi, nhưng mình muốn không cho mọi người thấy công thức đó nhưng bản tính vẫn hoạt động bình thường như khi có công thức.

Cho mình hỏi tí nữa, làm sao cho một bảng tính khi lập công thức ở một hàng hay một cột nào đó thì toàn bộ các hàng đều có công thức giống như công thức trên kể cả khi ta chèn thêm dòng vậy. ví dụ ở ô A1 ta có công thức B1+C2 Thì toàn bộ bảng tính từ ô A1 đến ô A..... cuối cùng cũng có công thức đó kể cả khi ta chèn thêm dòng bất kỳ ở hàng nào. Nếu dùng copy xuống cũng dược nhưng khi chèn dòng bất kỳ lại copy nữa lại bất tiện lắm. Y của em là dùng để lập bảng tiên lượng dụ toan đó mà.
 
Chỉnh sửa lần cuối bởi điều hành viên:
tri_0988176716 đã viết:
Cho mình hỏi tí nữa, làm sao cho một bảng tính khi lập công thức ở một hàng hay một cột nào đó thì toàn bộ các hàng đều có công thức giống như công thức trên kể cả khi ta chèn thêm dòng vậy. ví dụ ở ô A1 ta có công thức B1+C2 Thì toàn bộ bảng tính từ ô A1 đến ô A..... cuối cùng cũng có công thức đó kể cả khi ta chèn thêm dòng bất kỳ ở hàng nào. Nếu dùng copy xuống cũng dược nhưng khi chèn dòng bất kỳ lại copy nữa lại bất tiện lắm. Y của em là dùng để lập bảng tiên lượng dụ toan đó mà.
Thay vì tại A1 gõ =B1 + C1 thì gõ =$A$1 + $B$1
Công thức này dù mang đi đâu vẩn thế
 
Sub tính tổng con cho nhiều cột ?

Khi tính tổng con cho một cột (vd cột 5) tôi dùng code
Mã:
Sub TinhTongCon()
   Dim Rcuoi As Long, TongCon As Double
    Rcuoi = Range("D65536").End(xlUp).Row

'Xoa vung cong
            For i = Rcuoi To 5 Step -1
            For j = 5 To 20
                   If Cells(i, 4) = 0 Then
                        Cells(i, j).ClearContents
                    End If
            Next: Next

'Tinh tong con
            For i = Rcuoi To 5 Step -1
            TongCon = TongCon + Cells(i, 5).Value
                   If Cells(i, 4) = 0 Then
                        Cells(i, 5).Value = TongCon:          TongCon = 0
                    End If
            Next
End Sub
Vậy tôi muốn cộng tổng con cho nhiều cột (vd cột 5, cột 6 ... cột 20) thì viết như thế nào. Dữ liệu ví dụ trong file đính kèm

Xin cảm ơn !
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Bạn đối chíếu, nếu cần hỏi thêm, sẽ có người giải đáp . . .

Vậy tôi muốn cộng tổng con cho nhiều cột (vd cột 5, cột 6 ... cột 20) thì viết như thế nào. Xin cảm ơn !
PHP:
Sub TinhTongCon()
 Dim Rcuoi As Long, TongCon As Double
 Dim Jj As Long, Ww As Byte
 Dim Rng0 As Range, Rng1 As Range

 With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
    .EnableEvents = False
    Rcuoi = Range("D65536").End(xlUp).Row
    Set Rng1 = [d6]
    Do
        If Rng1.Offset(, -1) = "" Then Exit Do
        Rng1.Resize(, 19).ClearContents
        Set Rng0 = Rng1.Offset(1).End(xlDown)
        For Ww = 1 To 18
            Rng1.Offset(, Ww).Value = .WorksheetFunction _
                .Sum(Rng1.Offset(1, Ww).Resize(Rng0.Row - Rng1.Row - 1))
        Next Ww
        Set Rng1 = Rng0.Offset(1)
    Loop
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
    .EnableEvents = True
 End With
End Sub
 
Cảm ơn bác HYen!
Em đã chạy thử, kết quả cộng luôn thiếu 1 dòng cuối, nếu bỏ -1 tại .Row - 1 trong công thức sum (dòng 2 từ For Ww = 1 To 18) thì kết quả đúng nhưng chỉ đúng với trường hợp cộng từ 2 dòng trở lên còn trường hợp cộng chỉ có 1 dòng thì không đúng.
Em chưa hiểu code lắm, đang nghiên cứu tiếp có gì em sẽ hỏi sau,
PHP:
Sub TinhTongCon()
 Dim Rcuoi As Long, TongCon As Double
 Dim Jj As Long, Ww As Byte
 Dim Rng0 As Range, Rng1 As Range

 With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
    .EnableEvents = False
    Rcuoi = Range("D65536").End(xlUp).Row
    Set Rng1 = [d6]
    Do
        If Rng1.Offset(, -1) = "" Then Exit Do
        Rng1.Resize(, 19).ClearContents
        Set Rng0 = Rng1.Offset(1).End(xlDown)
        For Ww = 1 To 18
            Rng1.Offset(, Ww).Value = .WorksheetFunction _
                .Sum(Rng1.Offset(1, Ww).Resize(Rng0.Row - Rng1.Row - 1))
        Next Ww
        Set Rng1 = Rng0.Offset(1)
    Loop
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
    .EnableEvents = True
 End With
End Sub
 
Lần chỉnh sửa cuối:
Cảm ơn bác HYen!
Em đã chạy thử, kết quả cộng luôn thiếu 1 dòng cuối, nếu bỏ -1 tại .Row - 1 trong công thức sum (dòng 2 từ For Ww = 1 To 18) thì kết quả đúng nhưng chỉ đúng với trường hợp cộng từ 2 dòng trở lên còn trường hợp cộng chỉ có 1 dòng thì không đúng.
Em chưa hiểu code lắm, đang nghiên cứu tiếp có gì em sẽ hỏi sau,
Chưa hiểu lắm cách bạn tính như thế nào ---> Nhìn kết quả và đoán như vầy:
PHP:
Sub TinhTongCon()
  Dim Clls As Range
  With Range([D6], [D65536].End(xlUp))
    .SpecialCells(4).Offset(, 1).ClearContents
    [E5] = WorksheetFunction.Sum(.Offset(, 1))
    For Each Clls In .Offset(, 1).SpecialCells(4)
      Clls = WorksheetFunction.Sum(Range(Clls.Offset(1), Clls.Offset(1).End(xlDown)))
    Next
  End With
End Sub
 
1. Tôi đã chạy thử code của Ndu, kết quả chỉ đúng với trường hợp cộng từ 2 dòng trở lên còn trường hợp dữ liệu chỉ có một dòng thì vẫn không đúng.
2. Ý tôi là muốn cộng tương tự cho các cột còn lại. Tôi gửi lại file ví dụ mong các bạn giúp đỡ.
Xin cảm ơn!
 

File đính kèm

1. Tôi đã chạy thử code của Ndu, kết quả chỉ đúng với trường hợp cộng từ 2 dòng trở lên còn trường hợp dữ liệu chỉ có một dòng thì vẫn không đúng.
2. Ý tôi là muốn cộng tương tự cho các cột còn lại. Tôi gửi lại file ví dụ mong các bạn giúp đỡ.
Xin cảm ơn!
Thì ra là vậy!
Sửa lại nè:
PHP:
Sub TinhTongConNdu()
  Dim i As Long
  With Range([D6], [D65536].End(xlUp))
    .SpecialCells(4).Offset(, 1).ClearContents
    [E5] = WorksheetFunction.Sum(.Offset(, 1))
    For i = 1 To .SpecialCells(4).Areas.Count
      .SpecialCells(4).Areas(i).Offset(, 1) = WorksheetFunction.Sum(.SpecialCells(2).Areas(i).Offset(, 1))
    Next
  End With
End Sub
Bạn Test thử xem
Xin lưu ý: Tôi dùng vòng lập quét qua các Areas ---> Như trong file của bạn, code bạn phải quét tổng cộng khoảng trên 30 lần... Code của tôi chỉ quét có 3 lần là ra ngay kết quả
 
Lần chỉnh sửa cuối:
@ Ndu: code này cộng đúng rồi nhưng mới được 1 cột thôi, tôi muốn cộng ở các cột khác thì làm thế nào ? bạn có thể làm giúp tiếp hoặc gợi ý cho tôi cách làm.
Cảm ơn nhiều!
 
Lần chỉnh sửa cuối:
@ Ndu: code này cộng đúng rồi nhưng mới cộng được 1 cột thôi
Thì bạn cứ nói rõ đi: Công những cột nào nữa?
Tại tôi xây dựng code dựa vào kết quả mà code của bạn đang chạy ---> Code ấy tôi thấy có cũng cộng có 1 cột thôi mà!
 
Cộng các cột tiếp theo trong bảng (File đính kèm bài trên), code cũ tôi chỉ biết làm cho 1 cột vì vậy đang cầu cứu code cộng cho nhiều cột. Bạn giúp tiếp nhé, cảm ơn bạn trước, tôi đang chờ trên máy.
 
Web KT

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

Back
Top Bottom