Nhờ viết cod tính tổng khi nhập cùng mã

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

lp0072021

Thành viên chính thức
Tham gia
23/8/22
Bài viết
60
Được thích
3
Chào các anh chị,
Em nhờ các anh chị viết giúp em cod để khi nhập mã hàng thì tự động tính tổng giá trị theo mã hàng thay cho công thức như file đính èm.
Em cảm ơn ạ.
 

File đính kèm

  • Tinhtong.xlsx
    10.3 KB · Đọc: 31
Chào các anh chị,
Em nhờ các anh chị viết giúp em cod để khi nhập mã hàng thì tự động tính tổng giá trị theo mã hàng thay cho công thức như file đính èm.
Em cảm ơn ạ.
Bạn tham khảo:
Mã:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lastRow As Long
    lastRow = Range("B40").End(xlUp).Row
    If Target.Column = 2 And Target.Row >= 4 And Target.Row <= lastRow Then
        Dim dict As Object
        Set dict = CreateObject("Scripting.Dictionary")
        Dim i As Long
        For i = 4 To lastRow
            If Not dict.exists(Range("B" & i).Value) Then
                dict.Add Range("B" & i).Value, Range("C" & i).Value
            Else
                dict.Item(Range("B" & i).Value) = dict.Item(Range("B" & i).Value) + Range("C" & i).Value
            End If
        Next i
        Range("D" & Target.Row).Value = dict.Item(Range("B" & Target.Row).Value)
    End If
End Sub
 
Upvote 0
Thói thường nhập liệu (còn sửa lại là chuyện khác à nha), ta phải nhập mã hàng cụ thể nào đó trước; Sau đó mới tính đến việc ghi nhập số tiên (giá) của nó.
Vậy nên chăng ta với sự kiện tính tổng liên quan đến mã hàng nên gắn với cột 'C' (cột ghi số tiền của mã hàng); Tác giả bài đăng nghỉ sao?
 

File đính kèm

  • TNB.jpg
    TNB.jpg
    58.5 KB · Đọc: 5
Upvote 0
Bạn tham khảo:
Mã:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lastRow As Long
    lastRow = Range("B40").End(xlUp).Row
    If Target.Column = 2 And Target.Row >= 4 And Target.Row <= lastRow Then
        Dim dict As Object
        Set dict = CreateObject("Scripting.Dictionary")
        Dim i As Long
        For i = 4 To lastRow
            If Not dict.exists(Range("B" & i).Value) Then
                dict.Add Range("B" & i).Value, Range("C" & i).Value
            Else
                dict.Item(Range("B" & i).Value) = dict.Item(Range("B" & i).Value) + Range("C" & i).Value
            End If
        Next i
        Range("D" & Target.Row).Value = dict.Item(Range("B" & Target.Row).Value)
    End If
End Sub
Nhờ bạn xem lại giúp mình khi thay đổi mã đã nhập trước đó, hoặc giá trị cột C thay đổi thì các mã hàng có cùng mã cũng được tính tổng lại ( số liệu thay đổi theo). Cảm ơn bạn nhiều
Bài đã được tự động gộp:

Thói thường nhập liệu (còn sửa lại là chuyện khác à nha), ta phải nhập mã hàng cụ thể nào đó trước; Sau đó mới tính đến việc ghi nhập số tiên (giá) của nó.
Vậy nên chăng ta với sự kiện tính tổng liên quan đến mã hàng nên gắn với cột 'C' (cột ghi số tiền của mã hàng); Tác giả bài đăng nghỉ sao?
Đúng rồi bạn, mã hàng thay đổi và giá trị cột C thay đổi thì tổng tiền theo mã ( cột D) cũng thay đổi theo cho tất cả các dòng có cùng mã thay đổi.
 
Upvote 0
Nhờ bạn xem lại giúp mình khi thay đổi mã đã nhập trước đó, hoặc giá trị cột C thay đổi thì các mã hàng có cùng mã cũng được tính tổng lại ( số liệu thay đổi theo). Cảm ơn bạn nhiều
Bạn tham khảo:
Mã:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lastRow As Long
    lastRow = Range("B1000").End(xlUp).Row
    If (Target.Column = 2 Or Target.Column = 3) And Target.Row >= 4 And _
       Target.Row <= lastRow Then
        tinh lastRow
    End If
End Sub

Private Sub tinh(ByVal lastRow As Long, Optional ByVal fR As Integer = 4)
    
    If lastRow < fR Then Exit Sub
    Dim dict As Object
    Dim ma As Variant, tien As Variant, var As Variant
    Dim i As Long
    Set dict = CreateObject("Scripting.Dictionary")
    ma = Range("B" & fR & ":C" & lastRow).Value
    For i = LBound(ma, 1) To UBound(ma, 1)
        var = ma(i, 1)
        tien = ma(i, 2)
        If IsNumeric(tien) Then
            If Not dict.exists(var) Then
                dict.Add var, tien
            Else
                dict.Item(var) = dict.Item(var) + tien
            End If
        End If
    Next i
    
    tien = Range("D" & fR & ":D" & lastRow).Value
    For i = LBound(ma, 1) To UBound(ma, 1)
        var = ma(i, 1)
        tien(i, 1) = dict.Item(var)
    Next i
    Range("D" & fR & ":D" & lastRow).Value = tien
    
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Công thức ra OK rồi sao còn cần code nhỉ?
'Code' nói chung nó không chỉ để giải quyết vấn đề đưa ra kết quả; theo yêu cầu
Code, nhất là trên GPE.COM là Code mễn phí, nên cứ việc xin thôi; Thậm chí xin rồi bỏ xó cũng cứ XIN để xem cho biết!
Còn người CHO thì an ủi rằng mình không chỉ đáp ứng iêu cầu của chỉ người 'Xin'
 
Upvote 0
GPE có tật ghiền code. Cứ nghe đến "nhơ code" là mừng như bắt được vàng.
Cái này chỉ viêc cho bảng vào một Table. Gõ thêm gì nó tự động chỉnh nấy. Mắc mớ gì phải code?
 
Upvote 0
GPE có tật ghiền code. Cứ nghe đến "nhơ code" là mừng như bắt được vàng.
Cái này chỉ viêc cho bảng vào một Table. Gõ thêm gì nó tự động chỉnh nấy. Mắc mớ gì phải code?
Máy cùi bắp của mình mỗi khi dùng Table nó cứ cà giựt /-*+/
 
Upvote 0
Máy cùi bắp của mình mỗi khi dùng Table nó cứ cà giựt /-*+/
Thực yế thì Table chỉ là một trong những hướng đi tương lai của Excel.
Trên nguyên tắc, Table dùng Dynamic Name Ranges và Structured References để kết nối công thức cho nên rất hiệu quả.
Khi chuyển từ Data Table (phiên bản 2003) sang Table, Microsoft bắt buộc phải nhét nhiều thứ chiếm dụng bộ nhớ rất nhiều. Vì vậy, Table trở nên chậm khi số dòng lên khoảng 1000 (tôi có nghe nói 500 cũng bắt đầu chậm).
Qua phiên bản 2016 thì MS có nhieuf cau tiến trong cấu trúc chunhs của Excel và do đó họ có cơ hội làm cho Table hiệu quả hơn. Tuy nhiên tôi cũng thấy khoảng 10000 dòng thì có chậm.

Nhìn lại đòi hỏi của thớt xem. Có ai làm cái bảng phân tích khoai lang sùng như vậy cho 10000 dòng dữ liệu?
 
Upvote 0
Web KT

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

Back
Top Bottom