Xem file bạn tôi chỉ hiểu được:Mình có giải thuật này hơi khó không biết viết bằng VBA như thế nào cho code chạy nhanh khoảng > 10000 dòng. Các bạn xem rồi hỗ trợ mình với.
Mình có giải thích rõ ràng trong file đính kèm.
Xin cám ơn!
Private Sub Worksheet_Deactivate()
Range("B2:B65536").ClearContents
With Range([A2], [A65536].End(xlUp))
.Offset(, 1).Value = Evaluate("=ROW(R1:R65536)")
End With
End Sub
Private Sub CommandButton1_Click()
Dim SrcRng As Range
Union([B2:B65536], [E2:E65536]).ClearContents
Set SrcRng = Sheet1.Range("A1").CurrentRegion
With Range([A2], [A65536].End(xlUp))
.Offset(, 1).FormulaArray = "=COUNTIF(INDIRECT(" & Chr(34) & "A2:A" & Chr(34) & "&ROW(" & .Address & "))," & .Address & ")-1"
.Offset(, 4).FormulaArray = "=VLOOKUP(" & .Address & ",'" & SrcRng.Parent.Name & "'!" & SrcRng.Address & ",2,0)"
.Offset(, 1).Value = .Offset(, 1).Value
.Offset(, 4).Value = .Offset(, 4).Value
End With
End Sub
Thử xem tốc độ có kém của NDU không nha?!Cột THUTU_HANG là số tăng dần theo cột HANG (bắt đầu từ 0)
Sub ThuTuHang()
Dim Rng As Range, sRng As Range, Clls As Range
Dim MyAdd As String: Dim Dem As Integer
With Sheets("Thung")
Set Rng = .Range(.[A1], .[A65500].End(xlUp))
End With
Sheets("Hang").Select
For Each Clls In Range("A2:A" & [A65500].End(xlUp).Row)
Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
MyAdd = sRng.Address
Do
sRng.Offset(, 1) = Dem: Dem = Dem + 1
Set sRng = Rng.FindNext(sRng)
Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
Dem = 0
End If
Next Clls
End Sub
Chưa hiểu, tại sao vầy:Cột THUTU_THUNG là số tăng dần của cột THUNG (bắt đầu từ 0) nếu cùng 1 THUNG trong cùng 1 HANG (chú ý có HANG có thể không có THUNG hoặc khác THUNG)
Thử xem tốc độ có kém của NDU không nha?!
Chưa hiểu, tại sao vầy:
|A|B|C| Yes/No
| Hang | Thung | ThuTuThung |
|. .|. .|. . |
5|A3|L|0|Y
6|A3|L|1|Y
||||
8|A5|S|0|Y
9|A5|S| 2 |No
10|A5|S| 1 | ??
|. .|. .|. . |
Em vừa thí nghiệm xong với dử liệu 30.000 dòng cho cả 2 sheeet... Kết quả như sau:Thử xem tốc độ có kém của NDU không nha?!
Chưa hiểu, tại sao vầy:PHP:Sub ThuTuHang() Dim Rng As Range, sRng As Range, Clls As Range Dim MyAdd As String: Dim Dem As Integer With Sheets("Thung") Set Rng = .Range(.[A1], .[A65500].End(xlUp)) End With Sheets("Hang").Select For Each Clls In Range("A2:A" & [A65500].End(xlUp).Row) Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole) If Not sRng Is Nothing Then MyAdd = sRng.Address Do sRng.Offset(, 1) = Dem: Dem = Dem + 1 Set sRng = Rng.FindNext(sRng) Loop While Not sRng Is Nothing And sRng.Address <> MyAdd Dem = 0 End If Next Clls End Sub
|A|B|C| Yes/No
| Hang | Thung | ThuTuThung |
|. .|. .|. . |
5|A3|L|0|Y
6|A3|L|1|Y
||||
8|A5|S|0|Y
9|A5|S| 2 |No
10|A5|S| 1 | ??
|. .|. .|. . |
Nhờ bác ndu test giúp em macro này xem tốc độ ra sao. Em có dùng 1 Name tên là TenHang là vùng chứa tên các mặt hàng trong Sheet HANG(Như trong file nó có địa chỉ là A2:A11)Em vừa thí nghiệm xong với dử liệu 30.000 dòng cho cả 2 sheeet... Kết quả như sau:
- Code của em chạy xong trong khoảng từ 25s đến 40s
- Code của anh.... Hic... Hic... đến giờ vẫn chưa xong!... Em đành phải Ctrl + Break chạy thoát thân
Em nghĩ dùng FOR khó có thể nhanh hơn việc gán công thức vào cell rồi chuyển sang Value (mà code anh lại dùng đến 2 vòng lập)
Anh Test thử xem!
Sub Roll()
Dim SoHang As Long
SoHang = Range("TenHang").Count
Dim arr() As Long
Dim i As Long
Dim Pos As Long
For i = 1 To SoHang
ReDim arr(1 To i)
Next
For i = 2 To [A65536].End(xlUp).Row
Pos = WorksheetFunction.Match(Cells(i, 1), Range("TenHang"), 0)
Cells(i, 2) = arr(Pos)
arr(Pos) = arr(Pos) + 1
Next
End Sub
Vừa test xong ---> Tốc độ hơi bị ấn tượng ---> dử liệu vẫn là 30.000 dòng trên 2 sheet ---> Tốc độ khoảng 15sNhờ bác ndu test giúp em macro này xem tốc độ ra sao. Em có dùng 1 Name tên là TenHang là vùng chứa tên các mặt hàng trong Sheet HANG(Như trong file nó có địa chỉ là A2:A11)
Mã:Sub Roll() Dim SoHang As Long SoHang = Range("TenHang").Count Dim arr() As Long Dim i As Long Dim Pos As Long For i = 1 To SoHang ReDim arr(1 To i) Next For i = 2 To [A65536].End(xlUp).Row Pos = WorksheetFunction.Match(Cells(i, 1), Range("TenHang"), 0) Cells(i, 2) = arr(Pos) arr(Pos) = arr(Pos) + 1 Next End Sub
Em chưa hiểu ý bác nói trên 2 sheet là thế nào? Có phải ý bác là bên sheet HANG bác có 30.000 mặt hàng không? Nếu đúng thì có vẻ ... hơi nhiều quá nhỉ. Em hỏi vậy vì code của bác tốc độ không phụ thuộc vào số lượng tên hàng. Còn của em thì lại phụ thuộc vào số lượng tên hàng khá nhiều. Nên khi test code của bác thì số dòng bên sheet HANG không quan trọng.Vừa test xong ---> Tốc độ hơi bị ấn tượng ---> dử liệu vẫn là 30.000 dòng trên 2 sheet ---> Tốc độ khoảng 15s
Ẹc... Ẹc...
Đúng vậy! Code của tôi không phụ thuộc vào sheet HÀNGEm chưa hiểu ý bác nói trên 2 sheet là thế nào? Có phải ý bác là bên sheet HANG bác có 30.000 mặt hàng không? Nếu đúng thì có vẻ ... hơi nhiều quá nhỉ. Em hỏi vậy vì code của bác tốc độ không phụ thuộc vào số lượng tên hàng. Còn của em thì lại phụ thuộc vào số lượng tên hàng khá nhiều. Nên khi test code của bác thì số dòng bên sheet HANG không quan trọng.