Code xoá "rác trắng" trong bảng tính ?

Liên hệ QC

TrungChinhs

Thành viên tích cực
Tham gia
18/2/08
Bài viết
1,475
Được thích
2,469
Nghề nghiệp
Công chức
Trong bảng tính có các ký tự không hiển thị trong cel như các ký tự rỗng, ký tự trắng, số 0 (khi tắt chức năng hiển thị); các ký tự này trong Special không được coi là Blanks nhưng trong Autofilter thì lại được coi là Blanks, Tôi tạm gọi các ký tự này là "rác trắng".

Có thể do cách lấy dữ liệu hoặc lý do nào đó mà trong bảng dữ liệu nguồn của tôi có rất nhiều loại "rác này" gây khó khăn cho việc lọc, xử lý dữ liệu vì không biết đâu là rỗng (""), là ký tự trắng (" ") và đâu là số 0, Tôi thường phải dùng vòng lặp để xoá nhưng với cách này máy chạy rất chậm
ví dụ:
PHP:
Sub XoaRac()
    For i = 5 To 10000
    For j = 5 To 50
        If Cells(i, j) = 0 Then Cells(i, j).ClearContents
    Next: Next
End Sub
Bạn nào có cách xoá nhanh hơn giúp mình với: chỉ cách làm trực tiếp trên Excel (cách làm nhanh hơn), có thể viết hộ code hoặc gợi ý giải pháp. Thanks!
 
Ý mình là lúc đầu file chỉ có vài dòng thôi,mà sau khi xài code xong ,autofilter đã mất và bị sổ ra rất nhiều dòng.Nếu dùng autofilter lại theo điều kiện cũ thì sẽ mất đi row 69(HWR0000129)
Cho nên mình không muốn động đến phần đã được lọc , giờ đang kẹt cái "" không cách nào xóa được nếu không dùng autofilter ^^.
Thôi cám ơn nhiều nhé,mình sẽ học hỏi thêm;;;;;;;;;;;
Tôi hiểu ý bạn! Cũng đã xem lại file mà chẳng hiểu tại sao người ta lọc được như thế!
Hay là thế này: Bạn thử Show all dử liệu, xong Filter lại bằng tay xem có được như thế không?
Nếu bạn có thể làm bằng tay được vụ này thì tôi sẽ viết lại code, bảo tồn mọi thứ đã Filter cho bạn!
 
Upvote 0
hì hì ,đó là vì autofilter trước rồi mới thêm vào dữ liệu cho row 69 .
 
Upvote 0
hì hì ,đó là vì autofilter trước rồi mới thêm vào dữ liệu cho row 69 .
Ẹc... Ẹc... Vậy cũng nói!
Thế thì trước khi chạy code, bạn cut dong 69 ấy mang đi nơi khác ---> Chạy code xong, bạn lại AutoFilter theo điều kiện ban đầu và dời dử liệu đã chuyển vào dòng 69 (cũng như bạn đã từng nhập liệu sau khi Filter vậy) ---> Có khó khăn gì đâu
 
Upvote 0
vì file đó là của người khác kéo từ hệ thống ra,bản chất nó đã vậy, mình muốn dùng code để xác định PrintArea,và mình dùng subtotal(3,...) để xác định giới hạn của column và dùng End(xlUp) để xác định row ,Nhưng lại gặp dữ liệu rác nên counta không xác định đúng mục tiêu -+*/
Sub vinh()
Dim i As Byte
Dim j As Long
Dim rng As Range
Application.ScreenUpdating = False
Application.DisplayAlerts = False

For i = 1 To 100
If Application.WorksheetFunction.Subtotal(3, Range(Cells(1, i), Cells(500, i))) = 0 Then Exit For
Next
i = i
j = [a65500].End(xlUp).Row

With ActiveSheet.PageSetup
.PrintArea = Range([a1], Cells(j + 1, i + 1)).Address
.CenterFooter = "Page &P of &N"
.RightFooter = "&D"
.LeftMargin = Application.InchesToPoints(0.2)
.RightMargin = Application.InchesToPoints(0.2)
.TopMargin = Application.InchesToPoints(0.5)
.BottomMargin = Application.InchesToPoints(0.5)
.HeaderMargin = Application.InchesToPoints(0.3)
.FooterMargin = Application.InchesToPoints(0)
.PrintComments = xlPrintNoComments
.PrintQuality = 1200
.CenterHorizontally = True
.Orientation = xlLandscape
.PaperSize = xlPaperA4
.FirstPageNumber = xlAutomatic
.Order = xlDownThenOver
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintErrors = xlPrintErrorsDisplayed
End With
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Mình lấy thí dụ như file đính kèm, anh xem giúp nhé :D
 

File đính kèm

Upvote 0
Đúng vậy! Nhưng trường hợp này đã được đề cập từ đầu rồi bạn à: Đây là dử liệu thô, không có công thức!

Như vậy, đến đây về cơ bản cách của thày ndu dùng Auto Filter tương đối là OK, chỉ lăn tăn có thể có trường hợp cả dữ liệu thô và có công thức lẫn lộn nhau thôi. Em chưa có kỹ năng nhiều, nhưng em nghĩ giữa dữ liệu thô (Value) và công thức nó khác nhau ở dấu bằng (=), nếu dựa vào cái này có thể nhận biết, giải quyết vấn đề được không ah?
 
Upvote 0
Như vậy, đến đây về cơ bản cách của thày ndu dùng Auto Filter tương đối là OK, chỉ lăn tăn có thể có trường hợp cả dữ liệu thô và có công thức lẫn lộn nhau thôi. Em chưa có kỹ năng nhiều, nhưng em nghĩ giữa dữ liệu thô (Value) và công thức nó khác nhau ở dấu bằng (=), nếu dựa vào cái này có thể nhận biết, giải quyết vấn đề được không ah?

Được chứ, để chọn ô dữ liệu Value ta sử dụng Specialcells(2) còn để chọn ô dữ liệu Function ta sử dụng Specialcells(3)
Bạn tìm hiểu Specialcells tại đây http://www.giaiphapexcel.com/forum/...ting-the-Most-Out-of-Ranges&p=63004#post63004
 
Upvote 0
Thế thì bài toán được giải quyết triệt để mà chẳng cần Code gì phức tạp, mình kết hợp AutoFilter với Go to, cụ thể:
- Đầu tiên mình dùng Auto Filter lọc ra những ô trắng và những ô không (Bước này chưa phân biệt dữ liệu thô hay không).
- Bước 2 bôi đen tất cả vùng lọc tại bước 1 thực hiện Ctrl + G/Special/Constants/delete là xong
 
Upvote 0
Thế thì bài toán được giải quyết triệt để mà chẳng cần Code gì phức tạp

Phần nhiều câu lệnh trong VBA là thực hiện các lệnh tương tự như ta làm thủ công. Người ta nghiên cứu viết code là để tự động hóa các công việc đó khi ứng dụng cho những trường hợp dữ liệu lớn (nhiều dòng, nhiều cột) mà nếu làm thủ công thì sẽ mất nhiều thời gian hơn và đặc biệt khi bạn thiết kế một chương trình mà gặp trường hợp này nếu không dùng VBA thì chương trình của bạn tèo luôn.
 
Lần chỉnh sửa cuối:
Upvote 0
Phần nhiều câu lệnh trong VBA là thực hiện các lệnh tương tự như ta làm thủ công. Người ta nghiên cứu viết code là để tự động hóa các công việc đó khi ứng dụng cho những trường hợp dữ liệu lớn (nhiều dòng, nhiều cột) mà nếu làm thủ công thì sẽ mất nhiều thời gian hơn và đặc biệt khi bạn thiết kế một chương trình mà gặp trường hợp này nếu không dùng VBA thì chương trình của bạn tèo luôn.
Vâng, quả là từng trường hợp mà ta áp dụng. Xin bác cho em hỏi đến giờ đã có Code VBA nào hoàn chỉnh đáp ứng yêu cầu của Chủ đề mà tránh được Funtion chưa ah?
 
Upvote 0
Web KT

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

Back
Top Bottom