LuuAnh980
Thành viên tiêu biểu

- Tham gia
- 28/9/22
- Bài viết
- 463
- Được thích
- 106
- Giới tính
- Nữ
Tiêu chí lọc không trùng dựa vào cột nào, Sort ưu tiên cột nào. Diễn giải rõ ràng vào bạnChào các anh chi!!!!
Em có file muôn nhờ các anh chị lọc không trùng của 3 cột và sau khi lọc xong thì sort từ nhỏ đến lớn luôn ạ.
Trong 3 cột có một số dòng rống, thì bỏ qua ạ.
Trong file em có ví dụ ạ.
Sub GPE()
Dim Arr(), Res(), i&, j&, k&, Lr&
Dim Dic As Object, Key$
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Sheet1")
Lr = .Range("E" & Rows.Count).End(xlUp).Row
Arr = .Range("E2:O" & Lr).Value
ReDim Res(1 To UBound(Arr), 1 To 3)
For i = 1 To UBound(Arr)
If Arr(i, 1) <> "" Then
Arr(i, 2) = Arr(i, 2) * 1
Key = Arr(i, 1) & "_" & Arr(i, 11)
If Not Dic.exists(Key) Then
k = k + 1
Dic.Add (Key), k
Res(k, 1) = Arr(i, 1)
Res(k, 2) = Arr(i, 2)
Res(k, 3) = Arr(i, 11)
Else
Res(Dic.Item(Key), 2) = Res(Dic.Item(Key), 2) + Arr(i, 2)
End If
End If
Next i
If k Then
.Range("T2:V100000").ClearContents
.Range("U:U").NumberFormat = "0"
.Range("T2").Resize(k, 3).Value = Res
With Range("T1:V1000")
.Sort .Cells(1, 1), 1, Header:=xlGuess
End With
End If
End With
MsgBox "Hoan Thanh"
Set Dic = Nothing
End Sub
Bạn muốn cộng dồn số mã nhưng cột số mã dữ liệu lại dạng text?Chưa đúng anh ơi!!!!
Sao có So ma gì mà lên tới hàng trăm anh
View attachment 282596
cột don hang sao canh trai canh phải tùm lum vậy anh.
Chỗ đó để dữ liệu chuyển qua number bạnBạn bỏ chỗ này xem sao
Hình như thớt muốn cộng dồn số mã mà ta?!Vậy bạn bỏ đoạn này và định dạng cột U thành Text trước khi chạy code
View attachment 282599
Vì yêu cầu "Số Mã" là Text, vì thế không nên chuyển sang number.
Nó đang sort theo cột đơn hàng.Cột số mã không phải cộng dồn, mà lọc đưa qua theo côt Đơn hàng anh @Zl: 0933707265 ơi.
Ủa mà Sort sao kỳ vậy anh @Zl: 0933707265 sao 120,122,125 lại nằm trên 95,99
View attachment 282600
With Range("T1:V1000")
.Sort .Cells(1, 1), 1, Header:=xlGuess
End With
With Range("T1:V1000")
.Sort .Cells(1, 2), 1, Header:=xlGuess
End With
Bạn thử với hàm tự tạo xem sao. Ở sheet nào cũng dùng được.Tất cả dựa vào cột E anh ơi, Sort ưu tiên cột E luôn anh ơi.
Bạn nêu chỗ sai được không, chỉ nói không đúng rồi dừng thì ai biết sai chỗ nào nhỉ.Hàm của anh @Hoàng Tuấn 868 sao em thấy chạy không đúng.
Điều kiện của bạn ở bài #3 là lọc theo cột E, rồi xắp xếp theo cột E thì có 13 số đơn hàng duy nhất thôi mà, vậy sai ở chỗ nào nhỉ.Sao em kéo công thức xuông nó ra như vầy
View attachment 282607
Vậy là do bạn nêu thiếu tiêu chí lọc không trùng (điều kiện là phải cả 2, hay 3 cột chứ không phải chỉ cột E), còn theo điều kiện bài #3 thì hàm không sai.thiếu Đơn hàng 2925 số mã là 35 , 2925 mã số 43 nữa (các dong 60,62,73,77,78...
!!! . . . . . . . . . .thiếu Đơn hàng 2925 số mã là 35 , 2925 mã số 43 nữa (các dong 60,62,73,77,78...
Dùng code. . . . .Hàm của anh @Hoàng Tuấn 868 đúng rồi, nhưng phải mất 10s mới chạy xong.
Cám ơn anh @Hoàng Tuấn 868.
Anh @Zl: 0933707265 và anh @anhtuan2939 giúp em code với.
Sub LocKhongTrung3Cot()
'Xoa du lieu cu
ClearOld
'Lap danh sach duy nhat moi
With CreateObject("ADODB.Connection")
.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=No""")
Sheet9.Range("H4").CopyFromRecordset .Execute("Select f1,f2,f11 From [Sheet3$E2:O] Group by f1,f2,f11 ")
End With
End Sub
Thời gian chạy code của mình đây, vậy mà vẫn hơi lâu thì mình chịu rồi.Code của anh @Hoàng Tuấn 868 chạy hơi lâu
Đã để số mã về nguyên dạng.số mã anh cứ để nguyên trạng, đừng cho thành 3 số.
Bác phải biết chiều lòng thượng đế chớThời gian chạy code của mình đây, vậy mà vẫn hơi lâu thì mình chịu rồi.
View attachment 282646
Đã để số mã về nguyên dạng.
Code bác em mới xem qua, cũng chưa hiểu rõ lắm nhưng có góp ý thế này, nếu chưa phù hợp thì bác bỏ qua nha:Dùng code. . . . .
Chân thành cảm ơn bạn nhé, lâu rồi không đụng đến, lấy code từ ngày xưa (hồi mới lọ mọ vào code) sửa lại cho khớp với dữ liệu của bạn này thôi mà. Có viết mới đâu.Code bác em mới xem qua, cũng chưa hiểu rõ lắm nhưng có góp ý thế này, nếu chưa phù hợp thì bác bỏ qua nha:
Không nên tách sort và loại trùng ra 2 phần. Như thế sẽ phải lặp nhiều hơn (có thêm vòng for loại trùng), và phía trên, vòng for để sort phải xử lý cả những phần tử trùng. Trong khi mình có thể không cần quan tâm tới những phần tử trùng này
Ý tưởng của em là gộp loại trùng vào trong vòng 'for k' đầu tiên luôn, nếu đã có trong dic thì bỏ qua vấn đề sort luôn (không quan tâm tới nó)
Nếu chưa có trong dic thì mới cho chạy vào vòng 'for i' để sort. Tuy nhiên cũng không nên for i=1 mà nên là for i=k+1 để hạn chế bớt vòng lặp dư thừa.
Em chưa viết, mà chỉ nghĩ như vậy thôi!
Em cũng mới chỉ ý tưởng thôi, không biết viết ra có cấn chỗ nào khôngChân thành cảm ơn bạn nhé, lâu rồi không đụng đến, lấy code từ ngày xưa (hồi mới lọ mọ vào code) sửa lại cho khớp với dữ liệu của bạn này thôi mà. Có viết mới đâu.
Ngày xưa mới lọ mọ thì đầu tiên thử cách xắp xếp thứ tự nhỏ đến to, sau đó tìm hiểu thêm về Dictionary thì lại viết tiếp đoạn lọc không trùng rồi ghép hai món lại thì nó ra vậy đó bạn.Em cũng mới chỉ ý tưởng thôi, không biết viết ra có cấn chỗ nào không
Nếu bác có thời gian thì thử xem, giúp người nhưng cũng là giúp mình vận động đầu óc tí nó cũng vui
!!!.. . . .. ............Cám ơn anh @Hoàng Tuấn 868, code bài mới đã nhanh(0,0715) nhưng chổ số mã em nguyên dạng như vầy :01,02,03....., thì của anh là 1,2,3... Mong anh chỉnh lại code dùm em, và muốn lọc qua sheet2 thì chỉnh code thê nào anh
1/ Đã bỏ Msgbox.1/ em xóa dữ liệu lọc đi, và nhấn nút lọc thì nhảy ra MsgBox thời gian -. nhấn OK ->ra dữ liệu loc..Anh chỉnh dùm khi nhấn nút lọc thì ra luôn dữ liệu loc.
2/ Ở máy tính mình không thấy như vậy nên không biết bị sao để sửa.2/ Cột số mã em có số mã này: "05/09" thì khi lọc nó lại ra là 05-Sep mặc dù em đã định dạng "05/09" là Text. Mong anh xem giúp.
"vẫn còn MsgBox"Em tải file bài #39 vẫn còn MsgBox, và anh có thử gõ vào sheet1 như em đưa hình rồi chạy lọc thử xem sao ạ.
View attachment 282656
Bệnh này lang băm như mình chưa nghĩ ra thuốc chữa, chắc phải chờ Bác sĩ đầu ngành thôi bạn.File đây anh ơi Sheet1 em bôi vàng, sheet2 em bôi vàng .
Làm gì đến nỗi trả bệnh nhân về chờ chết?Bệnh này lang băm như mình chưa nghĩ ra thuốc chữa, chắc phải chờ Bác sĩ đầu ngành thôi bạn.
Cảm ơn anh nhiều, em nghĩ mãi không ra anh ạ.Làm gì đến nỗi trả bệnh nhân về chờ chết?
Thay
md(k, j + 1) = mn(i, a(j))
bằng
md(k, j + 1) = "'" & mn(i, a(j))
--------
Tuy nhiên, theo tôi bài này dùng advanced filter cho nhẹ đầu
Sub AdvFilter_Sort()
Dim LastRw As Long
With Sheet1
For Each cll In .Range("G1:N1")
If IsEmpty(cll.Value) Then cll.Value = cll.Address
Next
LastRw = .[E10000].End(xlUp).Row
.Range("E1:O" & LastRw).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheet2.Range( _
"W1:W2"), CopyToRange:=Sheet2.Range("G1:I1"), Unique:=True
End With
With Sheet2
.Activate
LastRw = .[G10000].End(xlUp).Row
.Range("G1:I" & LastRw).Sort Key1:=.Range("G1"), Order1:=xlAscending, _
Key2:=.Range("H1"), Order2:=xlAscending, Header:=xlYes
End With
End Sub
Convert to number, không phải định dạng, nhưng làm từ dữ liệu gốc. Tô nguyên khối sao cho ô đầu tiên hoặc ô trắng của vùng chọn có tam giác xanh, rà chuột vào sẽ có hình ! màu vàng, nhấn vào đó chọn convert to number.Là dạng general hay number Thầy???
Để general mà nhập liệu, không định dạng gì cả: Không text, không number, không canh trái canh phải canh giữa. Số 02 thì thêm dấu 'Cám ơn thầy Mỹ, em đã làm được. Vậy có cách nào chống nhập liệu sai định dạng không thầy.