Tính tổng có điều kiện

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

ZzNHCzZ

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
8/5/08
Bài viết
166
Được thích
44
Nghề nghiệp
Hàng Không
Xin chào anh chị!
Em có bài toán rất đơn giản. Có thể sử dụng công thức Sumif() sẽ cho kết quả ngay. Nhưng vì dữ liệu quá nhiều và sum nhiều cột nên file chạy chậm quá.
Vậy em xin anh chị đoạn code macro để file chạy nhanh hơn ạ.

Em cám ơn nhiều
Thân!
 
Lần chỉnh sửa cuối:
Xin chào anh chị!
Em có bài toán rất đơn giản. Có thể sử dụng công thức Sumif() sẽ cho kết quả ngay. Nhưng vì dữ liệu quá nhiều và sum nhiều cột nên file chạy chậm quá.
Vậy em xin anh chị đoạn code macro để file chạy nhanh hơn ạ.

Em cám ơn nhiều
Thân!
Gợi ý:
- Nếu bên sheet Data bạn đặt công thức SUBTOTAL(109,....) lên trên dòng đầu, sau đó AutoFilter ngày 16/9/2008 thì bạn sẽ có được TỔNG của riêng ngày 16/9/2008 thôi, đúng không?
- Vậy bạn hãy tạo 1 macro, nó sẽ lần lượt Autofilter (theo ngày tháng ở cột A, sheet KQ)... tiếp theo lấy kết quả tính SUBTOTAL ở dòng đầu sheet Data và paste sang sheet KQ theo từng dòng (hết dòng này đến dòng kia)
Tôi nghĩ cũng không khó lắm đâu... Nếu bạn làm bằng tay được thì macro là tương tự
Ghi chú: Dòng SUBTOTAL này và Data nên cách nhau ít nhất 1 dòng để việc định vị range được dể dàng hơn
 
Upvote 0
Gợi ý:
- Nếu bên sheet Data bạn đặt công thức SUBTOTAL(109,....) lên trên dòng đầu, sau đó AutoFilter ngày 16/9/2008 thì bạn sẽ có được TỔNG của riêng ngày 16/9/2008 thôi, đúng không?
- Vậy bạn hãy tạo 1 macro, nó sẽ lần lượt Autofilter (theo ngày tháng ở cột A, sheet KQ)... tiếp theo lấy kết quả tính SUBTOTAL ở dòng đầu sheet Data và paste sang sheet KQ theo từng dòng (hết dòng này đến dòng kia)
Tôi nghĩ cũng không khó lắm đâu... Nếu bạn làm bằng tay được thì macro là tương tự
Ghi chú: Dòng SUBTOTAL này và Data nên cách nhau ít nhất 1 dòng để việc định vị range được dể dàng hơn

thêm một điều là : copy sang sheet mới -> thì lấy giá trị thôi,
số liệu thay đổi thì phải chạy lại macro
 
Upvote 0
thêm một điều là : copy sang sheet mới -> thì lấy giá trị thôi,
số liệu thay đổi thì phải chạy lại macro
Đương nhiên, nhưng đã là Data thì cũng hiếm khi có công thức lắm
Làm cho bạn luôn đây:
PHP:
Private Sub Worksheet_Activate()
 Dim Src As Range, Des As Range, Clls As Range
 Set Src = Sheet1.Range("A3:A" & Sheet1.[N65536].End(xlUp).Row)
 [A2:J20000].ClearContents
 Src.Resize(, 1).AdvancedFilter Action:=2, CopyToRange:=[A1], Unique:=True
 Set Des = [A1].CurrentRegion.Offset(1).SpecialCells(2, 23)
 For Each Clls In Des.Resize(, 1)
    Src.AutoFilter Field:=1, Criteria1:=Clls.Value
    Sheet1.[A1:N1].SpecialCells(3, 1).Copy Destination:=Clls.Offset(, 1)
 Next
 Sheet1.AutoFilterMode = False
End Sub
 

File đính kèm

Upvote 0
Xin chào anh chị!
Em có bài toán rất đơn giản. Có thể sử dụng công thức Sumif() sẽ cho kết quả ngay. Nhưng vì dữ liệu quá nhiều và sum nhiều cột nên file chạy chậm quá.
Vậy em xin anh chị đoạn code macro để file chạy nhanh hơn ạ.

Em cám ơn nhiều
Thân!

Mã:
Sub TongHop()
Dim RgDate As Range, RgName As Range
Dim MyName As String, r As Long, c As Long, rc As Long, cc As Long, rDt As Long, cName As Long
rDt = Sheets("Data").Cells(1, 1).End(xlDown).Row
Set RgDate = Range(Sheets("Data").Cells(2, 1), Sheets("Data").Cells(rDt, 1))
Set RgName = Range(Sheets("Data").Cells(1, 1), Sheets("Data").Cells(1, 256))
Sheets("KQ").Select
cc = Cells(1, 1).End(xlToRight).Column
rc = Cells(1, 1).End(xlDown).Row
Range(Cells(2, 2), Cells(rc + 1, cc)).ClearContents
For c = 2 To cc
  MyName = Sheets("KQ").Cells(1, c)
  For r = 2 To rc
    MyDate = Sheets("KQ").Cells(r, 1)
    cName = Application.WorksheetFunction.Match(MyName, RgName, 0)
    Sheets("KQ").Cells(r, c) = Application.WorksheetFunction.SumIf(RgDate, MyDate, Range(Sheets("Data").Cells(2, cName), Sheets("Data").Cells(rDt, cName)))
  Next
Next
Set RgDate = Nothing
Set RgName = Nothing
End Sub
Lưu ý: ngày tháng bạn nhập phải là ngày (không có giờ) mới chạy được. Không hiểu sao file bạn gởi ngày nhập ở sheet DATA đều có dạng 16/09/2008 09:05:00 AM, hàm SUMIF không cộng đúng được.
 
Upvote 0
Đương nhiên, nhưng đã là Data thì cũng hiếm khi có công thức lắm
Làm cho bạn luôn đây:
Có cách nào không cần SUBTOTAL không vậy anh?
Lưu ý: ngày tháng bạn nhập phải là ngày (không có giờ) mới chạy được. Không hiểu sao file bạn gởi ngày nhập ở sheet DATA đều có dạng 16/09/2008 09:05:00 AM, hàm SUMIF không cộng đúng được.
Code của anh cho giá trị 0 tất cả các cột. Anh gửi File cho em nhé

Vì được lấy ra từ 1 chương trình, nên không có công thức và date có giờ. Nên em làm 1 cột phụ để lấy date ko giờ.

Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
Có cách nào không cần SUBTOTAL không vậy anh?

Đương nhiên là được! Sau khi AutoFilter xong thì ta tính tổng từng cột, copy qua sheet KQ.. và cũng đương nhiên sẽ tốn thời gian và code sẽ dài hơn
Vụ SUM này dể mà... Tôi nghĩ bạn làm được (nếu không muốn SUBTOTAL)
 
Upvote 0
Web KT

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

Back
Top Bottom