Nhờ cách tính tổng mã trùng lặp

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

hp19892

Thành viên mới
Tham gia
19/8/21
Bài viết
16
Được thích
2
Chào mọi người , em mới học excel còn nhiều cái không biết hiện tại e đang có 1 bài toán như sau:
E có code E300001 ở cột H1, tìm tất cả những dòng trong mảng từ A:F nếu có dòng nào trùng giá trị với H1 thì sẽ tổng số lượng ở cột F tương ứng.
Em đang mò lệnh VLOOKUP nhưng vẫn chưa ra được giải pháp. Hi vọng mọi người giúp đỡ. E cám ơn.
z2695986489091_1a362bcd00d4b4360eda1af985f61d0d.jpg
 
Chào mọi người , em mới học excel còn nhiều cái không biết hiện tại e đang có 1 bài toán như sau:
E có code E300001 ở cột H1, tìm tất cả những dòng trong mảng từ A:F nếu có dòng nào trùng giá trị với H1 thì sẽ tổng số lượng ở cột F tương ứng.
Em đang mò lệnh VLOOKUP nhưng vẫn chưa ra được giải pháp. Hi vọng mọi người giúp đỡ. E cám ơn.
View attachment 264358
I5=SUMIFS($F$5:$F$5555,$B$5:$B$555,$H5)
 
Chào mọi người , em mới học excel còn nhiều cái không biết hiện tại e đang có 1 bài toán như sau:
E có code E300001 ở cột H1, tìm tất cả những dòng trong mảng từ A:F nếu có dòng nào trùng giá trị với H1 thì sẽ tổng số lượng ở cột F tương ứng.
Em đang mò lệnh VLOOKUP nhưng vẫn chưa ra được giải pháp. Hi vọng mọi người giúp đỡ. E cám ơn.
View attachment 264358
Sao đang từ "Material No." nhảy sang bên lại thành "Production Code" vậy bạn? Bạn tải file rồi bấm mặt cười xem:
Mã:
Option Explicit

Sub LocVaTinhTong()
    Dim dic As New Scripting.Dictionary, data()
    Dim sMa As String, r As Long, i As Long, k As Long
    With Sheet1
        r = .Cells(.Rows.Count, "B").End(xlUp).Row
        If r < 5 Then Exit Sub
        data = .Range("B5:E" & r).Value
        For i = LBound(data, 1) To UBound(data, 1)
            sMa = data(i, 1)
            If Not dic.Exists(sMa) Then
                k = k + 1
                dic.Add sMa, k
                data(k, 1) = sMa
                data(k, 2) = data(i, 4)
            Else
                r = dic.Item(sMa)
                data(r, 2) = data(r, 2) + data(i, 4)
            End If
        Next i
         .Range("H5").Resize(UBound(data, 1), 2).ClearContents
        If k > 0 Then .Range("H5").Resize(k, 2).Value = data
    End With
End Sub
 

File đính kèm

Sao đang từ "Material No." nhảy sang bên lại thành "Production Code" vậy bạn? Bạn tải file rồi bấm mặt cười xem:
Mã:
Option Explicit

Sub LocVaTinhTong()
    Dim dic As New Scripting.Dictionary, data()
    Dim sMa As String, r As Long, i As Long, k As Long
    With Sheet1
        r = .Cells(.Rows.Count, "B").End(xlUp).Row
        If r < 5 Then Exit Sub
        data = .Range("B5:E" & r).Value
        For i = LBound(data, 1) To UBound(data, 1)
            sMa = data(i, 1)
            If Not dic.Exists(sMa) Then
                k = k + 1
                dic.Add sMa, k
                data(k, 1) = sMa
                data(k, 2) = data(i, 4)
            Else
                r = dic.Item(sMa)
                data(r, 2) = data(r, 2) + data(i, 4)
            End If
        Next i
         .Range("H5").Resize(UBound(data, 1), 2).ClearContents
        If k > 0 Then .Range("H5").Resize(k, 2).Value = data
    End With
End Sub
code này hay quá. e chạy được luôn. Thanks bác
 
Sao đang từ "Material No." nhảy sang bên lại thành "Production Code" vậy bạn? Bạn tải file rồi bấm mặt cười xem:
Mã:
Option Explicit

Sub LocVaTinhTong()
    Dim dic As New Scripting.Dictionary, data()
    Dim sMa As String, r As Long, i As Long, k As Long
    With Sheet1
        r = .Cells(.Rows.Count, "B").End(xlUp).Row
        If r < 5 Then Exit Sub
        data = .Range("B5:E" & r).Value
        For i = LBound(data, 1) To UBound(data, 1)
            sMa = data(i, 1)
            If Not dic.Exists(sMa) Then
                k = k + 1
                dic.Add sMa, k
                data(k, 1) = sMa
                data(k, 2) = data(i, 4)
            Else
                r = dic.Item(sMa)
                data(r, 2) = data(r, 2) + data(i, 4)
            End If
        Next i
         .Range("H5").Resize(UBound(data, 1), 2).ClearContents
        If k > 0 Then .Range("H5").Resize(k, 2).Value = data
    End With
End Sub
Code viết chạy tốt, nhưng có nhiều chỗ đọc "mắc cười".
- Bên trên có lệnh: If r < 5 Then Exit Sub
Như vậy, nếu r>=5 thì code mới hoạt động, mà code hoạt động thì chắc chắn k>0 (dù kết quả chỉ có 1 dòng).
Bên dưới: If k>0 .... là "bắt ma" chứ không phải bắt lỗi.
- .Range("H5").Resize(UBound(data, 1), 2).ClearContents.
Đã kỹ lưỡng xóa kết quả cũ để gán kết quả mới, nhưng, ví dụ dữ liệu cũ 1000 dòng, kết quả cũ được 100 dòng.
Dữ liệu mới 50 dòng, kết quả mới có 20 dòng, Dòng lệnh trên chỉ xóa 50 dòng kết quả cũ (= số dòng dữ liệu).
Sao không "táng" cho nó số dòng cần xóa "tưởng tượng" nhiều nhất là bao nhiêu.
"Đẹp" nhất là cho nó nằm bên trên, bất kể r bằng bao nhiêu cũng xóa.
With Sheet1
If .Range("H5").Value <> Empty Then .Range("H5", .Range("H100000").End(xlUp)).Resize(, 2).ClearContents
...................................
 
Lần chỉnh sửa cuối:
Sao đang từ "Material No." nhảy sang bên lại thành "Production Code" vậy bạn? Bạn tải file rồi bấm mặt cười xem:
Mã:
Option Explicit

Sub LocVaTinhTong()
    Dim dic As New Scripting.Dictionary, data()
    Dim sMa As String, r As Long, i As Long, k As Long
    With Sheet1
        r = .Cells(.Rows.Count, "B").End(xlUp).Row
        If r < 5 Then Exit Sub
        data = .Range("B5:E" & r).Value
        For i = LBound(data, 1) To UBound(data, 1)
            sMa = data(i, 1)
            If Not dic.Exists(sMa) Then
                k = k + 1
                dic.Add sMa, k
                data(k, 1) = sMa
                data(k, 2) = data(i, 4)
            Else
                r = dic.Item(sMa)
                data(r, 2) = data(r, 2) + data(i, 4)
            End If
        Next i
         .Range("H5").Resize(UBound(data, 1), 2).ClearContents
        If k > 0 Then .Range("H5").Resize(k, 2).Value = data
    End With
End Sub
@Hoàng Nhật Phương .
Sao không ghi dữ liệu ra mảng khác mà lại ghi vào data như vậy.
Câu lệnh xóa này không đúng lắm.
.Range("H5").Resize(UBound(data, 1), 2).ClearContents
Không cần kiểm tra if K>0 vì lúc nào có dữ liệu nó cũng lớn hơn 0 rồi nên không cần à.
 
Chào mọi người , em mới học excel còn nhiều cái không biết hiện tại e đang có 1 bài toán như sau:
E có code E300001 ở cột H1, tìm tất cả những dòng trong mảng từ A:F nếu có dòng nào trùng giá trị với H1 thì sẽ tổng số lượng ở cột F tương ứng.
Em đang mò lệnh VLOOKUP nhưng vẫn chưa ra được giải pháp. Hi vọng mọi người giúp đỡ. E cám ơn.
View attachment 264358
Thêm 1 lời giải nữa cho bạn rộng đường lựa chọn:
1. Nhấn nút (RUN) trên sh1. Kết quả trả về ở cột I sẽ được tính (áp dụng cho Các mã số ở cột H có sẵn)
2.Nhấn nút (Chạy code) trên Sh1 (trong trường hợp muốn tổng hợp tất cả các mã ở cột B)-Dùng dic
3. dùng hàm UDF (như trong file)
 

File đính kèm

Web KT

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

Back
Top Bottom