Xóa dữ liệu theo chuỗi bằng VBA (1 người xem)

Liên hệ QC

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

nhathuyha

Thành viên mới
Tham gia
9/3/16
Bài viết
26
Được thích
0
Hi mọi người !
Mình có bài toán thế này
Ở sheet dữ liệu có các mã số seri vd như FN25683654, FN36894565, FN26856756... vv
Bây giờ , mình cần xóa những số seri( lấy 4 số sau chữ FN) có số nhỏ hơn 3000
Vd: FN(2568)3654 và FN(2685)6756 sẽ bị xóa
còn FN(3689)4565 sẽ giữ lại vì có 4 số sau chữ FN là 3689 > 3000

P/S: Dữ liệu của số seri là vô cùng lớn, nên các bạn giúp mình bằng cách đếm số dữ liệu như tìm dòng cuối (LastRow) rồi mới chạy từ 1 đến LastRow

Thanks mọi người đã đọc!
 

File đính kèm

Hi hi :)
Xài công thức được hông?
Mã:
=IF(1*MID(A2,3,4)<3000,"Giữ lại","Loại bỏ")
50,000 dòng vẫn chạy rầm rầm.
 
Upvote 0
Hi mọi người !
Mình có bài toán thế này
Ở sheet dữ liệu có các mã số seri vd như FN25683654, FN36894565, FN26856756... vv
Bây giờ , mình cần xóa những số seri( lấy 4 số sau chữ FN) có số nhỏ hơn 3000
Vd: FN(2568)3654 và FN(2685)6756 sẽ bị xóa
còn FN(3689)4565 sẽ giữ lại vì có 4 số sau chữ FN là 3689 > 3000

P/S: Dữ liệu của số seri là vô cùng lớn, nên các bạn giúp mình bằng cách đếm số dữ liệu như tìm dòng cuối (LastRow) rồi mới chạy từ 1 đến LastRow

Thanks mọi người đã đọc!
Sub ABC()
Dim sArr(), i As Long, Res(), k As Long, tmp
sArr = Range("A2", [A65536].End(3)).Value
ReDim Res(1 To UBound(sArr), 1 To 1)
For i = 1 To UBound(sArr)
tmp = Replace(sArr(i, 1), "FN", "")
tmp = Val(Left(tmp, 4))
If tmp > 3000 Then
k = k + 1
Res(k, 1) = sArr(i, 1)
End If
Next
[D2].Resize(k, 1) = Res
End Sub
 
Upvote 0
Sub ABC()
Dim sArr(), i As Long, Res(), k As Long, tmp
sArr = Range("A2", [A65536].End(3)).Value
ReDim Res(1 To UBound(sArr), 1 To 1)
For i = 1 To UBound(sArr)
tmp = Replace(sArr(i, 1), "FN", "")
tmp = Val(Left(tmp, 4))
If tmp > 3000 Then
k = k + 1
Res(k, 1) = sArr(i, 1)
End If
Next
[D2].Resize(k, 1) = Res
End Sub
Hi bạn, cái này xóa luôn dòng bạn ơi.. chứ không tách nó sang cột D.. bạn giúp mình tí nhé
 
Upvote 0
Hi mọi người !
Mình có bài toán thế này
Ở sheet dữ liệu có các mã số seri vd như FN25683654, FN36894565, FN26856756... vv
Bây giờ , mình cần xóa những số seri( lấy 4 số sau chữ FN) có số nhỏ hơn 3000
Vd: FN(2568)3654 và FN(2685)6756 sẽ bị xóa
còn FN(3689)4565 sẽ giữ lại vì có 4 số sau chữ FN là 3689 > 3000

P/S: Dữ liệu của số seri là vô cùng lớn, nên các bạn giúp mình bằng cách đếm số dữ liệu như tìm dòng cuối (LastRow) rồi mới chạy từ 1 đến LastRow

Thanks mọi người đã đọc!
bạn chạy code
Mã:
Sub XoaDong()
Dim Arr(), i As Long, Rng As Range
Arr = Range("A1", Range("A65536").End(xlUp)).Value
on error resume next
For i = 2 To UBound(Arr)
    If Val(Mid(Arr(i, 1), 3, 4)) < 3000 Then
        If Rng Is Nothing Then
            Set Rng = Range("A" & i)
        Else
            Set Rng = Union(Rng, Range("A" & i))
        End If
    End If
Next
Rng.Select
Selection.EntireRow.Delete
Range("A1").Select
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hi mọi người !
Mình có bài toán thế này
Ở sheet dữ liệu có các mã số seri vd như FN25683654, FN36894565, FN26856756... vv
Bây giờ , mình cần xóa những số seri( lấy 4 số sau chữ FN) có số nhỏ hơn 3000
Vd: FN(2568)3654 và FN(2685)6756 sẽ bị xóa
còn FN(3689)4565 sẽ giữ lại vì có 4 số sau chữ FN là 3689 > 3000

P/S: Dữ liệu của số seri là vô cùng lớn, nên các bạn giúp mình bằng cách đếm số dữ liệu như tìm dòng cuối (LastRow) rồi mới chạy từ 1 đến LastRow

Thanks mọi người đã đọc!

Nếu tôi làm bài này thì tôi sẽ dùng Advanced Filter theo điều kiện ??2* để lọc ra những dữ liệu cần xử lý. Tiếp theo đó, muốn làm gì là tùy bạn
Chỉ gợi ý chứ tôi chưa làm cụ thể, bởi yêu cầu của bạn chưa rõ ràng. Lúc thì bạn nói "cần xóa" (mà cũng chưa nói rõ là xóa nguyên dòng hay xóa dữ liệu), lúc thì bạn nói "tách sang cột D". Vậy cuối cùng là bạn muốn là gì? Cụ thể chút đi
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu tôi làm bài này thì tôi sẽ dùng Advanced Filter theo điều kiện ??2* để lọc ra những dữ liệu cần xử lý. Tiếp theo đó, muốn làm gì là tùy bạn
Chỉ gợi ý chứ tôi chưa làm cụ thể, bởi yêu cầu của bạn chưa rõ ràng. Lúc thì bạn nói "cần xóa" (mà cũng chưa nói rõ là xóa nguyên dòng hay xóa dữ liệu), lúc thì bạn nói "tách sang cột D". Vậy cuối cùng là bạn muốn là gì? Cụ thể chút đi

dạ em muốn xóa luôn dòng đó anh , anh giúp em với --=0--=0
 
Upvote 0
Nếu tôi làm bài này thì tôi sẽ dùng Advanced Filter theo điều kiện ??2* để lọc ra những dữ liệu cần xử lý. Tiếp theo đó, muốn làm gì là tùy bạn
Chỉ gợi ý chứ tôi chưa làm cụ thể, bởi yêu cầu của bạn chưa rõ ràng. Lúc thì bạn nói "cần xóa" (mà cũng chưa nói rõ là xóa nguyên dòng hay xóa dữ liệu), lúc thì bạn nói "tách sang cột D". Vậy cuối cùng là bạn muốn là gì? Cụ thể chút đi

hi anh
Nếu chỉ dùng điều kiện 2* thì em không cần so sánh đến 4 số sau chữ FN mà chỉ cần lấy 1 chữ số thôi và so sánh nó với 3.
Và dữ liệu sau khi anh lọc được thì em muốn xóa luôn dòng vì nếu chỉ xóa dữ liệu ô seri thì các ô dữ liệu 1 và ô dữ liệu 2 đi kèm số seri cũng không có ý nghĩa gì nữa anh.

Cảm ơn anh !
 
Upvote 0
@ nhathuyha:
Tôi thấy bạn xưng hô, chào hỏi như vậy là không "ổn". Trong diễn đàn này có những thành viên nhiều tuổi (khoảng 60 tuổi) đó bạn.
Hi mọi người !
Thanks mọi người
hi anh
...

Bạn đọc lại các bài trên rồi để ý "phản ứng" của mọi người với bạn xem...
 
Upvote 0
Hi bạn, cái này xóa luôn dòng bạn ơi.. chứ không tách nó sang cột D.. bạn giúp mình tí nhé
Sub abc()
Dim sArr(), i As Long, Res(), k As Long
sArr = Range("A2", [A65536].End(3)).Value
For i = 1 To UBound(sArr)
If Val(Mid(sArr(i, 1), 3, 4)) > 3000 Then
k = k + 1
Res(k, 1) = sArr(i, 1)
End If
Next
[A2].Resize(UBound(Res)) = Res
End Sub
 
Upvote 0
bạn chạy code
Mã:
Sub XoaDong()
Dim Arr(), i As Long, Rng As Range
Arr = Range("A1", Range("A65536").End(xlUp)).Value
on error resume next
For i = 2 To UBound(Arr)
    If Val(Mid(Arr(i, 1), 3, 4)) < 3000 Then
        If Rng Is Nothing Then
            Set Rng = Range("A" & i)
        Else
            Set Rng = Union(Rng, Range("A" & i))
        End If
    End If
Next
Rng.Select
Selection.EntireRow.Delete
Range("A1").Select
End Sub

Hi bạn.. code của bạn rất OK, nhưng mình hỏi thêm 1 chút nhé
Nếu mình để button nhấn xóa bên sheet 1 và dữ liệu cần xóa thì bên sheet 2.. vậy thì trong đoạn code cần bổ sung thông số gì để biết rằng sheets cần làm việc xóa là sheet 2.
Mình nhớ mang máng là khai báo ActiveWorkbook gì đó thì phải
 
Upvote 0
Hi bạn.. code của bạn rất OK, nhưng mình hỏi thêm 1 chút nhé
Nếu mình để button nhấn xóa bên sheet 1 và dữ liệu cần xóa thì bên sheet 2.. vậy thì trong đoạn code cần bổ sung thông số gì để biết rằng sheets cần làm việc xóa là sheet 2.
Mình nhớ mang máng là khai báo ActiveWorkbook gì đó thì phải
1/như nhiều bạn góp ý, trên diễn đàn bạn không nên dùng từ "Hi, Ok..."
2/code VBA không có chuyện nhớ mang máng, gỏ nhầm lệnh nhẹ thì không chạy, nặng thì dữ liệu bị xáo trộn hoặc mất hết không phục hồi được
3/ muốn dùng code VBA thì phải chịu khó học các lệnh các thao tác cơ bản, để biết code làm gì trong tập tin và tùy chỉnh nó khi cần.
Mã:
Sub XoaDong()
Dim Arr(), i As Long, Rng As Range
[COLOR=#000000]Application.ScreenUpdating = False[/COLOR]
Sheets("sheet2").Select
Arr = Range("A1", Range("A65536").End(xlUp)).Value
on error resume next
For i = 2 To UBound(Arr)
    If Val(Mid(Arr(i, 1), 3, 4)) < 3000 Then
        If Rng Is Nothing Then
            Set Rng = Range("A" & i)
        Else
            Set Rng = Union(Rng, Range("A" & i))
        End If
    End If
Next
Rng.Select
Selection.EntireRow.Delete
Sheets("sheet1").Select
[COLOR=#000000]Application.ScreenUpdating = True[/COLOR]
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
hi anh
Nếu chỉ dùng điều kiện 2* thì em không cần so sánh đến 4 số sau chữ FN mà chỉ cần lấy 1 chữ số thôi và so sánh nó với 3.

Một số 4 chữ số được cấu thành từ số 2 đứng đằng trước và 3 chữ số khác đứng sau thì bạn nghĩ trong chúng có số nào > 3000 không?
Đầy đủ thì:
- 0XYZ (với XYZ là 3 chữ số tùy ý), tìm xem có số nào >3000 không?
- 1XYZ (với XYZ là 3 chữ số tùy ý), tìm xem có số nào >3000 không?
- 2XYZ (với XYZ là 3 chữ số tùy ý), tìm xem có số nào >3000 không?
-----------------------------------------------------------------
Chỉ là gợi ý sơ qua thôi chứ thích làm sao là tùy bạn
(tôi thì luôn muốn hướng tới sự đơn giản nhất có thể)
 
Upvote 0
Một số 4 chữ số được cấu thành từ số 2 đứng đằng trước và 3 chữ số khác đứng sau thì bạn nghĩ trong chúng có số nào > 3000 không?
Đầy đủ thì:
- 0XYZ (với XYZ là 3 chữ số tùy ý), tìm xem có số nào >3000 không?
- 1XYZ (với XYZ là 3 chữ số tùy ý), tìm xem có số nào >3000 không?
- 2XYZ (với XYZ là 3 chữ số tùy ý), tìm xem có số nào >3000 không?
-----------------------------------------------------------------
Chỉ là gợi ý sơ qua thôi chứ thích làm sao là tùy bạn
(tôi thì luôn muốn hướng tới sự đơn giản nhất có thể)

Dạ cảm ơn anh.. Sai sót này là do em không chú ý, nếu đề bài là số 4321 thì mình phải so sánh với 3 số còn lại.
Do em vội quá nên chỉ đưa số 3000 làm tượng trưng.
 
Upvote 0
1/như nhiều bạn góp ý, trên diễn đàn bạn không nên dùng từ "Hi, Ok..."
2/code VBA không có chuyện nhớ mang máng, gỏ nhầm lệnh nhẹ thì không chạy, nặng thì dữ liệu bị xáo trộn hoặc mất hết không phục hồi được
3/ muốn dùng code VBA thì phải chịu khó học các lệnh các thao tác cơ bản, để biết code làm gì trong tập tin và tùy chỉnh nó khi cần.
Vâng, em xin nhận tất cả đóng góp ý kiến của mọi người.
Chân thành cảm ơn các anh/chị đã giúp đỡ em rất nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ cảm ơn anh.. Sai sót này là do em không chú ý, nếu đề bài là số 4321 thì mình phải so sánh với 3 số còn lại.
Do em vội quá nên chỉ đưa số 3000 làm tượng trưng.

Tôi vẫn dùng Advanced Filter:
Mã:
Sub Test()
  Dim wks As Worksheet
  Set wks = Worksheets("[COLOR=#ff0000]du lieu[/COLOR]")  '<--- màu đỏ là tên sheet chứa dữ liệu
  wks.Range("IV2").Value = "=--Mid(A2,3,4)<3000"
  With wks.Range("[COLOR=#ff0000]A1:C60000[/COLOR]")  '<---- màu đỏ là địa chỉ vùng dữ liệu
    .AdvancedFilter 1, wks.Range("IV1:IV2")
    .Offset(1).SpecialCells(12).EntireRow.Delete
    .Parent.ShowAllData
  End With
  wks.Range("IV2").ClearContents
End Sub
Chỉ cần quan tâm 2 chỗ màu đỏ và sửa lại cho phù hợp với file thực tế, còn lại để code tự lo
 
Upvote 0
Tôi vẫn dùng Advanced Filter:
Mã:
Sub Test()
  Dim wks As Worksheet
  Set wks = Worksheets("[COLOR=#ff0000]du lieu[/COLOR]")  '<--- màu đỏ là tên sheet chứa dữ liệu
  wks.Range("IV2").Value = "=--Mid(A2,3,4)<3000"
  With wks.Range("[COLOR=#ff0000]A1:C60000[/COLOR]")  '<---- màu đỏ là địa chỉ vùng dữ liệu
    .AdvancedFilter 1, wks.Range("IV1:IV2")
    .Offset(1).SpecialCells(12).EntireRow.Delete
    .Parent.ShowAllData
  End With
  wks.Range("IV2").ClearContents
End Sub
Chỉ cần quan tâm 2 chỗ màu đỏ và sửa lại cho phù hợp với file thực tế, còn lại để code tự lo
Dạ em cảm ơn thầy rất nhiều.. vậy nếu bây giờ em có bài toán thể này.Là lọc những dữ liệu trùng nhiều lần và chỉ lọc lấy 1 dòng duy nhất thỏa mãn điều kiện nó xuất hiện sau cùng thì có làm Advanced Filter được không thầy ?
Dạ em cảm ơn thầy.Nếu có thể thầy xem file đính kèm rồi hướng dẫn lại em 1 chút được không thầy.
 

File đính kèm

Upvote 0
Dạ em cảm ơn thầy rất nhiều.. vậy nếu bây giờ em có bài toán thể này.Là lọc những dữ liệu trùng nhiều lần và chỉ lọc lấy 1 dòng duy nhất thỏa mãn điều kiện nó xuất hiện sau cùng thì có làm Advanced Filter được không thầy ?
Dạ em cảm ơn thầy.Nếu có thể thầy xem file đính kèm rồi hướng dẫn lại em 1 chút được không thầy.

Bài này bạn dùng PivotTable, tổng hợp theo MAX cột Time, xoẹt cái là xong chứ cần gì code
 
Upvote 0
Web KT

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

Back
Top Bottom