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,590
Được thích
16,653
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:
Các học viên vừa mới tham gia lớp học VBA tại TPHCM đâu rồi nhỉ? Thử test bài xem nào!
 
Upvote 0
Em xin được gửi bài
Mã:
Sub dotimten()
Dim i As Long
    For i = 1 To 1048576
        If Cells(i, 1) = "Nghia" Then
            Cells(i, 2) = "OK"
        End If
    Next
End Sub


Wow, lần đầu tiên cô Mộng Tiền tham gia viết code! Có lẽ lớp học vừa rồi sẽ có nhiều học viên xuất sắc đây!
 
Upvote 0
Nhóc Tiền viết y sách căn bản của lão chết tiệt!
Mà vì là căn bản nên chưa có xài tới mảng.
 
Upvote 0
Nhóc Tiền viết y sách căn bản của lão chết tiệt!
Mà vì là căn bản nên chưa có xài tới mảng.
Vậy Sư phụ gửi một bài về Array (mảng) mà Sư phụ cho là nhanh nhất lên để các "nhóc" của Sư phụ tham khảo và học hỏi đi ạ!
 
Upvote 0
Em xin được gửi bài
Mã:
Sub dotimten()
Dim i As Long
    For i = 1 To 1048576
        If Cells(i, 1) = "Nghia" Then
            Cells(i, 2) = "OK"
        End If
    Next
End Sub
Thử so cái đó với cái này xem có khác chút gì đó không bé Tiền?
PHP:
Public Sub moneymong()
Dim Arr(), I As Long
Arr = [A:A].Value
For I = 1 To UBound(Arr)
    If Arr(I, 1) = "Nghia" Then
        Arr(I, 1) = "OK"
    Else
        Arr(I, 1) = vbNullString
    End If
Next I
[B:B].Value = Arr
End Sub
 
Upvote 0
e cũng xin thử sức với mảng !
Mã:
sub gpe()
dim i as long, arr(), sarr()
sarr = sheet1.range("a1:a1048576").value
redim arr(1 to ubound(sarr,1),1 to 1)
for i =1 to ubound(sarr,1)
     if sarr(i,1) = "Nghia" then
        arr(i,1) = "Ok"
     end if
next i
sheet1.range("a1").resize(ubound(sarr,1),1).value = arr
end sub
 
Upvote 0
Thử so cái đó với cái này xem có khác chút gì đó không bé Tiền?
PHP:
Public Sub moneymong()
Dim Arr(), I As Long
Arr = [A:A].Value
For I = 1 To UBound(Arr)
    If Arr(I, 1) = "Nghia" Then
        Arr(I, 1) = "OK"
    Else
        Arr(I, 1) = vbNullString
    End If
Next I
[B:B].Value = Arr
End Sub
Công thức mảng con chưa biết qua nó...hehe...
Con sẽ tìm hiểu thử...cám ơn bác..
 
Upvote 0
e cũng xin thử sức với mảng !
Mã:
sub gpe()
dim i as long, arr(), sarr()
sarr = sheet1.range("a1:a1048576").value
redim arr(1 to ubound(sarr,1),1 to 1)
for i =1 to ubound(sarr,1)
     if sarr(i,1) = "Nghia" then
        arr(i,1) = "Ok"
     end if
next i
sheet1.range("a1").resize(ubound(sarr,1),1).value = arr
end sub


Code này có hướng đi nhanh, nhưng khi xử lý thì ... hic ... hic ... mất luôn cột gốc (dữ liệu cột A) rồi!
 
Upvote 0
dạ, e lộn mất tiêu , phải là range("b1") mới đúng !
Cho đến giờ, có thể nói code của bạn là nhanh nhất đấy! Mời các bạn tiếp tục tham gia cho vui, vì càng tham gia các bạn mới có thể học hỏi thêm được nhiều cách hay khác!
 
Upvote 0
Vậy Sư phụ gửi một bài về Array (mảng) mà Sư phụ cho là nhanh nhất lên để các "nhóc" của Sư phụ tham khảo và học hỏi đi ạ!

Thấy mọi người rôm rả quá em cũng xin góp vui 1 code (mặc dù hơi muộn :D).

Mã:
Sub test()  Dim SrcArr, ResArr(1 To 1048576, 1 To 1)
  Dim i As Long
  SrcArr = [A1:A1048576].Value
  [B1:B1048576].ClearContents
  For i = 1 To UBound(SrcArr)
    If SrcArr(i, 1) = "Nghia" Then
      ResArr(i, 1) = "OK"
    End If
  Next i
  [B1].Resize(1048576) = ResArr
End Sub
 
Upvote 0
Upvote 0
Thử so cái đó với cái này xem có khác chút gì đó không bé Tiền?
PHP:
Public Sub moneymong()
Dim Arr(), I As Long
Arr = [A:A].Value
For I = 1 To UBound(Arr)
    If Arr(I, 1) = "Nghia" Then
        Arr(I, 1) = "OK"
    Else
        Arr(I, 1) = vbNullString
    End If
Next I
[B:B].Value = Arr
End Sub

Thầy ơi,

Mấy bài vỡ lòng này thầy để bọn em giải lúc nào bọn em bí quá thì thầy hẵng "RA TAY".

Nhưng qua bài của thầy em lại học thêm được cái vbNullString và thêm cách gán giá trị vào mảng rất hay.

Cảm ơn thầy.
 
Upvote 0
Thầy ơi,

Mấy bài vỡ lòng này thầy để bọn em giải lúc nào bọn em bí quá thì thầy hẵng "RA TAY".

Nhưng qua bài của thầy em lại học thêm được cái vbNullString và thêm cách gán giá trị vào mảng rất hay.

Cảm ơn thầy.
E nãy giờ cũng ngồi ngẫm cách của Thầy Ba Tê, nãy nhìn vào thấy nó ngồ ngộ, giờ mới hiểu ra !
Hay quá !
 
Upvote 0
Để mở rộng về mảng, chúng ta trao đổi một số kinh nghiệm một chút hen!

Ngoài việc xử lý mảng trực tiếp như bác Ba Tê làm thì tôi nói thêm về việc cải thiện tốc độ:

Mã:
Private Sub ForArray()
    Dim i As Long, sArray(), sArr(1 To 1048576, 1 To 1)
[COLOR=#ff0000]    sArray = Sheet1.Range("A:A")[/COLOR]
    For i = 1 To 1048576
        If sArray(i, 1) = "Nghia" Then
            sArr(i, 1) = "OK"
        End If
    Next
    Sheet1.Range("B:B") = sArr
End Sub

Thông thường với dòng màu đỏ ở trên, các bạn có thói quen:

sArray = Sheet1.Range("A:A").Value

Đó không sai, nhưng lại làm chậm tốc độ gán dữ liệu lên mảng. Để tăng tốc, ta loại bỏ .Value thì sẽ nhanh hơn, các bạn thử nghiệm đi, đó là một trong những tiểu xảo tăng tốc đấy.

Dĩ nhiên với trường hợp Array, với bài toán đố này vẫn chưa phải là nhanh, các bạn tiếp tục tìm phương hướng khác xem sao!
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom