Code Cắt Dòng Có Gia tri = 0 ??

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

solomon

Thành viên mới
Tham gia
17/11/07
Bài viết
8
Được thích
1
Mong các anh chị giúp đỡ! chân thành cảm ơn....!@2@
 

File đính kèm

Mong các anh chị giúp đỡ! chân thành cảm ơn....!@2@
Bạn thử đoạn code này xem sao:
PHP:
Sub MyDelRow()
Dim Zr, Zi As Integer
Zr = Sheets("Sheet1").[C65000].End(xlUp).Row
''//------------------------------------------------
For Zi = 2 To Zr
    If Sheets("Sheet1").Cells(Zi, 3).Value = 0 Then
        Sheets("Sheet1").Cells(Zi, 3).EntireRow.Delete
    End If
Next Zi
End Sub
Cẩn thận backup trước khi chạy code này nhé! Cột C phải là dữ liệu thô (nghĩa là chỉ chứa giá trị value). Nếu như cột C chức công thức như file của bạn thì hãy cẩn thận.
 
Lần chỉnh sửa cuối:
Upvote 0
Chú ý cách khai báo biến nhé.

1. Zr có kiểu gì vậy?
Zr = Sheets("Sheet1").[C65000].End(xlUp).Row
Nếu như bạn suy nghĩ thì Zr có kiểu Integer (may mà khai báo kiểu trên nên nó ko phải là Integer) mà số Row lớn hơn 32,### thì tính sao đây?
2. Giả sử Zr có trên 32,### dòng thì tính Zi (integer) tính sao đây?

Hình như điều này nói rất nhiều rồi thì phải.

Cảm ơn anh Hai2hai. Em viết do thói quen thôi (vì ít khi nào xài dữ liệu nhiều đến vậy!). Đúng ra khai báo biến là Long mới đúng.
 
Upvote 0
Tôi xin có vài ý kiến thế này:
1> Bài này nếu muốn dùng For duyệt qua các cell chứa số 0 để xóa dòng thì đáng lý ra phải quét từ dưới lên:
Mã:
Sub MyDelRow()
Dim Zr, Zi As Integer
Zr = Sheets("Sheet1").[C65000].End(xlUp).Row
''//------------------------------------------------
For Zi = [B] Zr to 2 Step -1[/B]
...............
Nói chung, cái gì liên quan đến XÓA DÒNG thì ta nên nghĩ ngay đến quét ngược (chứ không quét xuôi)... Nếu không hậu quả thật đáng tiếc
2> Phải biến công thức thành Value rồi mới được xóa, bằng không thì #REF! tùm lum
Tôi xin đề xuất 1 hướng khác:
1> Đầu tiên tạo dòng tiêu đề cho dử liệu (dòng 1)
2> Biến công thức thành giá trị:
Mã:
Set Rng = [A1].CurrentRegion
Rng.Value = Rng.Value
........
3> AutoFilter cột 3, điều kiện lọc = 0
Mã:
Rng.AutoFilter Field:=3, Criteria1:="0"
...................
4> Chọn các cell Visible và xóa chúng
Mã:
Rng.SpecialCells(12).EntireRow.Delete
Xong!
 
Upvote 0
Upvote 0
cảm ơn vì có được ý kiến của các anh cao thủ ! tôi học thên được thật nhiều ! theo như anh ndu631 thì code hoàn chỉnh phải như thế nào ? mình kém VBA lắm xin giúp tận tình !!! so thanks
 
Upvote 0
Bạn gé vô đây & lấy về nghiền ngẫm cùng với mình!

Cảm ơn anh ndu96081631, cái vụ CurrentRegion SpecialCells, em học hoài mà vẫn chưa thông!

Tổng quan về SpecialCells: http://webketoan.vn/forum/showthread.php?t=51963
Tổng quan về thuộc tính CurrentRegion http://webketoan.vn/forum/showthread.php?t=51977
http://webketoan.vn/forum/showthread.php?t=51962
http://webketoan.vn/forum/showthread.php?t=51961
Ở ta cũng có như khó đọc hơn!

' * * * * * * * * ' * * * * * * * * ' * * * * * * * *'

To NDU
Nói chung, cái gì liên quan đến XÓA DÒNG thì ta nên nghĩ ngay đến quét ngược (chứ không quét xuôi)... Nếu không hậu quả thật đáng tiếc
Nếu xóa vùng thì có thể gây tiêu trang tính luôn;
Còn xóa dòng, theo mình nghỉ nó chỉ bỏ sót một khi có 2 dòng trống liền kề nhau mà thôi. Không biết các bạn thấy sao?
 
Lần chỉnh sửa cuối:
Upvote 0
cảm ơn vì có được ý kiến của các anh cao thủ ! tôi học thên được thật nhiều ! theo như anh ndu631 thì code hoàn chỉnh phải như thế nào ? mình kém VBA lắm xin giúp tận tình !!! so thanks
Thì bạn ráp các code tôi nêu ở trên, tuần tự từ trên xuống dưới, như vầy đây:
PHP:
Sub Xoadong()
 Dim Rng As Range
 Set Rng = [A1].CurrentRegion
 Rng.Value = Rng.Value
 Rng.AutoFilter Field:=3, Criteria1:="0"
 Rng.SpecialCells(12).EntireRow.Delete
End Sub
Và chạy code!
Thừ trong file đính kèm xem
 

File đính kèm

Upvote 0
Theo code này thì khi chạy sub xoadong thì nó xóa luôn cả dòng tiêu đề. Vậy để code ko xóa dòng tiêu đề thì phải sửa code như thế nào?
Mã:
Rng.SpecialCells([B]12[/B]).EntireRow.Delete
Cho em hỏi Số 12 trong dòng code đó nghĩa là gì?
 
Upvote 0
Theo code này thì khi chạy sub xoadong thì nó xóa luôn cả dòng tiêu đề. Vậy để code ko xóa dòng tiêu đề thì phải sửa code như thế nào?
Vì tôi cố tính làm thế! Cái tiêu đề do tôi thêm vào nên cuối cùng phải xóa luôn cho giống với dử liệu gốc
Còn như bạn muốn giữ lại tiêu đề thì... chuyện nhỏ! Để ý vùng Rng bao gồm luôn tiêu đề, vậy bạn chỉ cần định lại vùng này dịch xuống dưới 1 dòng là xong (dùng Offset để dịch)
Thay:
Rng.SpecialCells(12).EntireRow.Delete
thành:
Rng.Offset(1).SpecialCells(12).EntireRow.Delete
thêm nữa: do tiêu đề vẩn còn nên chế độ AutoFilter vẩn tồn tại, ta thêm dòng:
ActiveSheet.AutoFilterMode = False
Sẽ "đẹp" hơn!
Toàn bộ code là:
Mã:
Sub Xoadong()
 Dim Rng As Range
 Set Rng = [A1].CurrentRegion
 Rng.Value = Rng.Value
 Rng.AutoFilter Field:=3, Criteria1:="0"
 Rng.[B]Offset(1)[/B].SpecialCells(12).EntireRow.Delete
[B] ActiveSheet.AutoFilterMode = False[/B]
End Sub
(Chổ in đậm là chổ vừa thêm vào)
Mã:
Rng.SpecialCells([B]12[/B]).EntireRow.Delete
Cho em hỏi Số 12 trong dòng code đó nghĩa là gì?
SpecialCells(12) tương đương với việc ta bấm Ctrl + G\Special\Visible cells only
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh nhiều, specialcell(12) nghĩa là xóa những dòng nhìn thấy còn những dòng bị ẩn đi do autofill thì ko đụng đến?
ActiveSheet.AutoFilterMode = False
Em làm thiếu cái này nên có dịch nó cũng xóa luôn dòng tiêu đề nên mới hỏi anh.
 
Upvote 0
Cảm ơn anh nhiều, specialcell(12) nghĩa là xóa những dòng nhìn thấy còn những dòng bị ẩn đi do autofill thì ko đụng đến?
ActiveSheet.AutoFilterMode = False
Em làm thiếu cái này nên có dịch nó cũng xóa luôn dòng tiêu đề nên mới hỏi anh.
Mấy cái số trong Special Cells là do tôi tự nghĩ ra và thí nghiệm! Thật ra nếu bạn record macro quá trình chọn vùng bằng Goto thì nó không ghi như vậy!
Ví dụ:
Chọn vùng Visible cells only thì record macro nó ghi là:
Selection.SpecialCells(xlCellTypeVisible).Select
Tôi tưởng tượng và đoán mò các tùy chọn trong hộp Goto có thể thay bằng số. Nếu đếm từ trên xuống từ trái qua phải thì:
-Comments = 1
-Contants = 2
-Formulas = 3

vân vân và vân vân
Bạn tự mình suy đoán và thí nghiệm tiếp nhé
Nói thêm: Nếu viết SpecialCells( Number) thì ta có thể phán đoán số ta cần là bao nhiêu (đếm trong hộp Goto) chứ còn viết rõ ràng: xlCellTypeVisible thì trời nào nhớ nổi, sai cú pháp là chuyện thường
 
Upvote 0
Bác tư duy cao quá
- Em ngôi đếm không hiểu sao cái Visible cells only là = 13 bác NDU ạh
 
Upvote 0
Bác tư duy cao quá
- Em ngôi đếm không hiểu sao cái Visible cells only là = 13 bác NDU ạh
Có lẽ mục "Object" không được tính = 7 (Row Dif... mới là 7) ---> Nếu bỏ cái này thì Visible cells only =12 là đúng rồi
Bởi vậy tôi mới nói phải... THÍ NGHIỆM (bằng cách record macro)
Cũng nói thêm rằng chẳng ai viết
Range("C4").SpecialCells(5).Select
mà người ta sẽ viết:
Range("C4").CurrentRegion.Select
(dù cho kết quả như nhau)
 
Upvote 0
He he
Cứ chịu khó đọc lại các bài Anh viết thì học được nhiều thứ?

Cám ơn Anh
 
Upvote 0
Web KT

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

Back
Top Bottom