toandiennuoc123
Thành viên thường trực




- Tham gia
- 7/3/12
- Bài viết
- 239
- Được thích
- 9




Sub Tach()
Dim i As Long, Tmp As Long
Dim Dic As Object
Dim Arr(), Res()
Arr = Range("A3:A" & Range("A65536").End(3).Row)
ReDim Res(1 To UBound(Arr, 1), 1 To 2)
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(Arr, 1)
Tmp = Arr(i, 1)
If Not Dic.Exists(Tmp) Then
Dic.Add Tmp, i
Else
Dic.Item(Tmp) = Dic.Item(Tmp) & "Y"
End If
Next
For i = 1 To UBound(Arr, 1)
Tmp = Arr(i, 1)
If Right(Dic.Item(Tmp), 1) = "Y" Then
Res(i, 1) = Tmp
Else
Res(i, 2) = Tmp
End If
Next
Range("E3").Resize(UBound(Arr, 1), 2) = Res
End Sub
Bạn thử sub này xem có đúng ý không?
Mã:Sub Tach() Dim i As Long, Tmp As Long Dim Dic As Object Dim Arr(), Res() Arr = Range("A3:A" & Range("A65536").End(3).Row) ReDim Res(1 To UBound(Arr, 1), 1 To 2) Set Dic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(Arr, 1) Tmp = Arr(i, 1) If Not Dic.Exists(Tmp) Then Dic.Add Tmp, i Else Dic.Item(Tmp) = Dic.Item(Tmp) & "Y" End If Next For i = 1 To UBound(Arr, 1) Tmp = Arr(i, 1) If Right(Dic.Item(Tmp), 1) = "Y" Then Res(i, 1) = Tmp Else Res(i, 2) = Tmp End If Next Range("E3").Resize(UBound(Arr, 1), 2) = Res End Sub
Sub Tach()
Dim i As Long, Tmp As Variant
Dim Dic As Object
Dim Arr(), Res()
Arr = Range("A3:A" & Range("A65536").End(3).Row)
ReDim Res(1 To UBound(Arr, 1), 1 To 2)
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(Arr, 1)
Tmp = Arr(i, 1)
If Dic.Exists(Tmp) Then
If Dic.Item(Tmp) <> -1 Then Res(Dic.Item(Tmp), 1) = Tmp
Res(i, 1) = Tmp
Dic.Item(Tmp) = -1
Else
Dic.Add Tmp, i
End If
Next
For Each Tmp In Dic.Keys
If Dic.Item(Tmp) <> -1 Then Res(Dic.Item(Tmp), 2) = Tmp
Next
Range("E3").Resize(UBound(Arr, 1), 2) = Res
Set Dic = Nothing
End Sub
Như thê này cho nó sành điệu (chỉ là phương án khác), mỗi cái có cái hay riêng
PHP:Sub Tach() Dim i As Long, Tmp As Variant Dim Dic As Object Dim Arr(), Res() Arr = Range("A3:A" & Range("A65536").End(3).Row) ReDim Res(1 To UBound(Arr, 1), 1 To 2) Set Dic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(Arr, 1) Tmp = Arr(i, 1) If Dic.Exists(Tmp) Then If Dic.Item(Tmp) <> -1 Then Res(Dic.Item(Tmp), 1) = Tmp Res(i, 1) = Tmp Dic.Item(Tmp) = -1 Else Dic.Add Tmp, i End If Next For Each Tmp In Dic.Keys If Dic.Item(Tmp) <> -1 Then Res(Dic.Item(Tmp), 2) = Tmp Next Range("E3").Resize(UBound(Arr, 1), 2) = Res Set Dic = Nothing End Sub
Sub Tach()
Dim i As Long, n As Long, Tmp As Variant
Dim Dic As Object
Dim Arr(), Res()
Arr = Range("A3:A" & Range("A65536").End(3).Row)
n = UBound(Arr)
ReDim Res(1 To n, 1 To 2)
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To n
Tmp = Arr(i, 1)
If Dic.Exists(Tmp) Then
If Dic.Item(Tmp) <> -1 Then Res(Dic.Item(Tmp), 1) = Tmp
Res(i, 1) = Tmp
Dic.Item(Tmp) = -1
Else
Dic.Add Tmp, i
End If
Next
For Each Tmp In Dic.Items
If Tmp <> -1 Then Res(Tmp, 2) = Arr(Tmp, 1)
Next
Range("E3").Resize(n, 2) = Res
Set Dic = Nothing
End Sub
Công thức này:Theo lời anh VietMini em làm công thức thử
Nếu thay ">=2" thành ">1" sẽ ngắn hơn tí tẹo=IF(COUNTIFS($A$3:$A$109,A3)>=2,A3,"")

Hoặc phương án khác nữa, cho khác kiểu sành điệu
PHP:Sub Tach() Dim i As Long, n As Long, Tmp As Variant Dim Dic As Object Dim Arr(), Res() Arr = Range("A3:A" & Range("A65536").End(3).Row) n = UBound(Arr) ReDim Res(1 To n, 1 To 2) Set Dic = CreateObject("Scripting.Dictionary") For i = 1 To n Tmp = Arr(i, 1) If Dic.Exists(Tmp) Then If Dic.Item(Tmp) <> -1 Then Res(Dic.Item(Tmp), 1) = Tmp Res(i, 1) = Tmp Dic.Item(Tmp) = -1 Else Dic.Add Tmp, i End If Next For Each Tmp In Dic.Items If Tmp <> -1 Then Res(Tmp, 2) = Arr(Tmp, 1) Next Range("E3").Resize(n, 2) = Res Set Dic = Nothing End Sub
Anh giola có thể cho em xin bản dịch của từng dòng code được không?
Em mới tìm hiểu qua về Range và Cell nên phần mảng này chưa hiểu rõ lắm
Sub Tach()
Dim i As Long
Dim Dic As Object
Dim Arr(), Res()
Arr = Range("A3:A" & Range("A65536").End(3).Row)
ReDim Res(1 To UBound(Arr, 1), 1 To 2)
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(Arr, 1)
Dic(Arr(i, 1)) = IIf(Dic.Exists(Arr(i, 1)), 1, 2)[COLOR=#008000] ' nếu có trùng lặp thì cột 1, không thì cột 2[/COLOR]
Next
For i = 1 To UBound(Res, 1)
Res(i, Dic(Arr(i, 1))) = Arr(i, 1)
Next
Range("E3").Resize(UBound(Arr, 1), 2) = Res
End Sub
Sub Tach()
Dim i As Long, Tmp As Long
Dim Dic As Object
Dim Arr(), Res()
Arr = Range("A3:A" & Range("A65536").End(3).Row)
ReDim Res(1 To UBound(Arr, 1), 1 To 2)
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(Arr, 1)
Tmp = Arr(i, 1)
If Not Dic.Exists(Tmp) Then
Dic.Add Tmp, i
Res(i, 2) = Tmp
Else
Res(i, 1) = Tmp
If Res(Dic.Item(Tmp), 1) = "" Then Res(Dic.Item(Tmp), 1) = Res(Dic.Item(Tmp), 2)
Res(Dic.Item(Tmp), 2) = ""
End If
Next
Range("E3").Resize(UBound(Arr, 1), 2) = Res
End Sub