chỉ có excel 2007 trở lên mới có số dòng này thôi bác volga àbạn thử tìm hiểu về advanced filter đi .
100000 dòng ,thật là kinh khủng ,công thức chắc à ì ạch ...
Em sử dụng Office 2010 bác ạ....chỉ có excel 2007 trở lên mới có số dòng này thôi bác volga à
Trong Office 2007 và 2010 có chức năng loại bỏ dòng trùng, còn nếu như không muốn dùng bạn có thể dùng PivotTable để thực hiện điều bạn muốn.Em sử dụng Office 2010 bác ạ....
Bài lọc dữ liệu trùng thường dùng Advanced Filter, Consolidate....để lọc. Nếu dữ liệu lớn mà dùng công thức thì e rằng file sẽ nặng và chạy không nỗi.em có file dữ liệu cần nhập rất nhiều nên hơi nặng mọi người giúp em thêm hàm trong file. cám ơn mọi người.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Range("[COLOR=red]B2[/COLOR]:C" & [[COLOR=red]B65536[/COLOR]].End(xlUp).Row)
Range("[COLOR=red]F2[/COLOR]").Consolidate .Address(, , 2), Function:=xlSum, LeftColumn:=True
End With
End Sub
Bài lọc dữ liệu trùng thường dùng Advanced Filter, Consolidate....để lọc. Nếu dữ liệu lớn mà dùng công thức thì e rằng file sẽ nặng và chạy không nỗi.
Thêm cho Bạn 1 cách dùng Consolidate để lọc.
Mã:Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Range("[COLOR=red]B2[/COLOR]:C" & [[COLOR=red]B65536[/COLOR]].End(xlUp).Row) Range("[COLOR=red]F2[/COLOR]").Consolidate .Address(, , 2), Function:=xlSum, LeftColumn:=True End With End Sub
Bạn cứ thử sửa lại như vầy xem sao:Theo bài này thì dữ liệu bảng tính không hiểu khi có thêm loại giày mới bác ạ?
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Range("[COLOR=red]F2:G65536[/COLOR]").Clear
With Range("[COLOR=red]B2:C[/COLOR]" & [[COLOR=red]B65536[/COLOR]].End(xlUp).Row)
Range("[COLOR=red]F2[/COLOR]").Consolidate .Address(, , 2), Function:=xlSum, LeftColumn:=True
End With
End Sub
nếu 2010 thì thử cái recode này xem 150000 dòng đấyEm áp dụng công thức trong file này cho file công việc rất tốt. chỉ là không hiểu về nó lắm.. cái này hơi chuyên sâu nhỉ?
Có thể giải thích cho em hàm indirect dùng như thế nào và trong trường hợp như thế nào mới dùng. kèm ví dụ đơn giản được không ạ? Em đọc nhiều về hàm này nhưng vẫn cảm thấy lơ tơ mơ....
Em sử dụng Office 2010 bác ạ....
Private Sub CommandButton1_Click()
With Application
.ScreenUpdating = False
ActiveSheet.Range("e:f").Clear
Range("B2:C" & [B150000].End(xlUp).Row + 1).Copy
[e2].PasteSpecial Paste:=xlPasteValuesAndNumberFormats: [f3].FormulaR1C1 = "=SUMIF(C[-4],RC[-1],C[-3])"
: [f3].AutoFill Destination:=Range("F3:F" & [f150000].End(xlUp)): Range("$E1:$f150000").RemoveDuplicates Columns:=1
selection.Copy
selection.PasteSpecial Paste:=xlPasteValues
.CutCopyMode = False
.ScreenUpdating = True
End With
End Sub
Nâng lên 65000 dòng và # 1000 mã thì dùng Dictionary nhanh nhiều hơn đó. Nhanh hơn cả AdFi. Còn kg biết Ex 2010 thì thế nào.Bạn cứ thử sửa lại như vầy xem sao:
Mã:Private Sub Worksheet_SelectionChange(ByVal Target As Range) Range("[COLOR=red]F2:G65536[/COLOR]").Clear With Range("[COLOR=red]B2:C[/COLOR]" & [[COLOR=red]B65536[/COLOR]].End(xlUp).Row) Range("[COLOR=red]F2[/COLOR]").Consolidate .Address(, , 2), Function:=xlSum, LeftColumn:=True End With End Sub
Sub thuDic()
Dim t, i As Long, s As Long, Dic As Object, Arr, ArrKQ(1 To 65000, 1 To 2)
Set Dic = CreateObject("Scripting.Dictionary")
t = Timer
Range("I2:J65536").Clear
Arr = Range("B2:C" & [B65536].End(xlUp).Row)
s = 0
For i = 1 To UBound(Arr, 1)
If Not Dic.Exists(Arr(i, 1)) Then
s = s + 1
ArrKQ(s, 1) = Arr(i, 1)
Dic.Add Arr(i, 1), s
End If
ArrKQ(Dic.Item(Arr(i, 1)), 2) = ArrKQ(Dic.Item(Arr(i, 1)), 2) + Arr(i, 2)
Next i
Range("I2").Resize(s, 2) = ArrKQ
Erase Arr, ArrKQ: Set Dic = Nothing
MsgBox Timer - t
End Sub
Anh ThuNghi có thể giải thích từng dòng lệnh để Anh em học hỏi được không (sao thấy giống như đưa vào mảng quá) nhưng không hiểu nhiều dòng lệnh? Thấy cái CreateObject("Scripting.Dictionary")anh NDU và Anh hay dùng để lọc hay quá.
Chắc chắn Dictionary luôn nhanh hơn luôn, cho dù Excel 2007 hoặc Excel 2010 có dùng Advanced Filter hay RemoveDuplicate cũng vẫn chậmNâng lên 65000 dòng và # 1000 mã thì dùng Dictionary nhanh nhiều hơn đó. Nhanh hơn cả AdFi. Còn kg biết Ex 2010 thì thế nào.
Anh ThuNghi có thể giải thích từng dòng lệnh để Anh em học hỏi được không (sao thấy giống như đưa vào mảng quá) nhưng không hiểu nhiều dòng lệnh? Thấy cái CreateObject("Scripting.Dictionary")anh NDU và Anh hay dùng để lọc hay quá.
Dictionary Object đã được nói rất nhiều lần rồi (kê cả diễn giải chi tiết)... giờ xin đưa 1 code đơn giản nhất cho các bạn tham khảo nhằm hiểu thêmđúng rồi Bác thu nghi hưỡng dẫn từng dòng lệnh cho anh em học với
cái code cua bác chạy có 0.203125 giây à kể cả khi em sửa range lên đến 165536 . phải nói là cực nhanh.
còn code của Minh công hết 65.58594 giây , le duythương hết -72716.66.
=CHAR(INT(RAND()*5)+65)
Sub TestDic()
Dim Clls As Range, Dic, i As Long
Set Dic = CreateObject("Scripting.Dictionary")
For Each Clls In Range("A1:A30")
Clls.Select
If Not Dic.Exists(Clls.Value) Then ''<--- kiem tra xem Clls.Value có ton tại trong Dictionary hay khong?
MsgBox "Gia tri '" & Clls.Value & "' chua ton tai trong Dictionary"
Dic.Add Clls.Value, "" ''<--- Add giá tri Clls.Value vào Dictionary (vì nó chua ton tai)
i = i + 1
Cells(i, "C") = Clls.Value
Else
MsgBox "Gia tri '" & Clls.Value & "' da ton tai trong Dictionary"
End If
Next
End Sub
Hình như bài này Thu Nghi chỉ sử dụng "đít to" làm điều kiện để gán dữ liệu từ mảng Arr sang mảng ArrKQ _dùng "đít to" kiểm tra xem dữ liệu nào là duy nhất ở mảng Arr thì "xơi" nó đem gán qua "thằng" ArrKQ _Anh ThuNghi có thể giải thích từng dòng lệnh để Anh em học hỏi được không (sao thấy giống như đưa vào mảng quá) nhưng không hiểu nhiều dòng lệnh? Thấy cái CreateObject("Scripting.Dictionary")anh NDU và Anh hay dùng để lọc hay quá.
Sub thuDic2()
Dim t, i As Long, s As Long, Dic As Object, Arr, ArrKQ(1 To 65000, 1 To 2)
Set Dic = CreateObject("Scripting.Dictionary")
t = Timer
Range("I2:J65536").Clear
Arr = Range("B2:C" & [B65536].End(xlUp).Row)
For i = 1 To UBound(Arr, 1)
If Not Dic.Exists(Arr(i, 1)) Then
s = s + 1
ArrKQ(s, 1) = Arr(i, 1)
ArrKQ(s, 2) = Arr(i, 2)
Dic.Add Arr(i, 1), s
Else
ArrKQ(s, 2) = ArrKQ(s, 2) + Arr(i, 2)
End If
Next i
Range("I2").Resize(s, 2) = ArrKQ
Erase Arr, ArrKQ: Set Dic = Nothing
[i1] = Timer - t
End Sub
Code này sai nha anh!Hình như bài này Thu Nghi chỉ sử dụng "đít to" làm điều kiện để gán dữ liệu từ mảng Arr sang mảng ArrKQ _dùng "đít to" kiểm tra xem dữ liệu nào là duy nhất ở mảng Arr thì "xơi" nó đem gán qua "thằng" ArrKQ _
Lấy kết quả ở mảng ArrKQ chứ không lấy ở "đit to"
Xin phép Thu Nghi sửa lại code đó một tí tẹo cho Minh Công & Duy Thương dễ nhìn, dễ hiểu ( hình như tốc độ cũng được cải thiện)
Mã:Sub thuDic2() Dim t, i As Long, s As Long, Dic As Object, Arr, ArrKQ(1 To 65000, 1 To 2) Set Dic = CreateObject("Scripting.Dictionary") t = Timer Range("I2:J65536").Clear Arr = Range("B2:C" & [B65536].End(xlUp).Row) For i = 1 To UBound(Arr, 1) If Not Dic.Exists(Arr(i, 1)) Then s = s + 1 ArrKQ(s, 1) = Arr(i, 1) ArrKQ(s, 2) = Arr(i, 2) Dic.Add Arr(i, 1), s Else ArrKQ(s, 2) = ArrKQ(s, 2) + Arr(i, 2) End If Next i Range("I2").Resize(s, 2) = ArrKQ Erase Arr, ArrKQ: Set Dic = Nothing [i1] = Timer - t End Sub
Hình như dữ liệu trong bài của chủ topic đã được sắp xếp . Code này vẫn chạy đúng mà Thầy, nó cộng dồn "thằng" nào không duy nhất thôi, S luôn đúng vì không đổi cho tới khi "đít to" tìm ra "thằng" duy nhất tiếp theo chứ không phải chỉ cộng dồn em cuối cùng đâuCode này sai nha anh!
Sai ở chổ này:
ArrKQ(s, 2) = ArrKQ(s, 2) + Arr(i, 2)
Định vị như thế vô tình chỉ có "em cuối cùng" được cộng dồn mà thôi
Phải như ThuNghi:
ArrKQ(Dic.Item(Arr(i, 1)), 2) = ArrKQ(Dic.Item(Arr(i, 1)), 2) + Arr(i, 2)
thì mới chính xác
Đâu có được anh!Hình như dữ liệu trong bài của chủ topic đã được sắp xếp . Code này vẫn chạy đúng mà Thầy, nó cộng dồn "thằng" nào không duy nhất thôi, S luôn đúng vì không đổi cho tới khi "đít to" tìm ra "thằng" duy nhất tiếp theo chứ không phải chỉ cộng dồn em cuối cùng đâu
Híc
Tôi cũng đã thử, nếu sort trước thì kg cầnĐâu có được anh!
Khi anh viết code, anh phải tính đến trường hợp dữ liệu lộn xộn chứ (mà chuyện này là rất thường xuyên xảy ra) ---> Hên nó sort trước nên đúng thôi mà!
Còn không thì ít nhất anh cũng phải cho code sỏrt dữ liệu trước chứ
Ẹc... Ẹc..
và kg cần Dic làm gì.ArrKQ(Dic.Item(Arr(i, 1)), 2) = ArrKQ(Dic.Item(Arr(i, 1)), 2) + Arr(i, 2)
1/ Đổi ct tại D4 thành =COUNTIF($B$4:$B4,$B4) và copy xuốngChào các Anh/Chị !!!
Em có một danh sách khách hàng trên 5 ngàn người, nhưng khi xem lại trong danh sách đó quá nhiều Code khách hàng bị trùng nhau. Cho nên em muốn lọc ra 1 Sheet riêng biệt những khách hàng thực sự hiện có. Chỉ duy nhất 1 khách hàng = 1 code mà thôi. Nhưng làm hoài không được, chỉ bằng cách Delete bằng tay cho những khách hàng bị trùng như vậy thì lâu quá. Nên gởi lên đây, nhờ các anh chị giúp xem nên sử dụng Hàm gì ???
nếu bạn dùng excel 2007-2010 thì chỉ cần chọn côt b và c sau đó làm theo hình là chưa đến 10s sẽ ra kết quảchào các anh/chị !!!
Em có một danh sách khách hàng trên 5 ngàn người, nhưng khi xem lại trong danh sách đó quá nhiều code khách hàng bị trùng nhau. Cho nên em muốn lọc ra 1 sheet riêng biệt những khách hàng thực sự hiện có. Chỉ duy nhất 1 khách hàng = 1 code mà thôi. Nhưng làm hoài không được, chỉ bằng cách delete bằng tay cho những khách hàng bị trùng như vậy thì lâu quá. Nên gởi lên đây, nhờ các anh chị giúp xem nên sử dụng hàm gì ???
Cảm ơn rất nhiều !!!
Kèm theo file thí dụ nhé...