Sử dụng các vòng lặp? (1 người xem)

Liên hệ QC

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

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia
13/6/06
Bài viết
7,201
Được thích
24,664
Trong khi xử lý dữ liệu, chúng ta thường sử dụng các vòng lặp để tính toán, xử lý. VBA có nhiều dạng lặp như:

- For .... Next

- Do .... Loop (và các dạng tương tự)

- For Each ... Next
...


Như vậy, với một bài toán như tôi thấy mỗi người sử dụng 1 kiểu. Vì vậy tôi xin hỏi các cao thủ là áp dụng kiểu gì (trường hợp cụ thể) mà tối ưu nhất, tính toán nhanh nhất?

Xin cám ơn!
 
Visual Basic 6.0 đã viết:
* Các vòng lặp Do ..... Loop
Thi hành một khối lệnh với số lần lặp không xác định trước, một biểu thức điều kiện dùng để so sánh quyết định vòng lặp có tiếp tục hay không.
* For .... Next
Thi hành một khối lệnh với số lần lặp được xác định trước.
* For Each .... Next
For Each <Phần tử> In <nhóm>
<Khối lệnh>
Next <phần tử>
Tương tự như vòng lặp For ... Next, nhưng nó lặp khối lệnh theo số phần tử của một tập hợp các đối tượng hay một mảng thay vì theo số lần lặp xác định. Vòng lặp này tiện lợi khi ta không biết chính xác bao nhiêu phần tử trong tập hợp.
- Để dùng For Each .... Next: Phần tử trong tập hợp chỉ có thể là biến variant, biến Object hay một đối tượng trong Object Browser.
- Không dùng For Each ... Next: với mảng chứa kiểu tự định nghĩa vì Variant không chứa kiểu tự định nghĩa.
Ngoài ra còn có vòng lặp While ... Wend: Vòng lặp này tương tự như Do ... While nhưng chỉ thoát khi biểu thức điều kiện sai và không thể sử dụng lệnh Exit để thoát khỏi vòng lặp.
 
PhanTuHuong đã viết:
Trong khi xử lý dữ liệu, chúng ta thường sử dụng các vòng lặp để tính toán, xử lý. VBA có nhiều dạng lặp như:

- For .... Next

- Do .... Loop (và các dạng tương tự)

- For Each ... Next
...


Như vậy, với một bài toán như tôi thấy mỗi người sử dụng 1 kiểu. Vì vậy tôi xin hỏi các cao thủ là áp dụng kiểu gì (trường hợp cụ thể) mà tối ưu nhất, tính toán nhanh nhất?

Xin cám ơn!

Anh xem 3 ví dụ dưới đây anh sẽ hiểu cách dùng nó trong các trường hợp nào


For .... Next

Mã:
Sub For_Next_ByVal

Dim i As Long
Dim n As Long

n = 10

[COLOR="SeaGreen"]'For - Vòng lặp cố định 10[/COLOR]

For i = 1 To n
   MsgBox i,,"Test" 
   if i = 5 Then n=n+1 [COLOR="SeaGreen"]'Tăng vòng lặp lên 1. Nhưng For vẫn chỉ chạy đến 10[/COLOR]    
Next i

End Sub

For Each .... Next

Mã:
Sub For_Next_ByObjectOrArray

Dim Cell As Range
Dim oRg As Range

Set oRg = Range("A1:C10")
'Set oRg = Selection 'Khi không biết trước bao nhiêu đối tượng trong một tập hợp

'Thực hiện 30 vòng lặp cố định (3x10)

For Each Cell In oRg
    MsgBox Cell.Address,,"Test" 
Next

Set Cell = Nothing
Set oRg = Nothing

End Sub

Do .... Loop
Mã:
Sub Do_Loop_ByChangeVal

Dim i As Long
Dim n As Long

[COLOR="SeaGreen"]'Do - Vòng lặp không giới hạn[/COLOR]
Do
   i = i + 1   
    MsgBox i,,"Test" 
    if i = 5 Then n=n+1 'Tăng vòng lặp lên 1
Loop Until i<n

End Sub

Ngày trước em làm báo cáo động mất cả buổi chiều chỉ vì cái này đấy.
 
Lần chỉnh sửa cuối:
Cám ơn mọi ý kiến đóng góp!
Đúng là từ trước đến nay tôi vẫn hay sử dụng vòng lặp For ... Next như một thói quen (đương nhiên trong đó có sử dụng cả một số điều kiện) trong khi đó có thể sử dụng kiểu vòng lặp khác.
Liệu tốc độ xử lý giữa chúng có khác nhau nhiều không?
 
Trước đến nay vẫn hay sử dụng vòng lặp For ... Next do thói quen (trong đó có sử dụng cả một số điều kiện)
(ó lúc cũng cần thoát trước khi đi đến tận cùng của vòng lặp ni!
(VD: Ta tìm 1 SL nào đó trong CSDL & biết chắc rằng nó là duy nhất)
(òn muốn biết nhanh hay chậm hơn thì mình hay dùng hàm Timer() để đo đếm (có vẽ không được bài bản cho lắm - Đừng cười nha!)-=09=
 
https://onedrive.live.com/?cid=AB17...B0BE!57001&parId=AB177E9F35D8B0BE!105&o=OneUp

Chào các bạn!
Mình mới tập tễnh vọc VBA nên còn gà mờ lắm, muốn viết 1 đoạn về vòng lặp mà mò mãi chưa ra. (như hình mình gửi trong link trên) mong
các bạn giúp đỡ.
CỘt A có dãy text kéo dài từ A5 - An
Cot B có dãy text kéo dài từ B8 - Bn
Cot C: cell C1 sẽ = cell đầu tiên <>"" (khác rỗng) của cột A (cell A5), ...... Cn=cell cuối cùng <>"" của cột A (cell n), Cn+1 = cell đầu tiên <>"" của cột B (cell B8) và Cn+n = cell cuối cùng <>"" của cột B (Cell Bn).
 
https://onedrive.live.com/?cid=AB17...B0BE!57001&parId=AB177E9F35D8B0BE!105&o=OneUp

Chào các bạn!
Mình mới tập tễnh vọc VBA nên còn gà mờ lắm, muốn viết 1 đoạn về vòng lặp mà mò mãi chưa ra. (như hình mình gửi trong link trên) mong
các bạn giúp đỡ.
CỘt A có dãy text kéo dài từ A5 - An
Cot B có dãy text kéo dài từ B8 - Bn
Cot C: cell C1 sẽ = cell đầu tiên <>"" (khác rỗng) của cột A (cell A5), ...... Cn=cell cuối cùng <>"" của cột A (cell n), Cn+1 = cell đầu tiên <>"" của cột B (cell B8) và Cn+n = cell cuối cùng <>"" của cột B (Cell Bn).

Bạn chạy thử đoạn Code sau:
Mã:
Option Explicit
Sub vong()
Dim vung As Range, cll As Range, mang() As Variant, i As Long
Set vung = Union([A5:A9], [B8:B11])
For Each cll In vung
  If Not IsEmpty(cll.Value) Then
    i = i + 1
    ReDim Preserve mang(1 To i)
    mang(i) = cll.Value
  End If
Next cll
[C1].Resize(i) = WorksheetFunction.Transpose(mang)
End Sub
 
Bạn thử làm cách này nhé:
1. Tạo ra 1 inputbox lấy địa chỉ khối ô. Địa chỉ này sẽ được gọi bằng một nút vấm nhúng vào trong sheet
Public Function Addres() As Range
Dim ra As Range
Dim str1 As String
Set ra = Application.InputBox("Chon vung o", "Thong bao", Selection.Address, , , , , 8)
Set Addres = ra
End Function

2. Chạy qua cột 1 và cột 2 của vùng ô, duyệt từng giá trị nếu khác rỗng thì truyền vào mảng Variant. Cuối cùng là truyền mảng Variant trở lại cột 3 của vùng ô:
Private Sub CommandButton1_Click()
Dim ran As Range
Dim va() As Variant
Dim i As Integer, j As Integer, k As Integer
Dim coCount As Integer
Dim roCount As Integer


'Nhan du lieu tu o nhap vao
Set ran = Addres
coCount = ran.Columns.Count
roCount = ran.Rows.Count


'Truyen du lieu tu cac cot A,B vao mang Variant
k = 0
For j = 1 To 2
For i = 1 To roCount
If ran.Cells(i, j).Value <> "" Then
k = k + 1
ReDim Preserve va(1 To k) As Variant
va(k) = ran.Cells(i, j).Value
End If
Next
Next


'Truyen du lieu tu mang Variant vao cot C
For i = 1 To k
ran.Cells(i, 3).Value = va(i)
Next


End Sub
Chú ý: Do số lượng ô có dữ liệu ở cột 1 và cột 2 có thể nhiều hơn số lượng ô trong cột 3 nên dữ liệu có thể bị tràn ra ngoài cột 3. File mã nguồn mình gửi đính kèm bên dưới
 

File đính kèm

Web KT

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

Back
Top Bottom