VBA và Cú pháp lệnh For Next

Liên hệ QC

Mr_cuong

Thành viên mới
Tham gia
15/11/07
Bài viết
33
Được thích
6
Kính Gửi các Anh Chị Thành Viên Diễn Đàn !
Xin vui lòng chỉ giúp:
Ví dụ
A1:A10 =("A")
A11:A20 =("B")
A21"A30 =("C")
Để Delete các dòng chứa ("B") tôi dùng lệnh như sau:
Sub DeL_RowB()
For i = 1 To 30
Range("A" & i).Select
If Selection.Value = ("B") Then
Rows("" & i).Select
Selection.Delete Shift:=xlUp
Else
End If
Next
End Sub

Nhưng nó chỉ Delete được 5 thay vì 10 dòng !?
Lệnh sai ở đâu, hoặc giải pháp nào để làm chuyện đó ?
Xin Chân thành cảm ơn đã chỉ giúp


 
Làm như vầy mới đúng.
PHP:
Sub DeL_RowB() For i = [A100].End(xlUp).Row to 1 Step -1  If Range("A" & i).Value = "(""B"")" Then Range("A" & i).EntireRow.Delete End If Next End Sub
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn Bạn Po_Pikachu
Nhưng sao tôi chép y code của bạn mà nó không chạy !?
 
Upvote 0
Như vậy là do bạn thuyết minh giá trị cột A sai rồi! Thử lại với code này xem!
PHP:
Sub DeL_RowB() For i = [A100].End(xlUp).Row to 1 Step -1  If Range("A" & i).Value = "B" Then Range("A" & i).EntireRow.Delete End If Next End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Po_Pikachu ơi !
Nhưng Biến [A100] sẽ thay đổi, giả sừ thay biến [A100] bằng giá trị taịn Range (B1) = 65536-COUNTBLANK(A:A)
Thì sẽ thay vào Code trên bằng cách nào ?
 
Upvote 0
Vậy thì bỏ dòng này vô.
PHP:
Sub DeL_RowB()
For i = Cells(Cells.Rows.Count, 1).End(xlUp).Row to 1 Step -1 
If Range("A" & i).Value = "B" Then
Range("A" & i).EntireRow.Delete
End If
Next
End Sub
Thân.
 
Upvote 0
Sao lại không chạy chứ Top #7 và Top #4 thật sự không khác gì nhau cả. Thông số đầu của For điều chỉ số dòng lớn nhất của cột A cả mà. Bạn đừng nói là dùng hết số lượng cột A luôn đó nha! Làm gì mà lắm thế! Nếu số liệu ở cột A liên tục không ngắt quảng thì có thể dùng dòng này để thay thế: For i = Range("A1").End(xlDown).Row To 1 Step -1 Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Những trường hợp như trên, các bạn hãy gửi luôn File VD lên để dễ làm và dễ kiểm chứng.
Chỉ có mấy dòng Code đơn giản, nhưng ở File người này thì chạy, người khác lại không chạy, như vậy có sự khác biệt khi chép Code vào File.
Vì thế tốt nhất hay gửi luôn File đình kèm.

Thân!

P/S : Bạn Po_Picachu nên khai báo biến để máy ai cũng chạy được (khi copy code). Nếu máy người khác thiết lập Require Variable Declacration thì sẽ báo lỗi đấy
 
Lần chỉnh sửa cuối:
Upvote 0
Hãy từ bỏ vòng lặp trong trường hợp này, chuyển sang phương thức FIND()

Để chúng ta thấy lợi hại của phương thức tìm kiếm, trong ví dụ của bạn có 30 dòng dữ liệu;
Nếu dùng vòng lặp, để tìm 10 dòng chứa ký tự 'B', ta phải mất 30 lần lặp lại từng records
Nếu dùng FIND() ta chỉ mất đúng mươi lần là ra kết quả;
Hơn nữa, nếu cần xóa những records này, ta nên xóa 1 lần thôi, sẽ nhanh hơn 10 lần xóa từng record;
Bạn tham khảo thêm tại đây, có gì thét méc hỏi tiếp nha!

http://giaiphapexcel.com/forum/showthread.php?t=14841
 
Upvote 0
Dùng cách này được không mọi người!
PHP:
Sub DeL_RowB()     Columns("A:A").Select     Selection.AutoFilter     Selection.AutoFilter Field:=1, Criteria1:="B"     Selection.SpecialCells(12).EntireRow.Delete     Selection.AutoFilter End Sub
@Mr Okebab: Bác có thể chỉ cho em chổ đặt Require Variable Declacration ở đâu không? Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Để chúng ta thấy lợi hại của phương thức tìm kiếm, trong ví dụ của bạn có 30 dòng dữ liệu;
Nếu dùng vòng lặp, để tìm 10 dòng chứa ký tự 'B', ta phải mất 30 lần lặp lại từng records
Nếu dùng FIND() ta chỉ mất đúng mươi lần là ra kết quả;
Hơn nữa, nếu cần xóa những records này, ta nên xóa 1 lần thôi, sẽ nhanh hơn 10 lần xóa từng record;
Bạn tham khảo thêm tại đây, có gì thét méc hỏi tiếp nha!

http://giaiphapexcel.com/forum/showthread.php?t=14841

Liệu giữa Find và Match có chênh lệch nhau nhiều không bác nhỉ ?? Dĩ nhiên là Find nhanh hơn rồi, tuy nhiên theo em nghĩ thì sự chênh lệch về thời gian là không nhiều lắm.


Thân!
 
Upvote 0
[Cải bướng] Vậy nếu thấy trong code có dòng "Option Explicit" thì bỏ đi. Vậy là được tuốt. Chúc vui. Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
[Cải bướng] Vậy nếu thấy trong code có dòng "Option Explicit" thì bỏ đi. Vậy là được tuốt.
Chúc vui.
Thân.

Những người như tớ và cậu thì nói làm gì, một là khai báo lại, hai là bỏ cái dòng đó đi.
Tuy nhiên có một số người lại không biết, họ chỉ biết Copy vào và chạy. Thấy báo lỗi lại la toáng lên, lúc đó tớ cũng khổ (phải xóa bài), mà cậu cũng khổ (phải hỏi đi hỏi lại, phải giải thích . . )
Và một điều quan trọng nữa là : Khi ta đưa Code lên diễn đàn, ấy là để rất nhiều người học tập, vì vậy nếu có được những dòng code chuẩn thì người đời bớt khổ--=0
Thân!
 
Upvote 0
Cũng là vòng lặp For...next

Trong bài "1 số vấn đề xử lý trên Form tôi cũng hỏi về vòng lặp For nhưng kg ai quan tâm (thật đáng buồn) nhân đọc bài này tôi viết câu hỏi vào đay may ra có người quan tâm:
Tôi có 1 sheet data gồm nhiều dòng, trong đó có những dòng mà data kg điền đầy ở các cột: Ví dụ cột A trống, cột B có, cột C, D,... trống, cột F có (dòng cộng tổng theo nhóm).
Bây giờ tôi dùng vòng lặp for để đưa số liệu lên listbox như sau:
....
For i=0 to lRow
if sheet1.cells(i+1,1)<>"" then
me.lbDs.addItem
.....
end if
next
[trong đó: lRow = sheet1.range("A1:A65432").end(xlUp).Row]
sô liệu trên sheet1 có 5 dòng từ dòng 1 đến dòng 5 là đầy đủ, dòng 6 thì cột B, cột F có số liệu còn các cột khác trống
và từ dòng 7 đến dòng thứ 300 lại có 1 dòng trống như dòng số 6...
Tuy nhiên kết quả của vòng For trên chỉ duyệt đến dòng thứ 6 là dừng lai và kg chạy hết
Tôi kg hiểu nguyên nhân. Mọi người giải thích giúp tôi nguyên nhân vì sao??
 
Upvote 0
Để chúng ta thấy lợi hại của phương thức tìm kiếm, trong ví dụ của bạn có 30 dòng dữ liệu;
Nếu dùng vòng lặp, để tìm 10 dòng chứa ký tự 'B', ta phải mất 30 lần lặp lại từng records
Nếu dùng FIND() ta chỉ mất đúng mươi lần là ra kết quả;
Hơn nữa, nếu cần xóa những records này, ta nên xóa 1 lần thôi, sẽ nhanh hơn 10 lần xóa từng record;
Bạn tham khảo thêm tại đây, có gì thét méc hỏi tiếp nha!

http://giaiphapexcel.com/forum/showthread.php?t=14841
Còn nếu dùng AutoFilter thì:
- Mất 1 lần lọc ra giá trị B
- Mất 1 lần xóa

Không biết món nào nhanh hơn đây ta?
 
Upvote 0
Xác định sai vị trí dòng cuối chứa dữ liệu

Bây giờ tôi dùng vòng lặp for để đưa số liệu lên listbox như sau:
....
For i=0 to lRow
if sheet1.cells(i+1,1)<>"" then
me.lbDs.addItem
.....
end if
next
[trong đó: lRow = sheet1.range("A1:A65432").end(xlUp).Row]
sô liệu trên sheet1 có 5 dòng từ dòng 1 đến dòng 5 là đầy đủ, dòng 6 thì cột B, cột F có số liệu còn các cột khác trống
và từ dòng 7 đến dòng thứ 300 lại có 1 dòng trống như dòng số 6...
Tuy nhiên kết quả của vòng For trên chỉ duyệt đến dòng thứ 6 là dừng lai và kg chạy hết
Tôi kg hiểu nguyên nhân. Mọi người giải thích giúp tôi nguyên nhân vì sao??

Theo tôi bạn đã xác định sai vị trí cuối có chứa dữ liệu. Có thể sửa lại thành:

lRow = sheet1.Cells(65432,1).End(xlUp).Row

-hvl-
 
Upvote 0
Trong bài "1 số vấn đề xử lý trên Form tôi cũng hỏi về vòng lặp For nhưng kg ai quan tâm (thật đáng buồn) nhân đọc bài này tôi viết câu hỏi vào đay may ra có người quan tâm:
Tôi có 1 sheet data gồm nhiều dòng, trong đó có những dòng mà data kg điền đầy ở các cột: Ví dụ cột A trống, cột B có, cột C, D,... trống, cột F có (dòng cộng tổng theo nhóm).
Bây giờ tôi dùng vòng lặp for để đưa số liệu lên listbox như sau:
....
For i=0 to lRow
if sheet1.cells(i+1,1)<>"" then
me.lbDs.addItem
.....
end if
next
[trong đó: lRow = sheet1.range("A1:A65432").end(xlUp).Row]
sô liệu trên sheet1 có 5 dòng từ dòng 1 đến dòng 5 là đầy đủ, dòng 6 thì cột B, cột F có số liệu còn các cột khác trống
và từ dòng 7 đến dòng thứ 300 lại có 1 dòng trống như dòng số 6...
Tuy nhiên kết quả của vòng For trên chỉ duyệt đến dòng thứ 6 là dừng lai và kg chạy hết
Tôi kg hiểu nguyên nhân. Mọi người giải thích giúp tôi nguyên nhân vì sao??


addItem gì bạn???

đổi lại thế này xem sao

For i=1 to lRow
if sheet1.cells(i,1).Value<>"" then
me.lbDs.addItem
.....
end if
next i
[trong đó: lRow = sheet1.range("A65432").end(xlUp).Row -lưu ý lệnh này phải đặt trước FOR]
 
Upvote 0
Web KT

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

Back
Top Bottom