TrungChinhs
Thành viên tích cực


- Tham gia
- 18/2/08
- Bài viết
- 1,475
- Được thích
- 2,469
- Nghề nghiệp
- Công chức
Hic anh Nghĩa ơi bài toán này mình xử lý không tới 10 dòng lệnh đấy nhé
Chắc anh không nhớ là những chiêu này mình học của anh đấy.
Mã:Sub loc_khong_trung_quanghai() Dim dl(), tim As Object, i As Long dl = Range([A1], [a65536].End(3)).Value For i = 1 To UBound(dl) Set tim = Range("J:J").Find(dl(i, 1)) If tim Is Nothing Then [J65536].End(3).Offset(1) = dl(i, 1) Next End Sub
Sub Test()
Dim Tm, Kq()
Tm = Sheet1.[A1:A60]
ReDim Kq(1)
For i = 1 To UBound(Tm, 1)
If InStr(1, Join(Kq, ";"), Tm(i, 1)) = 0 Then
Kq(UBound(Kq) - 1) = Tm(i, 1)
ReDim Preserve Kq(UBound(Kq) + 1)
End If
Next
Sheet1.[j3].Resize(UBound(Kq) + 1) = _
WorksheetFunction.Transpose(Kq)
End Sub
Nhìn vế 2 chữ ký của Nghĩa nên mình góp code này:
Mã:Sub Test() Dim Tm, Kq() Tm = Sheet1.[A1:A60] ReDim Kq(1) For i = 1 To UBound(Tm, 1) If InStr(1, Join(Kq, ";"), Tm(i, 1)) = 0 Then Kq(UBound(Kq) - 1) = Tm(i, 1) ReDim Preserve Kq(UBound(Kq) + 1) End If Next Sheet1.[j3].Resize(UBound(Kq) + 1) = _ WorksheetFunction.Transpose(Kq) End Sub
Hihi, sửa tí _ cái này bị hoài mà chẳng nhớ. HícCách của anh Cò thật độc đáo, nhưng chưa đúng anh ơi. Giả sử có Chuỗi Hoàng Trọng nằm khoảng giữa trong vùng dữ liệu thì code anh tèo rồi.. hic
Public Sub DuyNhat()
Dim Vung, Kq, Cll, Tach
Vung = Range([A1], [A10000].End(xlUp))
For Each Cll In Vung
If Cll <> "" Then
If InStr(1, Kq, Cll & ",") = 0 Then Kq = Kq & Cll & ","
End If
Next Cll
Tach = Split(Kq, ",")
[B1].Resize(UBound(Tach)) = Application.WorksheetFunction.Transpose(Tach)
End Sub
Cách của Sealand cũng bị sót dữ liệu, giống bài 41 của anh Cò
Bài 46 của anh Cò lợi hại thật
Public Sub DuyNhat()
Dim Vung, Kq, Cll, Tach, KetQua, i As Long
Vung = Range([A1], [A10000].End(xlUp))
For Each Cll In Vung
If Cll <> "" Then
If InStr(1, Kq, Cll & ",") = 0 Then Kq = Kq & Cll & ","
End If
Next Cll
Tach = Split(Kq, ",")
ReDim KetQua(1 To UBound(Tach), 1 To 1)
For i = 1 To UBound(Tach)
KetQua(i, 1) = Tach(i - 1)
Next
[B1].Resize(UBound(Tach)) = KetQua
End Sub
Sub duynhat()
Dim arr, sarr
Dim i, j, k As Integer
arr = Range([A1], [A10000].End(xlUp))
ReDim sarr(1 To UBound(arr, 1), 1 To 1)
For i = 1 To UBound(arr)
For j = i + 1 To UBound(arr)
If arr(j, 1) = arr(i, 1) Then
arr(j, 1) = ""
End If
Next
Next
For i = 1 To UBound(arr, 1)
If arr(i, 1) <> "" Then
k = k + 1
sarr(k, 1) = arr(i, 1)
End If
Next
[B1].Resize(UBound(sarr)) = sarr
End Sub
Code này sẽ chạy rất chậm nếu xử lý dữ liệu nhiều, nếu dữ liệu 20 000 dòng thì tức là 20 000 X 20 000 = 400 000 000Cho em góp vui với
Mã:Sub duynhat() Dim arr, sarr Dim i, j, k As Integer arr = Range([A1], [A10000].End(xlUp)) ReDim sarr(1 To UBound(arr, 1), 1 To 1) For i = 1 To UBound(arr) For j = i + 1 To UBound(arr) If arr(j, 1) = arr(i, 1) Then arr(j, 1) = "" End If Next Next For i = 1 To UBound(arr, 1) If arr(i, 1) <> "" Then k = k + 1 sarr(k, 1) = arr(i, 1) End If Next [B1].Resize(UBound(sarr)) = sarr End Sub
Mình đang nói thử trên mảng thôi trời ạ! Đang cố gắng không động tới sheet mà chưa được nè! Cái nãy còn đụng tới ông Sort nên chưa hài lòng.
Option Base 1
Sub Test_noDic()
Dim tg As Double: tg = Timer
Dim arrDulieu(), arrKetqua(), i, k, j, jj, arrOnly(), x, kt, TT
arrDulieu = Range(Sheets("Du lieu").[J5], Sheets("Du lieu").[J65536].End(xlUp)).Offset(, -2).Resize(, 5).Value
ReDim arrKetqua(UBound(arrDulieu, 1), 5)
For i = 1 To UBound(arrDulieu, 1)
If arrDulieu(i, 2) <> "" Then
kt = 0
If k > 1 Then
For x = 1 To UBound(arrOnly, 2)
If arrDulieu(i, 2) = arrOnly(2, x) Then kt = 1: TT = arrOnly(1, x)
Next
End If
If kt = 0 Then 'ten chua co trong danh sach
j = j + 1: k = k + 1: jj = j
ReDim Preserve arrOnly(1 To 2, jj)
arrOnly(1, jj) = jj: arrOnly(2, jj) = arrDulieu(i, 2)
arrKetqua(k, 2) = arrDulieu(i, 2)
End If
Else
k = k + 1
If kt = 1 Then jj = TT
arrKetqua(k, 3) = arrDulieu(i, 3)
arrKetqua(k, 4) = arrDulieu(i, 4)
arrKetqua(k, 5) = arrDulieu(i, 5)
End If
arrKetqua(k, 1) = jj
Next
With Sheets("Ket qua").Range("A4")
.Resize(k, 5).Value = arrKetqua
.Resize(k, 5).Sort Sheets("Ket qua").Range("A4"), 1
End With
Dim arrTT()
arrTT = Sheets("Ket qua").Range("A4").Resize(k, 2).Value
For i = 1 To UBound(arrTT, 1)
If arrTT(i, 2) = "" Then arrTT(i, 1) = ""
Next
Sheets("Ket qua").Range("A4").Resize(k, 2).Value = arrTT
MsgBox Format(Timer - tg, "0.00000000")
End Sub
Má ơi, đã tạo mảng gán kết quả thì ......gán luôn lúc phát hiện cell nào là duy nhất, sao lại phải thêm vòng lặp chi nữaMình mượn code của Bác Cò rồi bỏ cái WorkSheetFunction đi thay vào đó một vòng lặp nữa để không lệ thuộc vào hàm của sheet:
PHP:Public Sub DuyNhat() Dim Vung, Kq, Cll, Tach, KetQua, i As Long Vung = Range([A1], [A10000].End(xlUp)) For Each Cll In Vung If Cll <> "" Then If InStr(1, Kq, Cll & ",") = 0 Then Kq = Kq & Cll & "," End If Next Cll Tach = Split(Kq, ",") ReDim KetQua(1 To UBound(Tach), 1 To 1) For i = 1 To UBound(Tach) KetQua(i, 1) = Tach(i - 1) Next [B1].Resize(UBound(Tach)) = KetQua End Sub
Public Sub DuyNhat()
Dim Vung, Kq, Cll, Mg, K
Vung = Range([A1], [A10000].End(xlUp))
ReDim Mg(1 To UBound(Vung), 1 To 1)
For Each Cll In Vung
If Cll <> "" Then
If InStr(1, Kq, Cll & ",") = 0 Then
K = K + 1
Kq = Kq & Cll & ","
Mg(K, 1) = Cll
End If
End If
Next Cll
[B1].Resize(K) = Mg
End Sub
Má ơi, đã tạo mảng gán kết quả thì ......gán luôn lúc phát hiện cell nào là duy nhất, sao lại phải thêm vòng lặp chi nữa
HícMã:Public Sub DuyNhat() Dim Vung, Kq, Cll, Mg, K Vung = Range([A1], [A10000].End(xlUp)) ReDim Mg(1 To UBound(Vung), 1 To 1) For Each Cll In Vung If Cll <> "" Then If InStr(1, Kq, Cll & ",") = 0 Then K = K + 1 Kq = Kq & Cll & "," Mg(K, 1) = Cll End If End If Next Cll [B1].Resize(K) = Mg End Sub
Sub Test()
Dim Kt As Boolean, Tm, Kq(), i, j
Tm = Sheet1.[A1:A60]
ReDim Kq(1)
For i = 1 To UBound(Tm, 1)
Kt = True
For j = 0 To UBound(Kq)
If Tm(i, 1) = Kq(j) Then
Kt = False: Exit For
End If
Next
If Kt Then
Kq(UBound(Kq) - 1) = Tm(i, 1)
ReDim Preserve Kq(UBound(Kq) + 1)
End If
Next
Sheet1.[j3].Resize(UBound(Kq) + 1) = _
WorksheetFunction.Transpose(Kq)
End Sub
Theo tôi với dạng bài này thì có Dic rồi sao không sử dụng cho nhanh mà mất công tư duy.
Tôi thấy code của anh ThanhLanh là hợp lý nhất, gán cho cái số TT và sort cho khỏe.
Trường hợp bài này nếu bổ sung thêm dòng công SubTotal trên đầu để cộng DT thì triển khai thêm thế nào.
Nếu dùng Dic và không dùng sort thì theo tôi bài dạng này cần phải 2 for i mới OK.
Với bài này anh em nào có thể giải ra kết quả theo yêu cầu của tác giả mà không dùng dictionary. Chỉ là vui chơi thôi chứ em không dám có ý thách đố nha các anh. Vì cũng khá lâu rồi mới có 1 bài hấp dẫn thế này.