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 (2 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
    Lần chỉnh sửa cuối:
    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

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

    Back
    Top Bottom