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:
[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

Cách 2 của quocphuoc88: OK

Còn ít nhất 1 cách nữa, mong các bạn tiếp tục.

Đối với những người mới học, chỉ có cách thứ nhất là nên dùng.

Cách thứ 2 tương đối hơi khó hiểu. Đòi hỏi kiến thức về phạm vi code. Chỉ những người làm việc với nhiều projects (trong một lúc) mới nên dùng tới.

Cách thứ 3 (không biết có phải là cách người ra bài muốn nói?) tương đối lại càng cao cấp hơn. Người dùng phải hiểu cách hoạt động của hàm.
 
Upvote 0
Đúng là cách 3 là như bạn nói.

Tóm lại cách thứ 3 là gán cho thủ tục 1 tham số bất kỳ nhưng không dùng tới. Optional cũng được, nhưng cũng có thể không cần.

Lý do là tất cả thủ tục có tham số truyền không thể chạy bằng F5 hoặc chạy trực tiếp, và cũng không thể thấy bằng Alt - F8
 
Upvote 0
Muốn chạy được bằng F5 thì hàm không được có tham số. Ta có thể thay tên sub thành function vì function không được coi như macro cho nên nó sẽ không có mặt trong list của macro.

Lưu ý là function thì phải trả về một trị. Cho nên cuối function phải có dòng = 0 (hay cái gì cũng được). Và nếu module dùng "Option Explicit" thì phải định dạng trả về của function.

-- Đương nhiên function cũng có cái bất lợi khác của nó. Bởi vậy tôi mới nói cách này hơi cao cấp.
 
Upvote 0
Muốn chạy được bằng F5 thì hàm không được có tham số. Ta có thể thay tên sub thành function vì function không được coi như macro cho nên nó sẽ không có mặt trong list của macro.

Lưu ý là function thì phải trả về một trị. Cho nên cuối function phải có dòng = 0 (hay cái gì cũng được). Và nếu module dùng "Option Explicit" thì phải định dạng trả về của function.

-- Đương nhiên function cũng có cái bất lợi khác của nó. Bởi vậy tôi mới nói cách này hơi cao cấp.
Tất nhiên là funtion thì OK rồi nhưng mọi người đang bám sát câu hỏi của Hai Lúa Miền Tây mà bạn VetMini

[thongbao]Làm sao để ẩn Tên Macro ở cửa sổ Macro (Alt+F8), có bao nhiêu cách để ẩn?
[/thongbao]
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi, học VBA và macro ở trung tâm nào tại TP.HCM vậy?
Có ai biết, thông tin giúp em với
 
Upvote 0
Upvote 0
Cách "củ chuối" này có được tính không nhỉ? Hic, hic, hic (gọi là để trả lời chứ ai lại áp dụng thế này :))

Code trong UserForm1:
[GPECODE=vb]Sub MyMacro() 'Macro trong Userform thì ẩn quá rùi nhỉ?
MsgBox "MyMacro is running !"
End Sub[/GPECODE]
Code trong Module: (Để kiểm chứng Sub trong UserForm1 vẫn chạy được)
[GPECODE=vb]Sub Test()
Call UserForm1.MyMacro
End Sub[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Cách "củ chuối" này có được tính không nhỉ? Hic, hic, hic (gọi là để trả lời chứ ai lại áp dụng thế này :))

Code trong UserForm1:
[GPECODE=vb]Sub MyMacro() 'Macro trong Userform thì ẩn quá rùi nhỉ?
MsgBox "MyMacro is running !"
End Sub[/GPECODE]
Code trong Module:
[GPECODE=vb]Sub Test()
Call UserForm1.MyMacro
End Sub[/GPECODE]
Nếu thế này thì cái thằng Test trong module vẫn thấy được !
 
Upvote 0
Nếu thế này thì cái thằng Test trong module vẫn thấy được !
Ui trời, "hắn" này máy móc quá. Đã nói là VD "củ chuối" cho cái MyMacro. Sub Test (lẽ ra tui ko cho vào) là để kiểm chứng sub trong UserForm vẫn chạy được thui chứ tui cho vào Private Sub Button1_Click() thì mò ở đâu? Nói chung là ko nên đưa ra những ý kiến để ý tí một như vậy. (đã sửa thêm chú thích bài #331)

Tks/Brgds
 
Lần chỉnh sửa cuối:
Upvote 0
Ui trời, "hắn" này máy móc quá. Đã nói là VD "củ chuối" cho cái MyMacro. Sub Test (lẽ ra tui ko cho vào) là để kiểm chứng sub trong UserForm vẫn chạy được thui chứ tui cho vào Private Sub Button1_Click() thì mò ở đâu? Nói chung là ko nên đưa ra những ý kiến để ý tí một như vậy.

Tks/Brgds
Dạ, e xin lỗi không đọc kỹ. Tại e nhìn vào code thì thấy vẫn còn thấy nó nên nói vậy !
 
Upvote 0
Đề tài này bị chìm lâu quá, mình xin đẩy nó lên:

Excel sheet có:

1./ Hàm đổi CHỮ HOA thành chữ thường (LOWER) --> VBA có hàm Lcase.
2./ Hàm đổi chữ thường thành CHỮ HOA (UPPER) --> VBA có hàm UCase.

Vậy xin hỏi các bạn là làm thế nào không dùng những hàm trên để đổi CHỮ HOA thành chữ thường và ngược lại?
 
Upvote 0
Đề tài này bị chìm lâu quá, mình xin đẩy nó lên:

Excel sheet có:

1./ Hàm đổi CHỮ HOA thành chữ thường (LOWER) --> VBA có hàm Lcase.
2./ Hàm đổi chữ thường thành CHỮ HOA (UPPER) --> VBA có hàm UCase.

Vậy xin hỏi các bạn là làm thế nào không dùng những hàm trên để đổi CHỮ HOA thành chữ thường và ngược lại?
Có thể sử dụng hàm StrConv (em hiểu là String convert) :
Mã:
StrConv(string, conversion, LCID)
Với conversion:
- 1: Upper
- 2: Lower
- 3: Proper
...
Còn LCID thì em chưa biết, nhờ các Thầy diễn giải dùm!
 
Upvote 0
Có thể sử dụng hàm StrConv (em hiểu là String convert) :
Mã:
StrConv(string, conversion, LCID)
Với conversion:
- 1: Upper
- 2: Lower
- 3: Proper
...
Còn LCID thì em chưa biết, nhờ các Thầy diễn giải dùm!

LCID là Locale ID tức Locale identifier. Tôi không thạo tiếng Anh nên cứ hiểu nôm na là Mã Vùng, Số nhận dạng của vùng.

Có nhiều lúc cần phải nhập LCID. Vd. như hàm API GetLocaleInfo dùng để đọc ra những thông tin như: dạng ngày tháng dài/ngắn, ký tự thập phân, ký tự tiền tệ, ...
Nhưng đọc các thông tin cho quốc gia nào??? vd. đọc cho Việt Nam thì ký tự tiền tệ là ₫. Nhưng đọc cho Nga thì lại là ký tự khác. Vậy thì phải truyền vào GetLocaleInfo cái gọi là LCID. Việt Nam thì là &H042A

Có 2 loại LCID: user default locale identifier - có thể đọc ra bằng hàm API GetUserDefaultLCID, và system default locale identifier - có thể đọc ra bằng hàm API GetSystemDefaultLCID

Nếu tôi không lầm thì thế này:
1. Khi ta cài Windows thì có bước ta phải chọn vùng. Chọn gì thì có nghĩa là ta đã xác định system default locale identifier, và đồng thời user default locale identifier
2. Trong quá trình dùng Windows ta có thể nhiều lần đổi vùng trong Control Panel. Mỗi lần đổi như thế là ta đã đổi user default locale identifier

Ví dụ tôi cài Windows và chọn vùng là Ba Lan. Sau khi cài xong tôi có system default locale identifier = user default locale identifier = 1045 = &H415. Sau đó tôi chon trong CP vùng là Việt Nam. Lúc này
system default locale identifier = 1045, user default locale identifier = 1066 = &H42A

Đấy là LCID trong Windows. Cái LCID trong StrConv tôi nghĩ nó cũng chính là cái này. Thiết nghĩ nó chẳng qua là để convert cho chuẩn mà thôi. Nếu không nhập thì nó là system default locale identifier
 
Upvote 0
Cũng câu hỏi:

Excel sheet có:

1./ Hàm đổi CHỮ HOA thành chữ thường (LOWER) --> VBA có hàm Lcase.
2./ Hàm đổi chữ thường thành CHỮ HOA (UPPER) --> VBA có hàm UCase.

Vậy xin hỏi các bạn là làm thế nào không dùng những hàm trên để đổi CHỮ HOA thành chữ thường và ngược lại?

Ngoài cách dùng cách ở bài #336 thì còn cách nào khác không.
 
Upvote 0
Upvote 0
Web KT
Back
Top Bottom