hngiatuong
CMC
- Tham gia
- 14/9/12
- Bài viết
- 312
- Được thích
- 68
- Nghề nghiệp
- VT
Sub GPE()
Dim Sarr(), Arr(), i As Long, j As Long, Endr As Long, Dic As Object
Dim HoTen As String, DayDau As String, DayCuoi As String
With Sheet1
If .AutoFilterMode Then .AutoFilterMode = False
Endr = .Range("E65500").End(xlUp).Row
If Endr > 2 Then
Set Dic = CreateObject("Scripting.Dictionary")
Sarr = .Range("C3:E" & Endr)
For i = 1 To Endr - 2
HoTen = Sarr(i, 3)
DayDau = Left$(Sarr(i, 1), 6)
DayCuoi = Right$(Sarr(i, 1), 3)
If Not Dic.Exists(HoTen) Then
Dic.Add HoTen, DayDau & "." & DayCuoi
Else
Dic.Item(HoTen) = Dic.Item(HoTen) & "." & DayCuoi
End If
Next i
Sarr = Dic.keys
ReDim Arr(1 To Dic.Count * 2, 1 To 2)
For i = 1 To Dic.Count
Arr(i + j, 1) = i + j
Arr(i + j + 1, 1) = i + j + 1
Arr(i + j, 2) = Dic.Item(Sarr(i - 1)) & "_(1)"
Arr(i + j + 1, 2) = Dic.Item(Sarr(i - 1)) & "_(2)"
j = j + 1
Next i
.Range("S7").Resize(Dic.Count * 2, 2).Value = Arr
Set Dic = Nothing
End If
End With
End Sub
Thử xem được chưa nha bạn !
Liệu bài này dùng mảng có được không anh?Mã:Sub GPE() Dim Sarr(), Arr(), i As Long, j As Long, Endr As Long, Dic As Object Dim HoTen As String, DayDau As String, DayCuoi As String With Sheet1 If .AutoFilterMode Then .AutoFilterMode = False Endr = .Range("E65500").End(xlUp).Row If Endr > 2 Then Set Dic = CreateObject("Scripting.Dictionary") Sarr = .Range("C3:E" & Endr) For i = 1 To Endr - 2 HoTen = Sarr(i, 3) DayDau = Left$(Sarr(i, 1), 6) DayCuoi = Right$(Sarr(i, 1), 3) If Not Dic.Exists(HoTen) Then Dic.Add HoTen, DayDau & "." & DayCuoi Else Dic.Item(HoTen) = Dic.Item(HoTen) & "." & DayCuoi End If Next i Sarr = Dic.keys ReDim Arr(1 To Dic.Count * 2, 1 To 2) For i = 1 To Dic.Count Arr(i + j, 1) = i + j Arr(i + j + 1, 1) = i + j + 1 Arr(i + j, 2) = Dic.Item(Sarr(i - 1)) & "_(1)" Arr(i + j + 1, 2) = Dic.Item(Sarr(i - 1)) & "_(2)" j = j + 1 Next i .Range("S7").Resize(Dic.Count * 2, 2).Value = Arr Set Dic = Nothing End If End With End Sub
Thử xem được chưa nha bạn !
Nếu nói về dãy số thì không thật là chuẩn (vì copy từ mạng xuống). Tuy nhiên ta coi là chuẩn, việc này ta xử lý trước để cho nó chuẩn ( có cả 2 loại dãy số: là 9 số, và là 10 số - có mặt cùng trong cột). Nếu là 9 thì dãy đầu lấy 6+ dãy cuối là 3 thêm dấu chấm như cũ là đúng, nếu là 10 thì dãy đầu lấy 7+dãy cuối. Nhưng thay DayDau = Left$(Sarr(i, 1), len(Sarr(i,1)-3).Range("S7:T"&.Range("S65500").End(Xlup).Row).Clearcontents vào nó cập nhật cả dãy đầu là 9 hoặc 10 luôn + dãy cuối (như vẫy là dãy đầu thừa 3 số phía cuối)1. Do mình không biết chuẩn dãy số của bạn. Nếu bạn chỉ lấy 3 số cuối để ghép vào dãy đầu thì lúc này sẽ sữa lại là:
Gán chỗ nào thì mình làm được. Nhưng gán .Range("S7:T"&.Range("S65500").End(Xlup).Row).Clearcontents thì nó báo lỗi. Chưa hiểu vì sao.1.2. Xóa kết quả củ: do mình không biết bạn sẽ gán kết quả vào chỗ nào . Ví dụ bán gán kết quả vào chỗ S7 thì trước khi gán dữ liệu xuống bạn thêm đoạn code này nó sẽ xóa dữ liệu cũ:
thử xem ok chưa nhé bạn !