Cộng dồn và xóa dòng trùng, điều kiện trùng là 3 cột (1 người xem)

Liên hệ QC

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

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia
18/3/08
Bài viết
8,309
Được thích
15,867
Giới tính
Nam
Nghề nghiệp
Làm ruộng.
Xin vui lòng hướng dẫn em cách cộng dồn và xóa dòng trùng theo điều kiện 3 cột (C+D+E), Nếu giống nhau thì cộng dồn cột F và I lại làm 1 dòng, đồng thời xóa dòng trùng đi.

Dùng VBA, không dùng hàm, không dùng cột phụ.

Em xin cám ơn trước.
 

File đính kèm

Xin vui lòng hướng dẫn em cách cộng dồn và xóa dòng trùng theo điều kiện 3 cột (C+D+E), Nếu giống nhau thì cộng dồn cột F và I lại làm 1 dòng, đồng thời xóa dòng trùng đi.

Dùng VBA, không dùng hàm, không dùng cột phụ.

Em xin cám ơn trước.
Mình xin gợi ý thử nhé.
1/ Ghép 3 cột K=C& "xx" & D & "xx" & E trong đó "xx" là ký tự nào đó đặc biệt.
2/ AdFi theo cột K
3/ Dùng sumif để tính F và I.
4/ Dùng Split để tách ra 3 cột C&D&E hay là dùng text to column.
5/ Dùng Vlook để tìm số TT.
6/ Xoá cột K.
Mình thì dùng cách này cho mau, for i cũng OK. Còn cách khác nữa ngắn hơn mà chưa tìm ra.
Hình như Pivot cũng OK.
Thú thật tôi thích dùng for i hơn. Tổng quát nhất trong các ngôn ngữ là nên for i và gán biến.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình xin gợi ý thử nhé.
1/ Ghép 3 cột K=C& "xx" & D & "xx" & E trong đó "xx" là ký tự nào đó đặc biệt.
2/ AdFi theo cột K
3/ Dùng sumif để tính F và I.
4/ Dùng Split để tách ra 3 cột C&D&E hay là dùng text to column.
5/ Dùng Vlook để tìm số TT.
6/ Xoá cột K.
Mình thì dùng cách này cho mau, for i cũng OK. Còn cách khác nữa ngắn hơn mà chưa tìm ra.
Hình như Pivot cũng OK.
Nếu đã ghép 3 cột C, D, E lại vào 1 cột phụ thì thôi ta dùng Consolidate luôn cho xong! Cái rẹt nó ra kết quả luôn, khỏi SUMIF, cũng khỏi FOR luôn
(Cột phụ phải nằm ở vị trị cột đầu tiên)
 
Upvote 0
Như em đã đề cập ở trên, có cách nào cộng mà không dùng cột phụ không anh, vì nó còn liên quan đến các cột khác trong bảng dữ liệu.
 
Upvote 0
Như em đã đề cập ở trên, có cách nào cộng mà không dùng cột phụ không anh, vì nó còn liên quan đến các cột khác trong bảng dữ liệu.
Thường các NN lập trình nên có 1 vùng tạm, hay sh Tmp nhằm bảo quản dữ liệu.
Không dùng cột phụ thì dùng chính nó, ghép vào và tách ra trên chính nó.
Còn kg thì dùng sort -> for i hay là dùng find thử cho dễ hiểu.
 
Lần chỉnh sửa cuối:
Upvote 0
Như em đã đề cập ở trên, có cách nào cộng mà không dùng cột phụ không anh, vì nó còn liên quan đến các cột khác trong bảng dữ liệu.
Bài này nếu làm bằng tay và yêu câu không cột phụ thì tôi sẽ:
- Advanced Filter vùng C1:Ex (với x là dòng cuối cùng)... Lọc tại chổ với tùy chọn Unique Records Only
- Copy dữ liệu sau lọc sang nơi khác (copy toàn bộ, từ cột A đến cột J)
- Đặt hàm SUMPRODUCT vào cột Q'Ty và cột Amount (của vùng dữ liệu mới)
- Nếu cần sẽ copy công thức và PasteSpecial\Values
----------------------------
Viết code dựa trên giải thuật này ta cũng chẳng cần dùng đến For Next ---> Chỉ có điều rắc rối ở đoạn đặt SUMPRODUCT trong code (khá dài dòng)
Bạn thí nghiệm xem (tôi nghĩ bạn thừa sức ấy chứ)
 
Upvote 0
Bạn xem có thể sử được không
(Mình viết sơ bộ, chưa hoàn thiện code)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Code hoạt động tốt nhưng nếu có 1 hoặc nhiều dòng dữ liệu bị trống thì nó ì ra anh à.
 
Upvote 0
Đúng rồi, mình chưa hoàn thiện code mà. Nếu ô trống nó sẽ soát tất các ô trống còn lại. Bạn sửa code như sau

Mã:
Option Explicit
Sub congdup()
Dim i, j As Integer
i = 2
Application.ScreenUpdating = False
With Application.WorksheetFunction
Do
If noi(Sh2.Range(Cells(i, 3), Cells(i, 5))) = "" Then
Sh2.Rows(i).Delete
i = i - 1
Else
For j = i + 1 To 24
If noi(Sh2.Range(Cells(i, 3), Cells(i, 5))) _
= noi(Sh2.Range(Cells(j, 3), Cells(j, 5))) Then
Sh2.Cells(i, 6) = Sh2.Cells(i, 6) + Sh2.Cells(j, 6)
Sh2.Cells(i, 9) = Sh2.Cells(i, 9) + Sh2.Cells(j, 9)
Sh2.Rows(j).Delete
j = j - 1
End If
Next j
End If
i = i + 1
Loop Until i = Sh2.[c56536].End(xlUp).Row
End With
End Sub
Function noi(rg As Range)
Dim Clls As Range
For Each Clls In rg.Cells
noi = noi & Trim(Clls)
Next
End Function
 

File đính kèm

Upvote 0
Đây là code không vòng lập như tôi đã nói ở bài trước:
PHP:
Sub Main()
  Dim MN As String, SP As String, CN As String, QT As String, AM As String
  With ThisWorkbook.Sheets("Data")
    .Range("M:V").Clear
    With .Range("A1").CurrentRegion
      With Intersect(.Cells, .Offset(1, 2)).Resize(, 1)
        MN = .Offset(, 0).Address(, , 2)
        SP = .Offset(, 1).Address(, , 2)
        CN = .Offset(, 2).Address(, , 2)
        QT = .Offset(, 3).Address(, , 2)
        AM = .Offset(, 6).Address(, , 2)
      End With
      .Offset(, 2).Resize(, 3).AdvancedFilter 1, , , True
      .SpecialCells(12).Copy Range("M1")
      .Parent.ShowAllData
    End With
    With .Range("M1").CurrentRegion
      With Intersect(.Cells, .Offset(1, 5)).Resize(, 1)
        .Offset(, 0).Value = "=SUMPRODUCT((" & MN & "=RC[-3])*(" & SP & "=RC[-2])*(" & CN & "=RC[-1])*(" & QT & "))"
        .Offset(, 3).Value = "=SUMPRODUCT((" & MN & "=RC[-6])*(" & SP & "=RC[-5])*(" & CN & "=RC[-4])*(" & AM & "))"
      End With
      .Value = .Value
    End With
    .Range("M:V").EntireColumn.AutoFit
  End With
End Sub
Bạn có thể tùy biến thêm
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom