Em nhờ anh/chị/em/chú/bác giúp em viết code tổng hợp dữ liệu. em tính công thức nó nặng quá. em cám ơn (1 người xem)

Liên hệ QC

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

Tôi tuân thủ nội quy khi đăng bài

A HOANG 620

Thành viên mới
Tham gia
16/1/23
Bài viết
41
Được thích
3
1740815926368.pngEm cần thêm 1 dòng dưới các nhóm hàng giống nhau và tính tổng các cột tương ứng. em tính thủ công nên máy chạy chậm, lâu nữa. Nhờ anh chị viết code hộ giúp em tổng hợp dùng mãng cho chạy nhẹ hơn. Em tập tành học hỏi. em cám ơn
 
Dùng Pivot table, hoặc dùng chức năng Subtotal (không phải gõ hàm Subtotal)
 
Upvote 0
Cái chính là không có file thì ai mà viết code cho nổi hả chú? :D
Code chỉ cần làm phần chính (lập Subtotals) thôi. Phần còn lại cứ viết đại (xác định vùng dữ liệu), chỉnh sửa sau.

Ví dụ:
Sub dom()
Set vungDL = xác định vùng dữ liệu
vungDL.Sort ..... ' sort theo mã số (chả biết mã số có phải là mã hàng không, cứ làm đại rồi sửa sau, thiếu giống gì những thớt phải chục bài mới giải xong)
' code chính
' a là mảng dữ liệu, b là mảng kết quả
a = vungDL.Value
Redim b(1 To UBound(a)*2, 1 To UBound(a, 2)

... đọc từng dòng mảng a
... nếu mã hàng thay đổi thì ghi dòng tổng mã hàng trước
... ghi dòng mới của a vào b

... xóa vungDL
... ghi mảng b vào vungDL

End Sub

Chú: cách dễ hơn hết là ghi macro. Nhưng dĩ nhiên là thớt cố tình tránh cho nên không thèm gửi file.
 
Upvote 0
Thèm viết vba quá rồi, chứ cái này mà vba thì chỉ cần record rồi sửa vài chữ.
À mà tạo xong khi dữ liệu tăng lên phải gỡ tạo lại á anh gì ơi.
 
Upvote 0
Mình không viết được vba nhưng có ý tưởng này, các bác xem có được không nhé:

Sub tinhtong()
Dim row1 ' tong so dong hien tai
Dim row2 ' tong so dong Tinh tong
Dim i
Dim j ' dong bat dau Tinh tong
j=2
Row1 = công thức
Row2 = công thức đếm các giá trị không trùng lặp từ hàng j đến row1 (điều kiện đã sắp xếp mã hàng theo thứ tự)

For i = 3 to row1 + row2
IF Range("B"&i) <> range("B"&i-1) then
1. Chèn dòng Tổng cộng, và thực hiện công thức cho các cột, Sum từ hàng j đến i-1.
2. Gán giá trị j = i+1
Next i+2
Else
Next i
End if
End sub
Bài đã được tự động gộp:
 
Upvote 0
Mình không viết được vba nhưng có ý tưởng này, các bác xem có được không nhé:

Sub tinhtong()
Dim row1 ' tong so dong hien tai
Dim row2 ' tong so dong Tinh tong
Dim i
Dim j ' dong bat dau Tinh tong
j=2
Row1 = công thức
Row2 = công thức đếm các giá trị không trùng lặp từ hàng j đến row1 (điều kiện đã sắp xếp mã hàng theo thứ tự)

For i = 3 to row1 + row2
IF Range("B"&i) <> range("B"&i-1) then
1. Chèn dòng Tổng cộng, và thực hiện công thức cho các cột, Sum từ hàng j đến i-1.
2. Gán giá trị j = i+1
Next i+2
Else
Next i
End if
End sub
Bài đã được tự động gộp:
Hi, áp dụng thực tế không được vì lỗi. Mình chuyển sang vòng lặp nhưng code chỉ dùng 1 lần. Chưa có kiểm tra dòng Tổng cộng đã có:

Mã:
Sub Tinh_tong()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim currentRow As Long
    Dim currentItem As String
    Dim itemTotal As Double
    Dim itemRange As Range
    Dim totalRow As Range
   
    Set ws = ThisWorkbook.Sheets("Sheet1") 'La trang tinh tong
    lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
    currentRow = 2 ' Dong du lieu dau tien
   
    ' Lap qua tong mat hang và tinh tong
    Do While currentRow <= lastRow
        currentItem = ws.Cells(currentRow, 2).Value ' Cot B la Mat hang
        itemTotal = 0
       
        ' Lap qua cac hang cung mat hang
        Set itemRange = Nothing
        Do While currentRow <= lastRow And ws.Cells(currentRow, 2).Value = currentItem
            ' Cong tong cot G - gia tri can tinh
            itemTotal = itemTotal + ws.Cells(currentRow, 7).Value
            currentRow = currentRow + 1
        Loop
       
        ' Chen dong tong cong sau khi hoan thanh viec Tinh tong cho 1 mat hang
       
        Set totalRow = ws.Rows(currentRow)
        ws.Rows(currentRow).Insert Shift:=xlDown
        ws.Cells(currentRow, 2).Value = "Tong cong mat hang " & currentItem ' Chen them ten mat hang
        ws.Cells(currentRow, 7).Value = itemTotal ' Gia tri
        currentRow = currentRow + 1
        lastRow = lastRow + 1 ' Cap nhat lai dong cuoi
    Loop
   
End Sub
 
Upvote 0
Giải thuật bài #10 và #11 sai tét bét.
Mỗi lần chèn dòng thì phần dưới sẽ bị đẩy xuống. Cuối cùng sẽ xảy ra việc sử lý sót dữ liệu.
Ví dụ ban đầu có 100 dòng. Chèn dòng tổng ở vị trí 10 thì tất cả các dòng từ 10 đến 100 hiện tại bị đẩy xuống, dòng 100 trở thành 101. Vòng lặp chỉ chạy đên 100 (con số ban đầu) thì dừng mất đất.

Trên nguyên tắc:
Tất cả các vòng lặp chèn hay xóa dòng đều phải thực hiện từ dưới (dòng cuối) trở lên.
 
Upvote 0
Giải thuật bài #10 và #11 sai tét bét.
Mỗi lần chèn dòng thì phần dưới sẽ bị đẩy xuống. Cuối cùng sẽ xảy ra việc sử lý sót dữ liệu.
Ví dụ ban đầu có 100 dòng. Chèn dòng tổng ở vị trí 10 thì tất cả các dòng từ 10 đến 100 hiện tại bị đẩy xuống, dòng 100 trở thành 101. Vòng lặp chỉ chạy đên 100 (con số ban đầu) thì dừng mất đất.

Trên nguyên tắc:
Tất cả các vòng lặp chèn hay xóa dòng đều phải thực hiện từ dưới (dòng cuối) trở lên.
Bài #10 thì sai ko viết được, còn bài 11 mình test thử thấy vẫn đúng, có dòng code cập nhật dòng cuối sau khi chèn hàng rồi.
 
Upvote 0
View attachment 307351Em cần thêm 1 dòng dưới các nhóm hàng giống nhau và tính tổng các cột tương ứng. em tính thủ công nên máy chạy chậm, lâu nữa. Nhờ anh chị viết code hộ giúp em tổng hợp dùng mãng cho chạy nhẹ hơn. Em tập tành học hỏi. em cám ơn
Có mỗi cái file giả định mà cũng không đăng lên được thì bạn muốn học hành, tập tành gì?Hay là bạn muốn người khác tạo sãn file và code sẵn cho?
Bài #10 thì sai ko viết được, còn bài 11 mình test thử thấy vẫn đúng, có dòng code cập nhật dòng cuối sau khi chèn hàng rồi.
Bạn đã tính đến trường họp dữ liệu lộn sộn không phải là hết AA1, sau đó đến AA2 mà là đang AA1 rồi lại đến AA10 rồi lại AA5, rồi lại AA20,...Rồi mới đến AA1,....thì bạn chèn thêm dòng và ghi số tổng cộng vào liệu có hợp lý không?
Để giải bài này giải pháp của tôi là:
Dữ liệu lộn sộn và không có dòng tổng cổng của từng mặt hàng.
dùng vòng lặp for i= 2 to cuối
Dùng 1 dic để tổng cộng theo từng key (key=Mã số) : Res(t,1)=Res(t,1)+Arr(i,3)....:Range("I"&i)=t
dùng 1 cột phụ để ghi lại các dòng theo key: Range("I"&i)=t
Hết vòng lặp gán kết quả xuống sheet (Ngay sau dòng cuối) : Range("A"&dòng cuối).resize(t,...)=Res
Sort theo cột I
kết thúc.
Nếu dữ liệu có cột số thứ tự thì có thể khôi phục lại nguyên gốc (sort theo cột Số TT).
 
Upvote 0
Web KT

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

Back
Top Bottom