Bài tập về vòng lặp

Liên hệ QC

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,930
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
 
Chỉnh sửa lần cuối bởi điều hành viê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"
Xin góp một cách:
Mã:
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
 
Upvote 0
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à
|A|B|C|D|E
1|1|2|3|4|5
2|16|17|18|19|6
3|15|24|25|20|7
4|14|23|22|21|8
5|13|12|11|10|9
Về bài toán này, tôi nghĩ các bạn có thể tham khảo topic này:
http://www.giaiphapexcel.com/forum/showthread.php?34009-Lập-trình-để-tỏ-tình-bằng-excel/page2
Tìm code kẽ khung (Sub Enframe) và sửa lại đôi chút là được
 
Upvote 0
Bài tập 02:

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
 
Upvote 0
Bài tập 02
Nâng cao 1 tí chút:

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.
 

File đính kèm

  • BaitapFor02.xls
    37.5 KB · Đọc: 44
Lần chỉnh sửa cuối:
Upvote 0
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 !
 
Lần chỉnh sửa cuối:
Upvote 0
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 1bà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é)
 
Upvote 0
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ô.

caro.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
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.
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.
 
Upvote 0
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!
 
Upvote 0
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
attachment.php
 

File đính kèm

  • MaTran.GIF
    MaTran.GIF
    3.9 KB · Đọc: 208
Upvote 0
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ô.

View attachment 50774
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.
untitled.GIF
 
Lần chỉnh sửa cuối:
Upvote 0
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.
Câu c thấy hao hao giống bài này ghê:
http://www.giaiphapexcel.com/forum/showthread.php?18834-Hãy-xem-sự-di-chuyển-của-trái-Bi-a-trên-bàn!
 
Upvote 0
Tôi cũng Spam tí
3/ Toàn là cao thủ như RollOver, Ndu,HuuThang, và cả PTM nữa trả lời thì còn cửa nào cho anh anh em học hỏi.
.
Tôi chưa đưa lên topic này bất cứ code nào à nha!
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...
 
Upvote 0
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.
 
Upvote 0
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ô.

View attachment 50774
Em xin làm câu a và b trước.
Mã:
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
 

File đính kèm

  • Taptomau.xls
    28 KB · Đọc: 38
Upvote 0
Cái câu a) này sao bạn không dùng code theo kiểu
For Each Clls in Selection
Sẽ gọn hơn... mặc khác, chọn vùng nào ta "làm" vùng nấy!
Cảm ơn anh đã gợi ý. Em làm lại câu a theo For each...next như sau.
Mã:
Sub tomau3()
Dim clls As Range
  For Each clls In Selection
     clls.Interior.ColorIndex = 4
     Sleep 50
  Next
End Sub
 
Upvote 0
Em xin làm câu a và b trước.

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
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 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
 
Upvote 0
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 c khó quá Anh hướng dẫn sơ sơ đi.
 
Lần chỉnh sửa cuối:
Upvote 0
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 c khó quá Anh hướng dẫn sơ sơ đi.
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!
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom