Những ai đã từng xem qua bài viết này: Giới thiệu Cơ bản về vòng lặp For . . . next của sư phụ ptm0412 giờ hãy cùng làm 1 vài bài tập từ đơn giản đến nâng cao nhé
Xin mở màn bằng 1 bài tập sau:
Bài tập 01:
Hãy tính xem từ năm 1900 đến nay có bao nhiêu ngày thuộc dạng THỨ SÁU NGÀY 13
------------------------
Các bạn ai có bài tập gì hay xin post lên đây nhé! Cảm ơn
Bài tập 03:
Chuẩn hoá 1 chuỗi đầu vào theo nguyên tắc: Không tồn tại 2 ký tự liền kề giống nhau, các ký tự không liền kề vẫn có thể giống nhau. Ví dụ với chuỗi đầu vào là "AABBBBCCCCDDAAAAAA" thì chuỗi sau khi chuẩn hoá là "ABCDA"
Public Function cat(Vung As Range) As String
Dim i As Integer, Tam As String, j As String
'Vung = UCase(Vung)'
For i = 2 To Len(Vung)
j = Mid(Vung, i, 1)
If Mid(Vung, i - 1, 1) = j Then j = ""
Tam = Tam & j
Next
cat = Left(Vung, 1) & Tam
End Function
Theo tôi với vòng lặp thì bài này có thể finish được rồi, 1 vòng lặp hay 2 vòng lặp thì số lượng phép toán là như nhau, các bạn có thể tìm hiểu thêm phương pháp không dùng vòng lặp(đệ quy) xem sao.
Liên quan đến vòng lặp thì thường là các bài liên quan đến xử lý mảng, sắp xếp, ma trận, xử lý chuỗi ... Tôi xin góp vui 1 bài như sau Bài tập 02: Nhập vào 1 số N nguyên dương, in ra sheet hiện hành trên 1 vùng N cột, N dòng bắt đầu từ ô A1 với vùng đó chứa các số tự nhiên từ 1 đến N*N theo vòng xoáy ốc. Ví dụ N=5 ta sẽ phải in ra sheet hiện hành là
Với các bạn mới học, hãy xé nhỏ ra từng đoạn:
Đoạn 1: fill ngang lần 1 (gặp cột thứ n thì ngừng)
Đoạn 2: fill xuống lần 1 (gặp dòng thứ n thì ngừng)
Đoạn 3: fill qua trái lần 1 (gặp cột 1 thì ngừng)
Đoạn 4: các số còn lại. Các số này có tính chất giống nhau là gặp ô có số thì đổi hướng.
Do dùng để hướng dẫn các bạn mới, nên không dùng mảng, không dùng thuật toán cao siêu, đơn giản select rồi gán số. Tô màu gì đó cho mỗi ô tạo chút hiệu ứng chạy.
Đoạn 1:
PHP:
For i = 1 To Num
With Cells(1, i)
.Select
.Value = i
.Interior.ColorIndex = 4
End With
Next
Quá dễ, đúng không?
Đoạn 2:
PHP:
For i = Num + 1 To Num * 2 - 1
With Cells(i - Num + 1, Num)
.Select
.Value = i
.Interior.ColorIndex = 4
End With
Next
Cũng còn dễ, chỉ cần suy luận 1 tí ti là chỉ có n - 1 số, từ n +1 đến 2n -1, số dòng dùng 1 phép cộng trừ đơn giản, cột là n.
Đoạn 3: suy luận tương tự, chỉ có n - 1 số, từ 2n đến 3n-2, dòng là n, cột thì cộng trừ tí ti.
PHP:
For i = Num * 2 To Num * 3 - 2
With Cells(Num, Num * 3 - i - 1)
.Select
.Value = i
.Interior.ColorIndex = 4
End With
Next
Đoạn 4:
Bắt đầu khó khăn. Trước khi select ô kế, phải dò trước xem ô đó có số chưa, nếu chưa thì chạy tới, nếu rồi thì đổi hướng.
PHP:
For i = Num * 3 - 1 To Num ^ 2
Hướng bắt đầu là hướng chạy lên, ô kế là Selection.Offset(-1, 0). Đặt 2 biến j và k và gán j = -1, k = 0
Điều kiện để đổi hướng chạy ngang qua phải:
PHP:
With Selection
If .Offset(j, k).Value > 0 And j = -1 Then j = 0: k = 1
Tiếp theo là chạy ngang qua phải, ô kế là Selection.Offset(0, 1). Điều kiện đổi hướng chạy xuống:
PHP:
If .Offset(j, k).Value > 0 And j = 0 Then j = 1: k = 0
Tương tự điều kiện đổi hướng chạy ngang qua trái:
PHP:
If .Offset(j, k).Value > 0 And j = 1 Then j = 0: k = -1
Cuối cùng là điều kiện đổi hướng chạy lên:
PHP:
If .Offset(j, k).Value > 0 And j = 0 Then j = -1: k = 0
End With
Bắt đầu select và gán số:
PHP:
With Selection.Offset(j, k)
.Select
.Value = i
.Interior.ColorIndex = 4
.Interior.ColorIndex = 4
End With
Next
Ráp lại, thêm 1 miếng Delay cho chạy từ từ thôi:
PHP:
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
PHP:
Sub quay1(ByVal Num As Long, Delay As Long)
Dim i As Long, j As Long, k As Long
ActiveSheet.Cells.Clear
For i = 1 To Num
With Cells(1, i)
.Select
.Value = i
.Interior.ColorIndex = 4
End With
Sleep Delay
Next
For i = Num + 1 To Num * 2 - 1
With Cells(i - Num + 1, Num)
.Select
.Value = i
.Interior.ColorIndex = 4
End With
Sleep Delay
Next
For i = Num * 2 To Num * 3 - 2
With Cells(Num, Num * 3 - i - 1)
.Select
.Value = i
.Interior.ColorIndex = 4
End With
Sleep Delay
Next
j = -1: k = 0
For i = Num * 3 - 1 To Num ^ 2
With Selection
If .Offset(j, k).Value > 0 And j = -1 Then j = 0: k = 1
If .Offset(j, k).Value > 0 And j = 0 Then j = 1: k = 0
If .Offset(j, k).Value > 0 And j = 1 Then j = 0: k = -1
If .Offset(j, k).Value > 0 And j = 0 Then j = -1: k = 0
End With
With Selection.Offset(j, k)
.Select
.Value = i
.Interior.ColorIndex = 4
.Interior.ColorIndex = 4
End With
Sleep Delay
Next
End Sub
Dùng 1 Command button để lấy số tuỳ ý và chạy code:
PHP:
Private Sub Cmb1_Click()
Num = InputBox("So may?")
On Error GoTo exit1
quay1 Num, 20
exit1:
Exit Sub
End Sub
Vẫn dùng select tới đâu, gán số tới đó. nhưng không chia đoạn nữa, như vậy điều kiện chuyển hướng nhiều hơn: Không phải chỉ thấy số thì đổi hướng, mà 3 đoạn đầu bài trên, cần điều kiện khác. Cộng là 7 điều kiện:
PHP:
Sub quay2(ByVal Num As Long, Delay As Long)
Dim i As Long, j As Long, k As Long
ActiveSheet.Cells.Clear
With ActiveSheet.[a1]
.Select
.Value = 1
.Interior.ColorIndex = 4
End With
j = 0: k = 1
For i = 2 To Num ^ 2
With Selection
If .Column = Num And j = 0 And k = 1 Then j = 1: k = 0
If .Row = Num And j = 1 And k = 0 Then j = 0: k = -1
If .Column = 1 And j = 0 And k = -1 Then j = -1: k = 0
If .Offset(j, k).Value > 0 And j = 0 And k = 1 Then j = 1: k = 0
If .Offset(j, k).Value > 0 And j = 1 And k = 0 Then j = 0: k = -1
If .Offset(j, k).Value > 0 And j = 0 And k = -1 Then j = -1: k = 0
If .Offset(j, k).Value > 0 And j = -1 And k = 0 Then j = 0: k = 1
End With
With Selection.Offset(j, k)
.Select
.Value = i
.Interior.ColorIndex = 4
End With
Sleep Delay
Next
End Sub
Và vì thuật toán là dò ô kế, đạt điều kiện là nhảy qua rồi gán số, nên sót ô đầu tiên chưa có số, phải gán ngay từ đầu code.
Xin cảm ơn tất cả các bạn đã tham gia ToPic này !
Tôi đang thử sức với các bài tập trên nhưng chỉ hiểu và làm được khoảng 30%. Là người thành tâm muốn theo học, tôi xin có một số ý kiến như sau:
Với chủ đề của Topic này là bài tập về vòng lặp và tập đi từ dễ đến khó thì:
1- Chỉ giải quyết bài tập bằng vòng lặp (các kiểu vòng lặp), nhằm tập trung cho mục tiêu không bàn đến các giải pháp không dùng vòng lặp.
2- Bài tập càng đơn giản càng tốt (vì mọi cái chưa biết đều là khó). Không nên đưa ra quá nhiều bài tập theo tôi mỗi tuần khoảng 2 đến 3 bài là vừa. Giai đoạn đầu (giai đoạn dễ) nên kéo dài ít nhất 4 tuần để người học còn có thời gian nghiên cứu, đúc rút kinh nghiệm và tự thực hành.
3- Nên có hướng dẫn chi tiết từng bước cho người học ví dụ như bài #26 của ptm0412.
4- Các bạn tham hướng dẫn giải bài tập, trong giai đoạn đầu cần chú ý viết sao cho bình dân (dễ hiểu nhất) các vấn đề về vòng lặp, chưa vội bàn đến giải pháp ngắn hay dài, tối ưu hay chưa tối ưu (vì là bài tập nên hiệu ích của bài viết chính là số lượng người hiểu bài).
Đúng là "được voi lại đòi cả người cưỡi voi" nhưng với những người như tôi nếu không được cả hai thì mọi cố gắng của các bạn đều như nước đổ lá khoai mà thôi.
Nếu có gì không phải mong các bạn bỏ qua và đề nghị Mod xóa giúp bài này nếu xét thấy là không cần thiết.
Thanks !
2- Bài tập càng đơn giản càng tốt (vì mọi cái chưa biết đều là khó). Không nên đưa ra quá nhiều bài tập theo tôi mỗi tuần khoảng 2 đến 3 bài là vừa. Giai đoạn đầu (giai đoạn dễ) nên kéo dài ít nhất 4 tuần để người học còn có thời gian nghiên cứu, đúc rút kinh nghiệm và tự thực hành.
Đồng ý với anh Trung Chinh!
Vậy xin mời các bạn làm lại bài 1 và bài 3, theo tôi 2 bài này cũng khá đơn giản! Lưu ý: Khi làm xong code, nếu có thể được, các bạn hãy đính kèm luôn file nhé (cho tiện việc kiểm tra) (xin đừng vì ngại người ta cười code của mình mà không tham gia nhé)
Bài 3 giải theo concogia có lẽ là ổn rồi, xin góp bài tập kế: Bài tập 04
Căn cứ vào câu lệnh tô màu và sleep trong bài 26, thử 3 câu như sau:
Chọn 1 vùng chữ nhật trong sheet, dài rộng không bằng nhau:
a. Tô màu từng ô, từng dòng từ trái qua phải, từ trên xuống dưới.
b. Tô màu từng dòng từ trái qua phải, rồi dòng kế ngược lại từ phải qua trái đến hết.
c. Tô màu caro kiểu bi da: Tô màu từng ô theo đường chéo 45 độ, gặp đường biên thì dội ra 45 độ hướng khác. Kết quả được 1 hình tô carô.
Tôi nghĩ nếu ai có giải pháp hay thì cứ post lên cho mọi người tham khảo kiểu như một cách giải khác thôi. Vì với một bài toán thì cách giải không dùng vòng lặp thường hay hơn cách giải dùng vòng lặp. Theo tôi đã học thì cái gì hay thì học, nhất là những bài giải mang tính sáng tạo.
Tôi nghĩ nếu ai có giải pháp hay thì cứ post lên cho mọi người tham khảo kiểu như một cách giải khác thôi. Vì với một bài toán thì cách giải không dùng vòng lặp thường hay hơn cách giải dùng vòng lặp. Theo tôi đã học thì cái gì hay thì học, nhất là những bài giải mang tính sáng tạo.
Bạn ơi! Đây là topic BÀI HỌC chứ không phải TÌM GIẢI PHÁP hay!
Đã gọi là HỌC thì mục đích làm sao cho mọi người HIỂU được mới xem là thành công!
Giống như bài toán của sư phụ pmt0412 đưa ra đấy thôi: Dùng vòng lập để tính giai thừa ---> Ai chả biết bài nào khỏi vòng lập cũng làm được! Vấn đề là THÔNG QUA BÀI TẬP ĐỂ HIỂU VÒNG LẬP bạn à!
Ý kiến của bạn cũng tốt, nhưng e rằng ta phải tìm hiểu trong 1 topic khác thôi!
Tôi xin bàn 1 chút về Bài tập 02, bài này mới đọc lên thì thấy rất khó, nhưng nếu hiểu rõ 1 chút về ma trận vuông thì bài này cũng không hẳn khó. Với 1 ma trận vuông cấp N sẽ có N dòng và N cột, giả sử các dòng và cột được đánh số từ 1 -> N, ta kẻ 2 đường chéo cho ma trận thì sẽ chia ma trận thành 4 vùng tương ứng là Trên, Dưới, Trái, Phải, tương ứng với mỗi vùng ta sẽ thấy, tại vùng Trên khi điền số theo thứ tự thì Cột tăng, tương tự vùng Dưới Cột giảm, vùng Phải Dòng tăng, vùng Trái Dòng giảm.Giờ ta xét 1 vài tính chất của ma trận này.
1. Đường chéo 1(màu tím): Tập hợp của các ô có Dòng=Cột
2. Đường chéo 2(màu xanh): Tập hợ của các ô có Dòng+Cột=N+1
3. Vùng nằm phía trên đường chéo 1: Tập hợp các ô có Cột > Dòng
4. Vùng nằm phía dưới đường chéo 1: Tập hợp các ô có Cột < Dòng
5. Vùng nằm phía trên đường chéo 2: Tập hợp các ô có Dòng+Cột < N+1
6. Vùng nằm phía dưới đường chéo 2: Tập hợp các ô có Dòng+Cột >N+1
Tập hợp các dữ kiện trên sẽ đưa ra được quy luật tương đối đơn giản, các bạn tham khảo đoạn code dưới đây nhé:
Mã:
Sub MaTran()
Dim n As Long
n = InputBox("Nhap cap ma tran: ")
Dim iRow As Long
Dim iCol As Long
Dim iValue As Long
Dim arr() As Long
ReDim arr(1 To n, 1 To n)
iCol = 1: iRow = 1
For iValue = 1 To n ^ 2
arr(iRow, iCol) = iValue
If (iCol >= iRow And iCol + iRow < n + 1) Or (iCol = iRow - 1 And iCol + iRow <= n + 1) Then
iCol = iCol + 1
ElseIf iCol > iRow And iCol + iRow >= n + 1 Then
iRow = iRow + 1
ElseIf iCol <= iRow And iCol + iRow > n + 1 Then
iCol = iCol - 1
ElseIf iCol < iRow - 1 And iCol + iRow <= n + 1 Then
iRow = iRow - 1
End If
Next
Range(Cells(1, 1), Cells(n, n)) = arr
End Sub
Bài 3 giải theo concogia có lẽ là ổn rồi, xin góp bài tập kế: Bài tập 04
Căn cứ vào câu lệnh tô màu và sleep trong bài 26, thử 3 câu như sau:
Chọn 1 vùng chữ nhật trong sheet, dài rộng không bằng nhau:
a. Tô màu từng ô, từng dòng từ trái qua phải, từ trên xuống dưới.
b. Tô màu từng dòng từ trái qua phải, rồi dòng kế ngược lại từ phải qua trái đến hết.
c. Tô màu caro kiểu bi da: Tô màu từng ô theo đường chéo 45 độ, gặp đường biên thì dội ra 45 độ hướng khác. Kết quả được 1 hình tô carô.
Lưu ý câu c: Không phải hình chữ nhật nào cũng có đáp án. Ví dụ một hình chữ nhật có dạng d-1=n(r-1) (với d là chiều dài, r là chiều rộng) chẳng hạn như: 5x9, 5x13, 6x11,... Khi test code các bạn nên bẫy lỗi cẩn thận để tránh rơi vào vòng lặp vô tận.
Lưu ý câu c: Không phải hình chữ nhật nào cũng có đáp án. Ví dụ một hình chữ nhật có dạng d-1=n(r-1) (với d là chiều dài, r là chiều rộng) chẳng hạn như: 5x9, 5x13, 6x11,... Khi test code các bạn nên bẫy lỗi cẩn thận để tránh rơi vào vòng lặp vô tận.
Nên chăng có những BT thực tế hơn, ví dụ như là, tính những ngày nghĩ từ nay đến -> 31/12/2012 bao gồm những ngày nghỉ bù, (nếu ngày lễ là CN, áp dụng cho tuần là 48h) chưa kể mấy ngày lễ tết. Tính trước để mình còn dự trù những ngày ăn chơi.
Giả sử ngày nghỉ là: 30/04, 01/05, 02/09, 01/01. Chưa kể mấy ngày nghỉ tết và 10/3 AL.
Nhờ BQT xóa bài hộ.
Ái chà! Bài này cũng đâu có dễ ăn! Nhất là đối với bạn mới học
Thà là vầy đi: Tính từ đầu năm đến cuối năm tôi đã đi làm được bao nhiều ngày (nghỉ CN và lễ, không tính nghỉ đột xuất)
Dễ hơn rất nhiều
Ẹc... Ẹc...
Vậy cứ thống nhất vậy nhé.
Từ 19/08/2010 - 31/12/2010 mình sẽ làm việc bao nhiêu ngày. Ngày lễ gồm có: 2/9 và ngày nghỉ là CN. Và liệt kê những ngày thứ hai gán vào A1->An của 1 sheet. Dòng vòng lặp thông thường.
Bài 3 giải theo concogia có lẽ là ổn rồi, xin góp bài tập kế: Bài tập 04
Căn cứ vào câu lệnh tô màu và sleep trong bài 26, thử 3 câu như sau:
Chọn 1 vùng chữ nhật trong sheet, dài rộng không bằng nhau:
a. Tô màu từng ô, từng dòng từ trái qua phải, từ trên xuống dưới.
b. Tô màu từng dòng từ trái qua phải, rồi dòng kế ngược lại từ phải qua trái đến hết.
c. Tô màu caro kiểu bi da: Tô màu từng ô theo đường chéo 45 độ, gặp đường biên thì dội ra 45 độ hướng khác. Kết quả được 1 hình tô carô.
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
Câu a:
Mã:
Sub tomau1()
Dim i As Long, j As Long
For i = 1 To 5
For j = 1 To 7
Cells(i, j).Interior.ColorIndex = 4
Sleep 100
Next j
Next i
End Sub
Câu b:
Mã:
Sub tomau2()
Dim i As Long, j As Long
For i = 9 To 14
If i Mod 2 <> 0 Then
For j = 1 To 7
Cells(i, j).Interior.ColorIndex = 4
Sleep 100
Next j
ElseIf i Mod 2 = 0 Then
For j = 7 To 1 Step -1
Cells(i, j).Interior.ColorIndex = 3
Sleep 100
Next j
End If
Next i
End Sub
Sub tomau2()
Dim i As Long, j As Long
For i = 9 To 14
If i Mod 2 <> 0 Then
For j = 1 To 7
Cells(i, j).Interior.ColorIndex = 4
Sleep 100
Next j
ElseIf i Mod 2 = 0 Then
For j = 7 To 1 Step -1
Cells(i, j).Interior.ColorIndex = 3
Sleep 100
Next j
End If
Next i
End Sub
Với câu b) tôi xin gợi ý thế này
- Dùng 2 vòng lập, 1 cái quét theo dòng và 1 cái quét theo cột... Đại khái thế này:
PHP:
Dim SrcRng as Range, iR as Long, iC as Long
Set SrcRng = Selection
For iR = 1 To SrcRng.Rows.Count
For iC = 1 to SrcRng.Columns.Count Step 1
Trong code này, phần quét theo cột đang theo chiều thuận (từ trái sang phải)... Nếu muốn theo chiều ngược lại thì
PHP:
Dim SrcRng as Range, iR as Long, iC as Long
Set SrcRng = Selection
For iR = 1 To SrcRng.Rows.Count
For SrcRng.Columns.Count to 1 Step -1
- Để ý thấy 2 code trên chỉ khác nhau 1 tí (đảo 1 và SrcRng.Columns.Count với nhau và khác Step)
- Sự thay đổi này hoàn toàn tùy thuộc và vị trí của dòng (iR)
- Vậy ta có thể đặt thêm vài biến nữa để nhận biết được sự thay đổi này
PHP:
Dim iR As Long, iC As Long, SrcRng As Range, Chk As Boolean, Col As Long, Stp As Long, Color As Long
Set SrcRng = Selection
Col = SrcRng.Columns.Count
For iR = 1 To SrcRng.Rows.Count
Chk = iR Mod 2
Stp = IIf(Chk, 1, -1)
Color = IIf(Chk, 4, 3)
For iC = IIf(Chk, 1, Col) To IIf(Chk, Col, 1) Step Stp
With SrcRng.Cells(iR, iC)
.Select
.Interior.ColorIndex = Color
End With
Sleep 100
Next
Next
Việc thể hiện code là tùy theo ý của mỗi người, miễn sao dễ nhìn là được!
Sau này, nếu trình độ khá hơn 1 chút, bạn có thể viết code theo kiểu có tham số truyền như thế này
PHP:
Private Sub RangeColor(SrcRng As Range, Color1 As Long, Color2 As Long, Delay As Long)
Dim iR As Long, iC As Long, Chk As Boolean, Col As Long, Stp As Long
Col = SrcRng.Columns.Count
For iR = 1 To SrcRng.Rows.Count
Chk = iR Mod 2
Stp = IIf(Chk, 1, -1)
For iC = IIf(Chk, 1, Col) To IIf(Chk, Col, 1) Step Stp
With SrcRng.Cells(iR, iC)
.Select
.Interior.ColorIndex = IIf(Chk, Color1, Color2)
End With
Sleep Delay
Next
Next
End Sub
Rồi khi cần chạy ứng dụng, ta viết 1 đoạn khác ngắn gọn hơn:
PHP:
Sub Test()
RangeColor Selection, 3, 4, 100
End Sub
Một vài gợi ý nhỏ, hy vọng có thể giúp ích cho các bạn
Câu b Em làm theo cách hướng dẫn của Anh và cách hiểu của mình thay cho cách chọn số dòng số cột ở trước.
Mã:
[COLOR=#0000bb]Private Declare Sub Sleep Lib "[/COLOR][COLOR=red]kernel32[/COLOR][COLOR=#0000bb]" (ByVal ms As Long)[/COLOR]
[COLOR=#0000bb]Sub Test()[/COLOR]
[COLOR=#0000bb]Dim iR As Long, iC As Long, SrcRng As Range[/COLOR]
[COLOR=#0000bb]Set SrcRng = Selection[/COLOR]
[COLOR=#0000bb] For iR = 1 To SrcRng.Rows.Count[/COLOR]
[COLOR=#0000bb] If iR Mod 2 <> 0 Then[/COLOR]
[COLOR=#0000bb] For iC = 1 To SrcRng.Columns.Count[/COLOR]
[COLOR=#0000bb] SrcRng.Cells(iR, iC).Interior.ColorIndex = 4[/COLOR]
[COLOR=#0000bb] Sleep 50[/COLOR]
[COLOR=#0000bb] Next[/COLOR]
[COLOR=#0000bb] ElseIf iR Mod 2 = 0 Then[/COLOR]
[COLOR=#0000bb] For iC = SrcRng.Columns.Count To 1 Step -1[/COLOR]
[COLOR=#0000bb] SrcRng.Cells(iR, iC).Interior.ColorIndex = 3[/COLOR]
[COLOR=#0000bb] Sleep 50[/COLOR]
[COLOR=#0000bb] Next[/COLOR]
[COLOR=#0000bb] End If[/COLOR]
[COLOR=#0000bb] Next[/COLOR]
[COLOR=#0000bb]End Sub[/COLOR]
Câu b Em làm theo cách hướng dẫn của Anh và cách hiểu của mình thay cho cách chọn số dòng số cột ở trước.
Mã:
[COLOR=#0000bb]Private Declare Sub Sleep Lib "[/COLOR][COLOR=red]kernel32[/COLOR][COLOR=#0000bb]" (ByVal ms As Long)[/COLOR]
[COLOR=#0000bb]Sub Test()[/COLOR]
[COLOR=#0000bb]Dim iR As Long, iC As Long, SrcRng As Range[/COLOR]
[COLOR=#0000bb]Set SrcRng = Selection[/COLOR]
[COLOR=#0000bb] For iR = 1 To SrcRng.Rows.Count[/COLOR]
[COLOR=#0000bb] If iR Mod 2 <> 0 Then[/COLOR]
[COLOR=#0000bb] For iC = 1 To SrcRng.Columns.Count[/COLOR]
[COLOR=#0000bb] SrcRng.Cells(iR, iC).Interior.ColorIndex = 4[/COLOR]
[COLOR=#0000bb] Sleep 50[/COLOR]
[COLOR=#0000bb] Next[/COLOR]
[COLOR=#0000bb] ElseIf iR Mod 2 = 0 Then[/COLOR]
[COLOR=#0000bb] For iC = SrcRng.Columns.Count To 1 Step -1[/COLOR]
[COLOR=#0000bb] SrcRng.Cells(iR, iC).Interior.ColorIndex = 3[/COLOR]
[COLOR=#0000bb] Sleep 50[/COLOR]
[COLOR=#0000bb] Next[/COLOR]
[COLOR=#0000bb] End If[/COLOR]
[COLOR=#0000bb] Next[/COLOR]
[COLOR=#0000bb]End Sub[/COLOR]
Câu b) này dù đã sửa lại nhưng đếm trong code sẽ thấy có 3 vòng lập ---> Vì thế mà tôi mới hướng dẩn bạn rút gọn lại chỉ còn 2 vòng lập thôi
Thử để ý xem code này:
PHP:
For iC = 1 To SrcRng.Columns.Count
SrcRng.Cells(iR, iC).Interior.ColorIndex = 4
Sleep 50
Next
Và đoạn này:
PHP:
For iC = SrcRng.Columns.Count To 1 Step -1
SrcRng.Cells(iR, iC).Interior.ColorIndex = 3
Sleep 50
Next
Có khác nhau gì mấy đâu ---> Sao không gộp làm 1?
-----------------------------------------------------------
Câu c) khó quá thì... cứ từ từ... Xem bài Trái Bi-a này cũng giống đấy!