Tôi chưa thạo lập trình lắm, phần vòng lặp sau khi đọc tôi có cảm giác Do While...Loop và For.. Next hình như bản chất chỉ là 1 (tức là Do While...Loop nó chỉ viết tắt cho gọn) phải không các bác.
Liệu có ví dụ nào thì dùng Do While...Loop nó sẽ ưu việt hơn hẳn dùng For.. Next không?
Tôi chưa thạo lập trình lắm, phần vòng lặp sau khi đọc tôi có cảm giác Do While...Loop và For.. Next hình như bản chất chỉ là 1 (tức là Do While...Loop nó chỉ viết tắt cho gọn) phải không các bác.
Liệu có ví dụ nào thì dùng Do While...Loop nó sẽ ưu việt hơn hẳn dùng For.. Next không?
Nếu trong mỗi vòng lặp N có thể thay đổi thì phải dùng Do While.
Với For..Next thì dù thay đổi N thì nó vẫn lấy giá trị ban đầu để làm điều kiện lặp. Ví dụ ban đầu N= 10, trong quá trình lặp N = 100 thì For..Next vẫn đang hiểu N = 10.
Vậy nếu N là không đổi thì nên dùng For..Next tốc độ sẽ nhanh hơn vì VBA không tính lại biểu thức trong N ở mỗi vòng lặp.
Tôi chưa thạo lập trình lắm, phần vòng lặp sau khi đọc tôi có cảm giác Do While...Loop và For.. Next hình như bản chất chỉ là 1 (tức là Do While...Loop nó chỉ viết tắt cho gọn) phải không các bác.
Liệu có ví dụ nào thì dùng Do While...Loop nó sẽ ưu việt hơn hẳn dùng For.. Next không?
Về bản chất, 2 vòng lặp For...Next và Do While...Loop (hay Do...Loop While, Do...Loop Until) là hoàn toàn khác nhau:
- Vòng lặp For...Next là vòng lặp có số lần biết trước. Chúng ta sử dụng vòng lặp này khi đã biết trước (hoặc có thể tính được) số lần lặp.
- Các vòng lặp Do... là các vòng lặp có số lần lặp chưa biết trước, nó chỉ dừng khi gặp một điều kiện phù hợp nào đó, quy định sau từ khóa While hoặc Until:
+ Vòng lặp Do While...Loop hoặc Do...Loop While sẽ chạy khi điều kiện sau While còn đúng, chỉ khác nhau là kiểm tra điều kiện rồi mới chạy lệnh hay ngược lại.
+ Vòng lặp Do...Loop Until sẽ chạy cho đến khi điều kiện sau Until đúng.
Như vậy, khi nào bạn biết được số lần lặp trước thì dùng For..., ngược lại thì dùng Do...
Tuy nhiên trong một số trường hợp, ta có thể "chế biến" qua lại giữa 2 vòng lặp này. Chẳng hạn:
1. Câu lệnh:
PHP:
For i=1 To N
'Dãy lệnh'
Next
Có thể thay bởi dãy lệnh:
PHP:
i=1
Do While i<=N
'Dãy lệnh'
i=i+1
Loop
2. Câu lệnh:
PHP:
Do While Điều_kiện
'Dãy lệnh'
Loop
Có thể thay bởi câu lệnh:
PHP:
For i=1 to N
'Dãy lệnh'
If Điều_kiện then Exit For
Next
Viết dùm hàm tự tạo đễ cho biết số ngày chủ nhật trong tháng, một khi ta được cung cấp 1 ngày cụ thể nào đó của thế kỷ trước?
Chú SA coi có làm được gì không em viết đại
Viết dùm hàm tự tạo đễ cho biết số ngày chủ nhật trong tháng, một khi ta được cung cấp 1 ngày cụ thể nào đó của thế kỷ trước?
Chú SA coi có làm được gì không em viết đại
Public Function SoNgayCNDoLoop(Dat As Date) As Byte
Dim i As Byte, nsun As Byte
Do
i = i + 1
If Weekday(DateSerial(Year(Dat), Month(Dat), i)) = 1 Then
nsun = nsun + 1
Else
If Day(DateSerial(Year(Dat), Month(Dat) + 1, 0)) = i Then Exit Do
End If
Loop
SoNgayCNDoLoop = nsun
End Function
Thử với ngày 1/9/2012 sẽ biết
Ngoài ra, mấy cái As Byte, As Integer nên dẹp đi cho rồi ---> Tất cả chuyển thành biến Long là ngon nhất (Dim i As Long, nsun As Long)... Kế cả biến Dat, nếu có thể cũng nên chuyển thành biến Long luôn
Về bản chất, 2 vòng lặp For...Next và Do While...Loop (hay Do...Loop While, Do...Loop Until) là hoàn toàn khác nhau:
- Vòng lặp For...Next là vòng lặp có số lần biết trước. Chúng ta sử dụng vòng lặp này khi đã biết trước (hoặc có thể tính được) số lần lặp.
- Các vòng lặp Do... là các vòng lặp có số lần lặp chưa biết trước, nó chỉ dừng khi gặp một điều kiện phù hợp nào đó, quy định sau từ khóa While hoặc Until:
+ Vòng lặp Do While...Loop hoặc Do...Loop While sẽ chạy khi điều kiện sau While còn đúng, chỉ khác nhau là kiểm tra điều kiện rồi mới chạy lệnh hay ngược lại.
+ Vòng lặp Do...Loop Until sẽ chạy cho đến khi điều kiện sau Until đúng.
Như vậy, khi nào bạn biết được số lần lặp trước thì dùng For..., ngược lại thì dùng Do...
Tuy nhiên trong một số trường hợp, ta có thể "chế biến" qua lại giữa 2 vòng lặp này. Chẳng hạn:
1. Câu lệnh:
PHP:
For i=1 To N
'Dãy lệnh'
Next
Có thể thay bởi dãy lệnh:
PHP:
i=1
Do While i<=N
'Dãy lệnh'
i=i+1
Loop
2. Câu lệnh:
PHP:
Do While Điều_kiện
'Dãy lệnh'
Loop
Có thể thay bởi câu lệnh:
PHP:
For i=1 to N
'Dãy lệnh'
If Điều_kiện then Exit For
Next
Em nghĩ mọi vòng lặp đều có bản chất giống nhau, đều lặp đi lặp lại số hành động cần làm
có khác chăng ở đây là cách thức lập
thử so sánh vòng lập mà ĐK không biết trước số vòng lặp thì có vòng do While, Do ... Loop While, do... Loop Until do While, Do ... Loop While đều là số vòng lặp không biết trước số lần lặp
Nhưng với do While thì kiểm tra giá trị trước khi lặp có nghĩa là có thể không chạy vào vòng lặp nếu đk không thoả còn với Do ... Loop While thì làm trước kiểm tra điều kiện sau nên ít nhất sẽ lặp được 1 lần nếu đk đầu tiên bị sai
còn với Do ... Loop Until tương tự như Do ... Loop While nhưng sẽ kết thúc khi điều kiện đúng
Còn vòng lặp For chẳng qua là trường hợp đặt biệt của vòng lặp While với số lần lặp được biết trước và tự động tăng hay giản biến điều kiện ngay trong vòng lặp(Nên hạn chế được việc treo máy vì đk)
Ngoài ra, mấy cái As Byte, As Integer nên dẹp đi cho rồi ---> Tất cả chuyển thành biến Long là ngon nhất (Dim i As Long, nsun As Long)... Kế cả biến Dat, nếu có thể cũng nên chuyển thành biến Long luôn
Em nghĩ mọi vòng lặp đều có bản chất giống nhau, đều lặp đi lặp lại số hành động cần làm
có khác chăng ở đây là cách thức lập
thử so sánh vòng lập mà ĐK không biết trước số vòng lặp thì có vòng do While, Do ... Loop While, do... Loop Until do While, Do ... Loop While đều là số vòng lặp không biết trước số lần lặp
Nhưng với do While thì kiểm tra giá trị trước khi lặp có nghĩa là có thể không chạy vào vòng lặp nếu đk không thoả còn với Do ... Loop While thì làm trước kiểm tra điều kiện sau nên ít nhất sẽ lặp được 1 lần nếu đk đầu tiên bị sai
còn với Do ... Loop Until tương tự như Do ... Loop While nhưng sẽ kết thúc khi điều kiện đúng
Còn vòng lặp For chẳng qua là trường hợp đặt biệt của vòng lặp While với số lần lặp được biết trước và tự động tăng hay giản biến điều kiện ngay trong vòng lặp(Nên hạn chế được việc treo máy vì đk)
Vậy thầy? thầy cho ví dụ cụ thể đi ạ,
Chứ các thành viên nói kiểu này rối như canh hẹ lun, Túm lại FOR làm gì khi nào dùng, Do While, Loop khi nào dùng, vì nếu bản chất giống nhau thì cứ dùng đại phải không?
Thầy nói treo máy vì đk là sao, nghĩa là cứ có đk là treo máy ah?
hehe, sách mới là chân lý ah,
Vấn đề là khai báo ở đây Dim i As Byte, nsun As Byte dùng để chứa ngày (chắc chắn chỉ 1--31) và nsun chắc chắn là nhỏ hơn 10 vậy dùng Byte là chuẩn ah,
Vậy thì tác giả bài đó làm đúng khai đó ah (?)
Không rõ ý a sao?
Chập chững VBA , nên theo sách thôi,... , mong mọi người chỉ cho cách học chuẩn
Vậy thầy? thầy cho ví dụ cụ thể đi ạ,
Chứ các thành viên nói kiểu này rối như canh hẹ lun, Túm lại FOR làm gì khi nào dùng, Do While, Loop khi nào dùng, vì nếu bản chất giống nhau thì cứ dùng đại phải không?
Thầy nói treo máy vì đk là sao, nghĩa là cứ có đk là treo máy ah?
Vấn đề không phải thời gian (vì bài này tính có trong tháng), hay tài nguyên (vì bài này quá nhỏ, sử dụng không nhiều biến),
mà còn thể hiện sự chuẩn dữ liệu: Dữ liệu đến đâu khai báo đến đó như thế mới giúp kiểm soát lỗi tốt hơn cho biến,
Nói cách khác, cứ theo sách thì bạn sẽ hiểu đúng kiểu loại dữ liệu hơn, chứ không phải vô tiền khoáng hậu kiểu dùng số đại thế, cái gì sinh ra cũng có lý của nó
Cái này thì rõ ai cũng biết ah, vì đk đặt sai - lỗi sai do người viết
theo thầy Phi... các vòng lặp đó giống nhau, còn vòng lặp DoWhile..Loop Until... cứ có đk là treo máy (nguyên văn: "Nên hạn chế được việc treo máy vì đk")
hehe, sách mới là chân lý ah,
Vấn đề là khai báo ở đây Dim i As Byte, nsun As Byte dùng để chứa ngày (chắc chắn chỉ 1--31) và nsun chắc chắn là nhỏ hơn 10 vậy dùng Byte là chuẩn ah,
Vậy thì tác giả bài đó làm đúng khai đó ah (?)
Không rõ ý a sao?
Chập chững VBA , nên theo sách thôi,... , mong mọi người chỉ cho cách học chuẩn
Tôi nói bạn không tin, bạn đọc trong quyển sách nào đó và bạn cho là chân lý thì bạn cứ việc tin... Tôi không ép!
Còn những ai muốn tiếp tục "cày" với VBA hay VB thì cứ việc thuộc lòng rằng: hãy thay kiểu biến Byte hoặc Integer bằng kiểu biến Long
Vậy đi nha!
theo thầy Phi... các vòng lặp đó giống nhau, còn vòng lặp DoWhile..Loop Until... cứ có đk là treo máy (nguyên văn: "Nên hạn chế được việc treo máy vì đk")
Do Phi viết sai. Đúng ra theo ý đó, sẽ phải viết là "hạn chế được vòng lặp vô tận do không có điều kiện thoát hoặc điều kiện thoát sai". Vòng lặp vô tận khác với treo máy. Vòng lặp vô tận chỉ buộc Excel chạy mãi chạy hoài thôi.
Nhưng!
ý đó chưa đúng!
Không đặt điều kiện thoát, hoặc đặt điều kiện thoát không đúng để xảy ra lỗi vòng lặp vô tận, là lỗi người viết code học chưa tới, chứ không phải lỗi của Do mà chê Do không dùng.
Người ta chọn Do Loop hay chọn For - Next, là tuỳ từng bài toán cụ thể.
Đối với cá nhân tôi, chỉ dùng Do khi chưa biết trước số vòng lặp. Dùng For - Next, có những cái lợi:
- Có thể lồng nhiều vòng For vào nhau để đơn giản hoá code thực thi bên trong.
- Cũng có thể đặt điều kiện để thoát, không cần chạy đủ số vòng lặp quy định.
- Và như Tuân nói ở bài 2, For - Next nhanh hơn.