Cần tư vấn về code xử lý dữ liệu (1 người xem)

  • Thread starter Thread starter auvfei
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

auvfei

Thành viên mới
Tham gia
29/6/10
Bài viết
28
Được thích
1
Chào các bác,

Em mới bập bõm làm quen với VBA và có 1 đoạn code dùng để loại bổ các dong khi có các giá trí tại 1 ô bằng với giá trị tại 1 vùng khác như sau:

Sub Xoadong()
Dim i As Long, j As Long
For i = 1 To 30
For j = 1 To 300
If Sheets("OUT").Range("A" & i).Value = Sheets("Stock").Range("A" & j).Value Then
Sheets("Stock").Rows(j).Delete
End If
Next j
Next i

End Sub

Tuy nhiên tốc độ sử lý quá chậm, các bác tư vấn giúp e cách viết 1 code khác có thể xử lý nhanh hơn khi e nâng vùng giá trị cho i và j

Tks các bác.
 
Chào các bác,

Em mới bập bõm làm quen với VBA và có 1 đoạn code dùng để loại bổ các dong khi có các giá trí tại 1 ô bằng với giá trị tại 1 vùng khác như sau:

Sub Xoadong()
Dim i As Long, j As Long
For i = 1 To 30
For j = 1 To 300
If Sheets("OUT").Range("A" & i).Value = Sheets("Stock").Range("A" & j).Value Then
Sheets("Stock").Rows(j).Delete
End If
Next j
Next i

End Sub

Tuy nhiên tốc độ sử lý quá chậm, các bác tư vấn giúp e cách viết 1 code khác có thể xử lý nhanh hơn khi e nâng vùng giá trị cho i và j

Tks các bác.
Bạn tìm hiểu về Dictionary để giảm số lần xử lý xét bằng nhau, bằng lệnh Exists
Dùng Union ghép các range thỏa điều kiện sau đó chỉ Delete 1 lần
 
Upvote 0
Giải thuật bài #1 là dò đủ từng ô của range đối chiếu với từng ô của range dữ liệu. Con số so sánh sẽ là N x M = 30 x 300 = 9000 lần.
Giải thuật này đồng thời cũng sai ở chỗ xóa từ trên xuống dưới làm cho chỉ số dòng bị lệch. Theo nguyên tắc xóa thì phải đi từ dưới lên trên.

Set rngDoiChieu = Sheets("OUT").Range("A1:A30")
For i = dongCuoi To dongDau
if Not IsError(Application.Match(Sheets("Stock").Range("A" & i).Value, rngDoiChieu, 0)) Then Sheets("Stock").Rows(i).Delete
Next i
' nếu cái range lớn quá thì chép nó ra mảng rồi dò, nhanh hơn được 1 chút

Chú: thớt không muốn nói tiếng cám ơn thì thôi, tôi cũng chả đòi hỏi. Còn cái trò Tkiểm soát hay Trong khách sạn gì đó thì xin trả lại cho thớt.
 
Upvote 0
@VetMini @HieuCD

Híc, sorry! giờ e mới quay lại đc với chủ đề củ mình.

Dù sao e cám ơn các bác đã nhiệt tình chỉ bảo. E cũng vừa mới tìm đc 1 đoạn code của bác @vanthinh3101 cũng trong diễn đàn này đáp ứng được với yêu cầu của mình.

E xin share lại mong các bác giải thích giúp vì e chẳng biết gì:

Sub xoa_dong()
Dim sArr1, sArr2, Tmp, I As Long

sArr1 = Application.Transpose(Sheets("OUT").Range("A1", Sheets("OUT").Range("A1").End(xlDown)))
sArr2 = Sheets("Stock").Range("A1", Sheets("Stock").Range("A1").End(xlDown)).Value

For I = UBound(sArr2, 1) To 1 Step -1
Tmp = Application.Match(sArr2(I, 1), sArr1, 0)
If IsNumeric(Tmp) = True Then
Sheets("Stock").Rows(I).Delete
End If
Next I

End Sub
 
Upvote 0
@VetMini @HieuCD

Híc, sorry! giờ e mới quay lại đc với chủ đề củ mình.

Dù sao e cám ơn các bác đã nhiệt tình chỉ bảo. E cũng vừa mới tìm đc 1 đoạn code của bác @vanthinh3101 cũng trong diễn đàn này đáp ứng được với yêu cầu của mình.

E xin share lại mong các bác giải thích giúp vì e chẳng biết gì:

Sub xoa_dong()
Dim sArr1, sArr2, Tmp, I As Long

sArr1 = Application.Transpose(Sheets("OUT").Range("A1", Sheets("OUT").Range("A1").End(xlDown)))
sArr2 = Sheets("Stock").Range("A1", Sheets("Stock").Range("A1").End(xlDown)).Value

For I = UBound(sArr2, 1) To 1 Step -1
Tmp = Application.Match(sArr2(I, 1), sArr1, 0)
If IsNumeric(Tmp) = True Then
Sheets("Stock").Rows(I).Delete
End If
Next I

End Sub
Đầu tiên là vòng lặp For... Next: phải chạy từ cuối lên đầu, đã có giải thích ở bài #3.
Tmp=Application.Match(sArr2(I, 1), sArr1, 0) --> tìm vị trí của giá trị sArr(I,1) trong mảng sArr1, kết quả là Tmp
IsNumeric(Tmp) = True -->nếu Tmp là dạng số thì có nghĩa sArr(I,1) bằng với 1 giá trị trong mảng sArr1 --> thực hiện thủ tục xóa dòng.
Mà bài này mình viết được cũng là nhờ chỉ bảo của bác @VetMini
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom