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,612
Được thích
16,671
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:
Nhớ lại ngày xưa tôi học hơi khác: Tôi chẳng bao giờ đợi các thầy ra đề mà luôn tự mình nghĩ đề tài và tự giải
Nếu Thảo quan tâm cũng nên học theo cách này ---> Lấy công việc hằng ngày làm để tài chẳng han
Excel nó vô vàn và đề tài cũng không bao giờ thiếu
Lại nhớ những ngày chập chững bước vào "con đường đau khổ" tôi nhớ lại bài này:

http://www.giaiphapexcel.com/forum/...ức-cho-một-cột-được-không&p=101829#post101829

và được hướng dẫn bởi bài số 2 của Po_Pikachu, sau đó là bác ChanhTQ@.

Cái file mà tôi yêu cầu đó nó nằm trong bài giải của Po_Pikachu (bởi có một lúc quota gửi bài đã hết nên tôi xóa bớt những file cũ để tiếp tục có dung lượng gửi bài).

Các bạn có thấy tự học ngày đó khó khăn hơn bây giờ không? Không có sách lập trình, không được mở lớp học, không ai mở topic để hướng dẫn từ căn bản đến nâng cao như bây giờ, vướng chỗ nào thì hỏi chỗ đó (hỏi riết mà số lượng bài tăng lên đáng kể luôn, sao tăng vèo vèo luôn!).

Vậy tại sao bây giờ nhiều bạn không bắt tay ngay bây giờ để cùng "đau khổ" nhỉ!
 
Upvote 0
không dùng vòng lặp thì quang hai trả lời rồi. cách khác là dùng do loop thay vì for next vẫn được

Bạn hiền ơi, Do ... Loop và For ... Next đều là vòng lặp cả! Cho nên bạn hiền hỏi không dùng vòng lặp mà dùng Do Loop là chưa hỏi đúng đấy nhé!
 
Upvote 0
Nhân tiện đây xin đố luôn, không mới nhưng sẽ có người không biết (Chỉ dành cho người mới tập viết VBA):

Làm sao để ẩn Tên Macro ở cửa sổ Macro (Alt+F8), có bao nhiêu cách để ẩn?
Em biết thêm 1 cách nữa là để câu " Option Private Module " đầu code ( cái này e cũng mò trên GPE :) )
 
Upvote 0
Em biết thêm 1 cách nữa là để câu " Option Private Module " đầu code ( cái này e cũng mò trên GPE :) )
Đúng thế, ngày xưa cái tên Ếch Xanh hắn cũng đã từng hỏi ở topic này:

Làm sao để ẩn Macro Name?

và được một bạn trả lời như thế này:

Nếu không muốn cho người khác Run Macro nào thì Bạn thêm câu lệnh Option Private Module vào dòng đầu của Macro để ẩn nó đi (không cần phải ẩn cửa sổ Name macro).

Xin cảm ơn bạn domfootwear đã bảo cho tôi cách này !.

Đố chơi ngoài lề nha, domfootwear là ai vậy các bạn? hihihii
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
theo tôi được biết trong ngôn ngữ lập trình C++
biến là một vùng nhớtên dùng để lưu trữ các giá trị khi tính toán, các giá trị của biến có thể thay đổi trong suốt thời gian chương trình thực thi.
vùng nhớ này có độ lớn nhỏ tùy theo kiểu dữ liệu

Đối với C/C++ thì định nghĩa "biến" theo "vùng nhớ" còn hữu lý vì hai ngôn ngữ này sử dụng con trỏ để hoạt động rất hiệu quả.

Đối với các ngôn ngữ khác, khái niệm con trỏ được giấu hẳn đi. Cho nên nói chuyện "vùng nhớ" không hẳn đã thích hợp.
 
Upvote 0
Bài tập mã số D01: Hãy dịch sang ngôn ngữ tiếng Việt hàm người dùng sau:

PHP:
Option Explicit
Function KhTr(Chu As String) As Byte
 Dim Temp As String
 Temp = Replace(Trim(Chu), " ", "")
 KhTr = Len(Chu) - Len(Temp)
End Function

Theo mình, đã là ngôn ngữ, khi muốn học nó, ta fải "Đọc", "Nghe", "Nói" & có cả "Dịch"
Vậy các bạn gần xa thử xem sao!

Tất nhiên trong quá trình dịch thấy từ ngữ nào lạ thì fải tra từ điển thôi!
 
Lần chỉnh sửa cuối:
Upvote 0
Bài tập dịch D02: Các bạn dịch giúp tôi sang ngôn ngữ tiếng việt hàm người dùng sau:

PHP:
Function TachTen(HoTen As String) As String
 Dim ViTri As Long
 
HoTen = Trim(HoTen)
 If HoTen = "" Then
     TachTen = ""
 Else
     ViTri = InStrRev(HoTen, " ", Len(HoTen))
     If ViTri = 0 Then
          TachTen = HoTen
     Else
          TachTen = Mid(HoTen, ViTri + 1)
     End If
 End If
End Function

Tác giả hàm này là Thầy Phạm Duy Long (ĐT) quá cố! Xin kính cẩn tri ân thầy!

 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Em xin giơ tay lên bảng ạ.
Em hiểu và dịch tạm như vầy không biết có chính xác không mong các Thầy các anh chị lược bớt hoặc bổ xung thêm:

Mã:
Option Explicit
[COLOR=#ff0000]' Yeu cau khai bao day du cac bien su dung[/COLOR]
Function KhTr(Chu As String) As Byte
[COLOR=#ff0000]'Ham KhTr - tham so dau vao la chuoi va dau ra la so nguyen duong nho hon 256[/COLOR]
 Dim Temp As String
[COLOR=#ff0000] ' Khai bao bien Temp dung kieu chuoi[/COLOR]
 Temp = Replace(Trim(Chu), " ", "")
 [COLOR=#ff0000]' Bo het khoang trang trong chuoi Chu va thay the dau cach Chw(32) = "" ky tu rong[/COLOR]
 KhTr = Len(Chu) - Len(Temp)
[COLOR=#ff0000] ' KhTr = So ky tu trong Chu - so ky tu trong Temp[/COLOR]
End Function 
[COLOR=#ff0000]' Ket thuc[/COLOR]

Mã:
Function TachTen(HoTen As String) As String
[COLOR=#ff0000]'Ham TachTen bien dau vao kieu chuoi va ra kieu chuoi[/COLOR]
 Dim ViTri As Long
 [COLOR=#ff0000]'Khai bao bien ViTri dung kieu so nguyen[/COLOR]
HoTen = Trim(HoTen)
[COLOR=#ff0000]'Cat bo ky tu trang trong bien dau vao HoTen[/COLOR]
 If HoTen = "" Then
     TachTen = ""
[COLOR=#ff0000] 'Neu bien ho ten = "" thi ham TachTen = ""[/COLOR]
 Else [COLOR=#ff0000]'nguoc lai[/COLOR]
     ViTri = InStrRev(HoTen, " ", Len(HoTen))
     [COLOR=#ff0000]'Tim vi tri khoang trang trong chuoi HoTen theo chieu tu phai sang trai[/COLOR]
     If ViTri = 0 Then
          TachTen = HoTen
     [COLOR=#ff0000]'Neu Vitri = 0 thi Ham TachTen = HoTen[/COLOR]
     Else [COLOR=#ff0000]' nguoc lai[/COLOR]
          TachTen = Mid(HoTen, ViTri + 1)
          [COLOR=#ff0000]'Ham TachTen = Lay ky tu trong HoTen bat dau tu ViTri + 1 den het chuoi HoTen[/COLOR]
     End If [COLOR=#ff0000]' Ket thuc dieu kien = o va nguoc lai[/COLOR]
 End If [COLOR=#ff0000]' Ket thuc dieu kien HoTen = "" va nguoc lai[/COLOR]
End Function 
[COLOR=#ff0000]' Ket thuc[/COLOR]

Em cũng có 1 thắc mắc nhỏ mong mọi người chỉ giúp: Dòng này:
Mã:
TachTen = Mid(HoTen, ViTri + 1)

Hàm Mid được viết kiểu này mà VBA cũng hiểu và lấy đúng đối số thứ 3 (den het chuoi HoTen). Theo em thì đầy đủ ra thì phải viết như này chứ:
Mã:
TachTen = Mid(HoTen, ViTri + 1, Len(HoTen) - ViTri + 1)

Thế mà VBA vẫn hiểu._)()(-
 
Upvote 0
PHP:
Option Explicit
Function KhTr(Chu As String) As Byte
 Dim Temp As String
 Temp = Replace(Trim(Chu), " ", "")
 KhTr = Len(Chu) - Len(Temp)
End Function

e xin thử :
Function KhTr(Chu As String) As Byte ' khai báo hàm KhTr có biến là chu ( dạng chuỗi ), hàm này trả về kết quả là byte

Dim Temp As String ' khai báo biến Temp là dạng chuỗi

Temp = Replace(Trim(Chu), " ", "") ' biến temp = thay thế biến "chu" những khoãng trắng bên trong thành không có ( với điều kiện là đã bỏ những khoảng trắng thừa ở 2 đầu chuỗi - hàm trim )

KhTr = Len(Chu) - Len(Temp) ' trả về số khoảng trắng bên trong biến "chu" ( lấy chiều dài ban đầu của biến "chu" trừ cho chiều dài lúc sau của nó sau khi bỏ hết các khoảng trắng )

End Function ' kết thúc hàm
 
Upvote 0
PHP:
Option Explicit
Function KhTr(Chu As String) As Byte
 Dim Temp As String
 Temp = Replace(Trim(Chu), " ", "")
 KhTr = Len(Chu) - Len(Temp)
End Function

Theo mình, đã là ngôn ngữ, khi muốn học nó, ta fải "Đọc", "Nghe", "Nói" & có cả "Dịch"
Vậy các bạn gần xa thử xem sao!

Tất nhiên trong quá trình dịch thấy từ ngữ nào lạ thì fải tra từ điển thôi!
Hổng hiểu hàm này dùng để làm gì nhỉ?
Đếm số từ cũng không đúng! chẳng lẽ để đếm... khoảng trắng
??!!??
Mà đếm khoảng trắng để làm cái gì?
 
Upvote 0
Hổng hiểu hàm này dùng để làm gì nhỉ?
Đếm số từ cũng không đúng! chẳng lẽ để đếm... khoảng trắng
??!!??
Mà đếm khoảng trắng để làm cái gì?
- Em thấy bác Sa đã nói từ đầu là rèn luyện cách đọc Code, hiểu Code, diễn giải Code nên cái này cũng rất cần thiết cho thành viên mới.

- Qua bài trên thành viên mới sẽ hiểu được một số vấn đề sau:

+/ Cách khai báo biến (String, Byte)
+/ Cách sử dụng hàm: Len, Trim, Replace
+/ Cách xây dựng một Function đơn giản

=> Em đã theo dõi nhiều bài hướng dẫn của bác Sa và học được rất nhiều điều vì nó rất cơ bản và nếu theo dõi dài liên kết lại thì đó tươn đương với cuốn giáo trình rất hay.
 
Upvote 0
- Em thấy bác Sa đã nói từ đầu là rèn luyện cách đọc Code, hiểu Code, diễn giải Code nên cái này cũng rất cần thiết cho thành viên mới.

.

Mình thì không đồng ý! Dù là ví dụ thì cũng phải có ý nghĩa ứng dụng thực tế
(và thực tế chẳng khi nào mình viết 1 code chỉ để nhìn chơi mà không ứng dụng gì)
Nên nhớ rằng: Người ta muốn học VBA nhanh là phải thông qua ứng dụng. Càng thấy hiệu quả do VBA mang lại thì người ta mới càng hứng thú
 
Upvote 0
Upvote 0
Dù sao nó cũng là 1 học liệu đó chứ, chú mầy!

[thongbao]Mình thì không đồng ý! Dù là ví dụ thì cũng phải có ý nghĩa ứng dụng thực tế
(và thực tế chẳng khi nào mình viết 1 code chỉ để nhìn chơi mà không ứng dụng gì)
[/thongbao]

Có thể nó là 1 học liệu tồi nhất & đán thương tệ trong topic này!
 
Upvote 0
Đếm khoảng trắng suy ra được số từ, ẹc ẹc

Cái đó chưa chắc đâu sư phụ à! Số lượng khoảng trắng không bao giờ tương quan với số từ, nhất là khi trong chuổi có khoảng trắng thừa
Ấy là em đang phân tích theo giải thuật trong code của sư phụ ChanhTQ. Đương nhiên, nếu em muốn đếm số từ thì cũng dựa vào khoảng trắng để đếm nhưng phải thêm công đoạn TRIM nữa thì mới chắc ăn
Em không hề phê phán code mà chỉ mới nêu bật tính ứng dụng, nhất là khi ta đang truyền đạt cho người chưa biết...
Em nói theo quan điểm của em: Nếu em không cảm thấy code ấy dùng để làm gì thì làm sao em có hứng để học?
 
Upvote 0
Cái đó chưa chắc đâu sư phụ à! Số lượng khoảng trắng không bao giờ tương quan với số từ, nhất là khi trong chuổi có khoảng trắng thừa
Ấy là em đang phân tích theo giải thuật trong code của sư phụ ChanhTQ. Đương nhiên, nếu em muốn đếm số từ thì cũng dựa vào khoảng trắng để đếm nhưng phải thêm công đoạn TRIM nữa thì mới chắc ăn
Em không hề phê phán code mà chỉ mới nêu bật tính ứng dụng, nhất là khi ta đang truyền đạt cho người chưa biết...
Em nói theo quan điểm của em: Nếu em không cảm thấy code ấy dùng để làm gì thì làm sao em có hứng để học?

Chỉ cần thay trim của VBA bằng trim của excel là được rồi mà. Vả lại ndu nhớ lại câu đầu tiên trong For Next là tính giai thừa không? Và tiếp theo là 3, 4 bài tập "vớ vẩn"?

Bài tập của Bác ChanhTQ cũng là 1 cách để giới thiệu việc xử lý chuỗi vậy? Có điều, tiếp theo bài này, nên có 1 bài gợi ý ứng dụng InStr, Mid, StrRev, ... vào 1 bài toán thường gặp nào đó.

Chẳng hạn như bài tập gán bảng màu chẵn xuống sheet, tiếp theo là 1 bài tập ứng dụng ghi dữ liệu, phát triển từ "kinh nghiệm" gán màu.
 
Upvote 0
Chỉ cần thay trim của VBA bằng trim của excel là được rồi mà. Vả lại ndu nhớ lại câu đầu tiên trong For Next là tính giai thừa không? Và tiếp theo là 3, 4 bài tập "vớ vẩn"?

.

Mấy cái đó em thấy chẳng vớ vẫn tí nào cả sư phụ à. Ít nhất nó ứng dụng được trên VB6 hoặc Word chẳng hạn (vì ứng dụng khác không có hàm hổ trợ sẵn)
-------------
Bài của sư phụ ChanhTQ theo em nên có những câu hỏi mở, chẳng hạn:
- Code này dùng để làm gì?
- Code này cần cải tiến những gì?
- Ứng dụng mở rộng của code?
vân vân.. và.. vân vân... nó mới hứng
Làm được sẽ nói lên tất cả mà không cần phải giải thích code (nói thật, có nhiều khi em còn chưa biết giải thích code của chính em, dù em hiểu rõ nó)
Là 1 lập trình viên, người ta cũng chẳng cần phải giải thích toàn bộ code, chỉ cần xem qua 1 đoạn code và biết đâu mới là trọng tâm (mấu chốt vấn đề có khi chỉ nằm đúng 1 dòng code trong cả "đám rừng")
 
Lần chỉnh sửa cuối:
Upvote 0
[thongbao]Nhân tiện đây xin đố luôn, không mới nhưng sẽ có người không biết (Chỉ dành cho người mới tập viết VBA):

Làm sao để ẩn Tên Macro ở cửa sổ Macro (Alt+F8), có bao nhiêu cách để ẩn?
[/thongbao]

Cách 1 của leonguyenz: OK
Thay Sub thành Private Sub.
Còn cách khác thì em chưa biết, chờ các bạn khác giải đáp.
Cách 2 của quocphuoc88: OK
Em biết thêm 1 cách nữa là để câu " Option Private Module " đầu code ( cái này e cũng mò trên GPE :) )
Còn ít nhất 1 cách nữa, mong các bạn tiếp tục.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom