Các câu đố, bài tập nhằm ôn tập & bổ sung kiến thức căn bản VBA

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,614
Được thích
16,672
Giới tính
Nam
Với tinh thần chơi mà học, học mà chơi, nên tôi đã mở ra topic này, hy vọng các thành viên tham gia, nhất là các thành viên mới biết về VBA.

Sau đây là câu hỏi đầu tiên:

Câu hỏi 1: Bằng phương pháp nào nhanh nhất để tìm ra ô nào trong một cột chứa một điều kiện.

Tôi có 1 file Excel 2007, với cột A, từ A1 đến A1048576 đều có giá trị.

Bằng phương pháp nào nhanh nhất (dùng mảng, dùng For Each v.v...) để tìm ra ô nào trong cột A chứa chữ "Nghia", đồng thời với ô ở cột B tương ứng nhập giá trị "OK" vào đó?

Ví dụ tìm thấy trong ô A2 có giá trị là "Nghia" thì ô B2 nhập vào "OK".

Hiện tại, đáp án nhanh nhất mà tôi có được đã gửi mail riêng (nhằm ghi lại thời gian gửi, để tránh nói ăn gian).

Để tiện việc theo dõi các câu đố, các bài tập tôi đã tạo ra topic này các bạn click vào đây:

Các link của topic "Các câu đố, bài tập nhằm ôn tập & bổ sung kiến thức căn bản VBA"
 

File đính kèm

  • DoVuiCanBan.rar
    1.3 MB · Đọc: 618
Lần chỉnh sửa cuối:
i=dau+INT((cuoi-dau+1)/n)*n+n
Trường hợp n=6, dau=1, cuoi=1000=>i=1002
Công thức của Tiến không đúng với trường hợp cuoi chia hết cho n.
Mình thử công thức như vậy, nhờ mọi người rút gọn:
Mã:
=1+INT(1000/J9)*J9+IF(MOD(1000,J9),J9,MOD(1000,J9))
 
Upvote 0
Như vậy, khi các bạn làm tới đây tôi đã có một bài ứng dụng nhỏ xíu cho các bạn khi sử dụng For ... Next:

Thủ tục:

Mã:
Sub UngDung()
    For i = 1 To 5
        With Sheet1.Range("B" & i)
            If .Value = "" Then
                MsgBox "ban chua nhap tai cell " & .Address(0, 0)
                .Select
                Sheet1.[B6] = ""
                Exit Sub
            End If
        End With
    Next
    Sheet1.Range("B6") = [SUM(B1:B5)]
End Sub

Các bạn xem file rồi bấm nút lệnh, có thắc mắc gì có liên quan thì cứ đưa câu hỏi lên nhé!
 

File đính kèm

  • ThucHanh.xls
    25 KB · Đọc: 32
Upvote 0
Như vậy, khi các bạn làm tới đây tôi đã có một bài ứng dụng nhỏ xíu cho các bạn khi sử dụng For ... Next:

Thủ tục:

Mã:
Sub UngDung()
    For i = 1 To 5
        With Sheet1.Range("B" & i)
            If .Value = "" Then
                MsgBox "ban chua nhap tai cell " & .Address(0, 0)
                .Select
                Sheet1.[B6] = ""
                Exit Sub
            End If
        End With
    Next
    Sheet1.Range("B6") = [SUM(B1:B5)]
End Sub

Các bạn xem file rồi bấm nút lệnh, có thắc mắc gì có liên quan thì cứ đưa câu hỏi lên nhé!

Anh nên tập thói quen khai báo tường minh cho người mới nhé.
 
Upvote 0
Anh nên tập thói quen khai báo tường minh cho người mới nhé.
Mình cố tình làm như thế đó Hai Lúa Miền Tây à (thử nhìn từ đầu bài đến bài kế bài thực hành, có thủ tục nào mình không khai báo tường minh không?), mình nghĩ một số bạn mới học VBA sẽ có thắc mắc nhiều thứ (như trong file có With ... End With, .Address(0,0) v.v...), và khai báo biến, vì thế nên mới thòng câu này:

Các bạn xem file rồi bấm nút lệnh, có thắc mắc gì có liên quan thì cứ đưa câu hỏi lên nhé!

Đồng thời, đó cũng là đề tài để đố ở câu hỏi sau! Chờ các bạn mới có sự phản hồi hoặc đặt câu hỏi đã.
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là câu hỏi dành cho các thành viên mới học VBA.

Tôi có thủ tục sau:

Mã:
Sub ForNext()
[COLOR=#0000cd][B]    Dim i As Long[/B][/COLOR]
    For [COLOR=#ff0000][B]i = 1 To 1000[/B][/COLOR]
        ''Your code here
    Next
End Sub

Các bạn nhìn vào code, khoan thử vội, đố các bạn biết sau khi chạy code, i sẽ có giá trị là bao nhiêu?

Kiểu dữ liệu cần khai báo phải phù hợp với dữ liệu của mình để tiết kiệm bộ nhớ.
Anh nên đưa ra bảng chung về kiểu dữ liệu để người mới áp dụng cho phù hợp.
 
Upvote 0
Mình cố tình làm như thế đó Hai Lúa Miền Tây à (thử nhìn từ đầu bài đến bài kế bài thực hành, có thủ tục nào mình không khai báo tường minh không?), mình nghĩ một số bạn mới học VBA sẽ có thắc mắc nhiều thứ (như trong file có With ... End With, .Address(0,0) v.v...), và khai báo biến, vì thế nên mới thòng câu ...
Đúng là thiếu khai báo biến, em thử code này:
Mã:
Sub test()
Dim I As Long, Kq As Long
    For I = 1 To 5
        If Cells(I, 2) = "" Then
            MsgBox "ban chua nhap tai cell " & [COLOR=#ff0000]Cells(I, 2)[/COLOR].Address(0, 0)
            [COLOR=#ff0000]Cells(I, 2)[/COLOR].Select
            Cells(6, 2) = ""
            Exit Sub
        Else
            Kq = Kq + Cells(I, 2)
        End If
    Next
    Cells(6, 2) = Kq
End Sub
Lúc đầu không có phần màu đỏ, code không chạy được, anh Nghĩa giải thích dùm với.
 
Lần chỉnh sửa cuối:
Upvote 0
Để nói tiếp tinh thần, tôi hỏi các bạn điều sau:

Mã:
' vòng lặp kiểu FOR
dau = 1
cuoi = 10
buoc = 1
FOR i = dau to cuoi STEP buoc
' code làm cái gì đó
NEXT i

' vòng lặp kiểu WHILE
dau = 1
cuoi = 10
buoc = 1
i = dau
WHILE i <= cuoi
' code làm cái gì đó
i = i + buoc
WEND

Nếu loại trừ yếu tố tốc độ xử lý, hai vòng lặp trên có giống nhau hay không?
 
Upvote 0
Công thức của Tiến không đúng với trường hợp cuoi chia hết cho n.
Mình thử công thức như vậy, nhờ mọi người rút gọn:
Mã:
=1+INT(1000/J9)*J9+IF(MOD(1000,J9),J9,MOD(1000,J9))
Đúng là công thức trước của mình chưa chuẩn, mình chỉnh lại như sau (bỏ +1)
Đã thử test lại như trong file
 

File đính kèm

  • Test.xlsm
    15.6 KB · Đọc: 11
Upvote 0
Để nói tiếp tinh thần, tôi hỏi các bạn điều sau:

Mã:
' vòng lặp kiểu FOR
dau = 1
cuoi = 10
buoc = 1
FOR i = dau to cuoi STEP buoc
' code làm cái gì đó
NEXT i

' vòng lặp kiểu WHILE
dau = 1
cuoi = 10
buoc = 1
i = dau
WHILE i <= cuoi
' code làm cái gì đó
i = i + buoc
WEND

Nếu loại trừ yếu tố tốc độ xử lý, hai vòng lặp trên có giống nhau hay không?
bản chất :
Vòng lặp for --> biết trước số lần lặp
While ..Wend --> không biết trước số lần lặp
---------------------------------------------
Kết quả của 2 cú pháp trên : i = 11
---------------------------------------------
1 điểm khác biệt nữa là dùng cú pháp While... Wend ta sẽ không thể thoát khỏi vòng lặp bằng lệnh như kiểu exit do, exit for được
----------------------------------------------
 
Upvote 0
Đếm xem trong topic này có bao nhiêu thành viên mới:

Capture.JPG









Đó là chỉ VÀO XEM thôi nha!
Từ đầu đến giờ chỉ thấy có bé Tiền tham gia hỏi đáp, còn lại toàn là "cựu" thành viên
Buồn nhỉ?
 
Upvote 0
Đếm xem trong topic này có bao nhiêu thành viên mới:
Đó là chỉ VÀO XEM thôi nha!
Từ đầu đến giờ chỉ thấy có bé Tiền tham gia hỏi đáp, còn lại toàn là "cựu" thành viên
Buồn nhỉ?
Thì cũng gần 50% rồi mà Thầy, topic cũng mới (chiều nay em mới tham gia), mong là nhiều người biết đến Topic này.
 
Upvote 0
Không phải tôi bắt bẻ bạn. Cái khó là tuỳ theo cách học mà vấn đề X đối với A là cơ bản trong khi đối với B là sâu.
Tốt hơn hết là định nghĩa cái giới hạn của cơ bản trước đã.

Đối với tôi chẳng hạn, chỉ riêng việc cóp range ra array để xử lý đã thuộc về cao cấp rồi.
xem qua các bài của bạn này viết mình cảm thấy đc câu này hình như ko đúng sự thật rồi "dòng màu đỏ" quá khiêm tốn
 
Upvote 0
Đúng là thiếu khai báo biến, em thử code này:
Mã:
Sub test()
Dim I As Long, Kq As Long
    For I = 1 To 5
        If Cells(I, 2) = "" Then
            MsgBox "ban chua nhap tai cell " & [COLOR=#ff0000]Cells(I, 2)[/COLOR].Address(0, 0)
            [COLOR=#ff0000]Cells(I, 2)[/COLOR].Select
            Cells(6, 2) = ""
            Exit Sub
        Else
            Kq = Kq + Cells(I, 2)
        End If
    Next
    Cells(6, 2) = Kq
End Sub
Lúc đầu không có phần màu đỏ, code không chạy được, anh Nghĩa giải thích dùm với.

Phải khẳng định với nhau rằng, nếu ta không khai báo biến rõ ràng thì code vẫn chạy nha các bạn! Khi không khai báo biến thì biến mà ta đặt vào thủ tục mặc nhiên đó là một biến Varriant Data Type, phần biến này tôi sẽ lần lượt giới thiệu cho các bạn ở những bài sau.

Xin các cao thủ đừng bắt lỗi gì ở đoạn văn trên, vì tôi đang hướng tới cho các thành viên mới nhận thức về biến.

(Tôi gọi thành viên mới có nghĩa là tôi gọi thành viên mới tập tành về VBA chứ không phải là thành viên mới tham gia diễn đàn nhé các bạn).

Quay lại code của leonguyenz, mới tập viết code mà đã biến chuyển được từ code của anh ra như vậy là một tín hiệu đáng mừng, xin chúc mừng Thảo!

Mình nói nôm na nhé, đối với Range() chúng có các phương thức đi kèm, chẳng hạn Range().Select, Range().Address, Range().Value, Range().Offset, Range().Resize v.v...

Cells() là một "tế bào" của Range() vì thế nó có tính chất đầy đủ của một Range(), tuy nhiên với Range() có thể là 1 cell và cũng có thể là một vùng với nhiều cell, còn với Cells() thì chỉ tham chiếu đúng 1 cell không hơn không kém.

Trong code của tôi có dùng With ... End With, Khi dùng With xxx thì xxx là đại diện cho 1 Range(), 1 Cells(), 1 Object v.v... nào đó.

Tôi lấy một ví dụ một macro đã ghi lại thao tác của tôi:

Mã:
Sub Macro1()
[B]    Range("B1:B6")[COLOR=#ff0000].Select[/COLOR][/B]
    With [B][COLOR=#ff0000]Selection[/COLOR][/B].[COLOR=#0000cd]Interior[/COLOR]
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
End Sub

Tôi chọn vùng [B1:B6] cái vùng được chọn đó được gọi là Selection

(Selection trong trường hợp này nó là một biến Range nên nó có đầy đủ tính chất của một Range nha các bạn).

Trong trường hợp với macro trên, nếu ta không dùng With thì ta viết như sau:

Mã:
Sub Macro1()
    Range("B1:B6").Select
    [COLOR=#0000cd]Selection.Interior[/COLOR].Pattern = xlSolid
    [COLOR=#0000cd]Selection.Interior[/COLOR].PatternColorIndex = xlAutomatic
    [COLOR=#0000cd]Selection.Interior[/COLOR].Color = 65535
    [COLOR=#0000cd]Selection.Interior[/COLOR].TintAndShade = 0
    [COLOR=#0000cd]Selection.Interior[/COLOR].PatternTintAndShade = 0
End Sub

Như vậy khi dùng With là như ta "rút ra thừa số chung" trong toán học để tính vậy.

Với code mà Thảo đã sửa theo ý mình, nhưng không có những cái màu đỏ thì code không chạy là vì "không có người bảo lãnh", tức không có "anh" With Range() đại diện cho những phương thức sau Range() nên chúng phát sinh ra lỗi.

Và buộc lòng phải có:

Cells(I, 2).Address(0, 0)
Cells(I, 2).Select

Nói tóm lại, Có Range() mới chạy được các phương thức sau nó, nếu các phương thức "đứng chơ vơ" thì như "rắn không đầu" sẽ phát sinh lỗi.

Không biết mình diễn giải dông dài, rườm ra như thế các bạn có hiểu không nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Đó là chỉ VÀO XEM thôi nha!
Từ đầu đến giờ chỉ thấy có bé Tiền tham gia hỏi đáp, còn lại toàn là "cựu" thành viên
Buồn nhỉ?


Đúng là vậy & phải thôi. Vì vài bài đầu mà các bác chơi ngay vô mảng thì đầu óc nào tiếp thu đây?

Qua nghiên cứu về FIND method thì Thầy Nghĩa quá chủ quan về

Find Next

(Đó là việc thứ hai)

Việc thứ ba thì 1 số người đến topic này để thể hiện, bày tỏ kiến thức của mình, chứ không để học hỏi hay để người khác học hỏi!

Các bạn cần bớt đi cái tôi đi, thì mục tiêu của topic mới đạt!

Thân ái & cũng xin lỗi đã làm phật ý một số người!



 
Upvote 0
Câu hỏi 5: Bằng câu lệnh nào khi chạy code sẽ thông báo lỗi khi không khai báo biến?

Như các bạn đã biết, biến là một đại diện cho một kiểu dữ liệu nào đó để ta thực hiện các thủ tục, như tôi đã nói ở bài trước:

Phải khẳng định với nhau rằng, nếu ta không khai báo biến rõ ràng thì code vẫn chạy nha các bạn! Khi không khai báo biến thì biến mà ta đặt vào thủ tục mặc nhiên đó là một biến Varriant Data Type

Khi không khai báo biến cũng không ảnh hưởng gì đến code của bạn, nhưng khi khai báo biến, chúng sẽ trở nên rõ ràng, tường minh và xác định rõ chúng thuộc loại kiểu dữ liệu loại nào.

Thế thì câu đố đặt ra là Bằng câu lệnh nào khi chạy code sẽ thông báo lỗi khi không khai báo biến? (rất dễ trả lời đấy các bạn)
 
Lần chỉnh sửa cuối:
Upvote 0
À cái này mình biết, đó là

Option Explicit
ngay dòng đầu tiên luôn

Cũng nói thêm với các bạn mới tập toẹ VBA như mình, rằng:

Sau For j = 1 to 9
ta nên
Next j

Để làm chi vậy?
Thưa rằng sau Next j ta có thể mạnh dạn xài j vô việc khác bân dưới mà ít sợ mắc lỗi

Việc này nhằm gởi đền các bậc thầy ở đây rằng:
Khi ta truyền đạt kiến thức, thì không nên dăng bãy các học trò như bọn mình, rồi . . . .
 
Upvote 0
Phải khẳng định với nhau rằng, nếu ta không khai báo biến rõ ràng thì code vẫn chạy nha các bạn! Khi không khai báo biến thì biến mà ta đặt vào thủ tục mặc nhiên đó là một biến Varriant Data Type, phần biến này tôi sẽ lần lượt giới thiệu cho các bạn ở những bài sau.

Xin các cao thủ đừng bắt lỗi gì ở đoạn văn trên, vì tôi đang hướng tới cho các thành viên mới nhận thức về biến.

(Tôi gọi thành viên mới có nghĩa là tôi gọi thành viên mới tập tành về VBA chứ không phải là thành viên mới tham gia diễn đàn nhé các bạn).

Quay lại code của leonguyenz, mới tập viết code mà đã biến chuyển được từ code của anh ra như vậy là một tín hiệu đáng mừng, xin chúc mừng Thảo!

Mình nói nôm na nhé, đối với Range() chúng có các phương thức đi kèm, chẳng hạn Range().Select, Range().Address, Range().Value, Range().Offset, Range().Resize v.v...

Cells() là một "tế bào" của Range() vì thế nó có tính chất đầy đủ của một Range(), tuy nhiên với Range() có thể là 1 cell và cũng có thể là một vùng với nhiều cell, còn với Cells() thì chỉ tham chiếu đúng 1 cell không hơn không kém.

Trong code của tôi có dùng With ... End With, Khi dùng With xxx thì xxx là đại diện cho 1 Range(), 1 Cells(), 1 Object v.v... nào đó.

Tôi lấy một ví dụ một macro đã ghi lại thao tác của tôi:

Mã:
Sub Macro1()
[B]    Range("B1:B6")[COLOR=#ff0000].Select[/COLOR][/B]
    With [B][COLOR=#ff0000]Selection[/COLOR][/B].[COLOR=#0000cd]Interior[/COLOR]
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
End Sub

Tôi chọn vùng [B1:B6] cái vùng được chọn đó được gọi là Selection

(Selection trong trường hợp này nó là một biến Range nên nó có đầy đủ tính chất của một Range nha các bạn).

Trong trường hợp với macro trên, nếu ta không dùng With thì ta viết như sau:

Mã:
Sub Macro1()
    Range("B1:B6").Select
    [COLOR=#0000cd]Selection.Interior[/COLOR].Pattern = xlSolid
    [COLOR=#0000cd]Selection.Interior[/COLOR].PatternColorIndex = xlAutomatic
    [COLOR=#0000cd]Selection.Interior[/COLOR].Color = 65535
    [COLOR=#0000cd]Selection.Interior[/COLOR].TintAndShade = 0
    [COLOR=#0000cd]Selection.Interior[/COLOR].PatternTintAndShade = 0
End Sub

Như vậy dùng With là để ta "rút ra thừa số chung" để tính là như vậy.

Với code mà Thảo đã sửa theo ý mình, nhưng không có những cái màu đỏ thì code không chạy là vì "không có người bảo lãnh", tức không có "anh" With Range() đại diện cho những phương thức sau Range() nên chúng phát sinh ra lỗi.

Và buộc lòng phải có:

Cells(I, 2).Address(0, 0)
Cells(I, 2).Select

Nói tóm lại, Có Range() mới chạy được các phương thức sau nó, nếu các phương thức "đứng chơ vơ" thì như "rắn không đầu" sẽ phát sinh lỗi.

Không biết mình diễn giải dông dài, rườm ra như thế các bạn có hiểu không nhỉ?
tóm lại mình xin rút gọn ý anh nghĩa thế này,
with khai báo tổng thể
các phần nằm trong tổng thể đó
end with

ví dụ : with TPHCM\QUAN10
.PHUONG7
.PHUONG8
END WITH
tức là bạn đang nói tới phuong7, phuong8 của quận 10 TPHCM, nếu bạn ko có cái dòng màu đỏ trên thì ko biết nó là phường 7 phường8 của quận nào hay thành phố nào , nên nếu gửi thư sẽ bị lạc mất nên ko thể gửi (báo lỗi)
 
Upvote 0
À cái này mình biết, đó là

Option Explicit
ngay dòng đầu tiên luôn

Cũng nói thêm với các bạn mới tập toẹ VBA như mình, rằng:

Sau For j = 1 to 9
ta nên
Next j

Để làm chi vậy?
Thưa rằng sau Next j ta có thể mạnh dạn xài j vô việc khác bân dưới mà ít sợ mắc lỗi

Việc này nhằm gởi đền các bậc thầy ở đây rằng:
Khi ta truyền đạt kiến thức, thì không nên dăng bãy các học trò như bọn mình, rồi . . . .


Tôi đã xem qua nhiều bài viết của bạn, và tôi không nghĩ bạn mới tập tành viết code đâu nhỉ? Vì thế hãy để những người mới thực sự tham gia đi bạn, đừng hạ mình làm người mới biết code nha bạn!

Chẳng hạn:

Như hình thứ hai thì E2003 không thực hiện được đâu bạn à!

Bạn chỉ có thể dùng các phương thiện sau cho mã code của bạn:

- Thụt đầu dòng các khối lệnh cho thẳng cột;

- Đánh số các dòng lệnh để phân biệt các khối lệnh;

- Bò dòng hay chèn các dòng ghi chú, như

Rem Cái Này Là Vòng Lap

' Cái Này Là Bien Chung Trong Toàn Bang Tinh'

. . . . .

& Cuối cùng là các dòng trang trí như:

' * * * * *'
'** ** ** ** '
 
Lần chỉnh sửa cuối:
Upvote 0
Kiểu dữ liệu cần khai báo phải phù hợp với dữ liệu của mình để tiết kiệm bộ nhớ.
Anh nên đưa ra bảng chung về kiểu dữ liệu để người mới áp dụng cho phù hợp.

Bảng chung về kiểu dữ liệu, xem hình nhé các bạn. À, ai đã từng học lớp căn bản vừa qua cho tôi được biết các bạn có được dạy về Khai báo biến không để tiện tạo điều kiện cho các bạn thực hành nhỉ?

DataType.jpg
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Xin thưa với Sư phụ, dòng màu đỏ là không chính xác! Code đầu do nó không tính tới hàng 1 nên nếu số hàng có "Nghia" là 5 thì nó lặp đúng 5 lần chứ không phải là 6 lần như đã sửa ở code sau đâu Sư phụ!



Ta đâu cần sử dụng biến i làm gì! Miễn số vòng lặp tối thiểu bằng tổng số hàng mà chúng duyệt qua là được, đừng nhỏ hơn sẽ bị thiếu nếu dữ liệu 100% có từ "Nghia".



Chính vì thế mà em mới sửa code để tối ưu nó (sáng làm vội nên chưa check nên sau đó check lại và sửa lại), nhưng đó cũng là một phương pháp để giải toán.

Anh ptm0412 góp ý cho bạn là đúng rồi. Bạn nên dùng Do ... Loop.

Tôi hơi tò mò. Chả nhẽ bạn có thói quen biến mọi vòng Do ... Loop thành vòng For ... Next?
Anh ptm0412 đã buông tha cho bạn nhưng tôi thử "đeo bám" chút.

Dùng Do ... Loop hay For ... Next trong trường hợp bài này thì đều phải kiểm tra đk để ra khỏi vòng lặp. Tức thao tác kiểm tra đk là như nhau. Nhưng với Do ... Loop thì chỉ có duy nhất thao tác đã nói ở trên, nếu đk không thỏa thì lại "chơi" tiếp vòng mới. Còn với For ... Next thì bạn hãy để ý là khi không thực hiện Exit For thì sao? Thì sẽ có 2 thao tác phải làm thêm:

1. Tăng i thêm 1
2. Kiểm tra xem i có vượt quá cận trên không.

Như vậy nếu có 1000 ô có Nghia thì sẽ có 2000 thao tác thêm so với dùng Do ... Loop. Nếu có 10000 ô Nghia thì có 20000 thao tác phải làm thêm. Những thao tác đó cần nhiều hay ít "điện nước" tôi không bàn nhưng rõ ràng đó là những thao tác thừa. Mà bạn đang tiết kiệm thời gian từng "chớp mắt", đúng không?

Mà bài #49 code hơi lủng củng. Trước hết phải cho Find ra khỏi vòng lặp. Find chỉ gọi 1 lần mà thôi. Chả nhẽ vòng lặp chạy 1000 lần (có 1000 ô Nghia) thì thực hiện Find 1000 lần? Bạn hãy thử dùng Do ... Loop. Chắc chắn code sẽ "đẹp" hơn.
 
Upvote 0
Web KT
Back
Top Bottom