Đố vui về VBA!

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,905
Nhằm cũng cố kiến thức về VBA cho các bạn mới bắt đầu và cả những bạn đang ứng dụng mà chưa hiểu nhiều về nó, tôi mở topic này với mong mõi qua những câu hỏi vui, các bạn sẽ nhận định lại sự hiểu biết cũa mình... (Kễ cã chính tôi cũng đang tập tành nên có rất nhiều cái chưa biết)
Mong rằng topic sẽ mang đến cho các bạn những khám phá thú vị với những cái tưỡng chừng như đã biết
Mong nhận dc bài viết về câu đố cũa các cao thủ! Còn các bạn mới thì đừng ngại khi đưa ra ý kiến cũa mình.. Có sai có sữa sẽ hoàn thiện!
Tôi xin mỡ màn trước bằng 1 câu hỏi đơn giãn
ANH TUẤN

CÂU HỎI 1: Tại sao biến K ko hoạt động?
Tôi muốn khi nhấn vào 1 button thì cell A1 sẽ tăng lên 1 đơn vị... Tôi đã làm như sau:
-Tạo 1 Command Button (nút nhấn thuộc thanh Control Toolbox), click phải chuột lên nút nhấn, chọn View code, rồi gõ vào đoạn code sau:
PHP:
Private Sub CommandButton1_Click()
   K = K + 1
   Range("A1").Value = K
End Sub
Ban đầu K chưa có gì, xem như =0, nhấn nút lần thứ nhất thì K dc tăng thêm 1, vậy K hiện tại sẽ bằng 1, và gán K vào cell A1 thì đương nhiên A1 sẽ =1... Nhấn nút lần 2, K lại dc tăng thêm 1 nên hiện tại K sẽ =2 và cell A1 cũng sẽ =2... vân vân.. từ đó diễn tiến tiếp...
Hi.. hi.. Điều này nghe qua có vẽ rất hợp lý, ấy thế mà khi nhấn nút nó chỉ hoạt động dc duy nhất 1 lần (A1 = 1) rồi thôi ko nhút nhít nữa...
Các bạn có thể giãi thích tại sao lại như thế ko? Tại sao những lần nhấn nút sau đó K lại ko tăng thêm tí nào (vì thực tế A1 vẫn cứ = 1 hoài) ?
ANH TUẤN
 
Upvote 0
Chàng Nghĩa này kỳ; Kẹt fím thì nên mua bàn fím khác hay dùng búa, đục, . . . mà sửa; Xài Code là lạm dụng!
:D :D :D

Chúc mọi người vui vẻ nhân dịp xuân về!
Là tỉ dụ mừ bác _)(#;, mà phải công nhận ra được đáp án của anh Nghĩa “đẹp zai” thì pha xử lý “cồng kềnh” thật!
 
Upvote 0
Chàng Nghĩa này kỳ; Kẹt fím thì nên mua bàn fím khác hay dùng búa, đục, . . . mà sửa; Xài Code là lạm dụng!
Anh chưa từng bị tê ngón tay, nhấn phím xuống và nó đơ không nhấc ngón tay lên được? Bàn phím không hư cũng bị tuốt ấy chứ.
Tuy vậy, tôi cũng sẽ không viết code cho các sự kiện như vậy, vì sự kiện còn dùng cho những việc khác. Viết nhiều nó rối. Với lại có những sự kiện rất khó kiểm soát.
 
Lần chỉnh sửa cuối:
Upvote 0
Điểm khác biệt giữa máy tính và điện thoại là bàn phím, nếu như máy tính mà kẹt phím thì rất nhiều ký tự được sản sinh ra trong thời gian nhấn và giữ phím, còn điện thoại thì không, một và chỉ một mà thôi.

Anh chưa từng bị tê ngón tay, nhấn phím xuống và nó đơ không nhấc ngón tay lên được? Bàn phím không hư cũng bị tuốt ấy chứ.
Tuy vậy, tôi cũng sẽ không viết code cho các sự kiện như vậy, vì sự kiện còn dùng cho những việc khác. Viết nhiều nó rối. Với lại có những sự kiện rất khó kiểm soát.

Thật ra có những thứ mình cần khống chế số lượng ký tự, nếu quá sẽ bị lỗi. Câu đố trên thực tế mình đã làm ở bài này cho cái TextBox nhập giờ mà mọi người không để ý:


Mọi người tải file về và kiểm tra sẽ thấy 2 sự kiện đó trong file.

Mình đã thử nhiều cách, nhưng thực sự là bó tay.
Chủ thớt đăng cái này làm anh em hại não quá :unknw:
Tôi nghĩ bạn này đã biết lâu rồi nhưng "giả vờ giả vật" để làm tăng sự chú ý của bài viết chăng?
 
Lần chỉnh sửa cuối:
Upvote 0
Đâu phải ai cũng có điều kiện như bác Sa hen!
Mình gắn thêm bàn fím & xài nó; Khi nào sắp hư (hiện giờ đang ở cữ thôi) thì xài cái gốc. & như vậy có thòi gian tha hồ vọc sửa; cho đến khi dùng đến búa & kìm mà không đặng thì ra tiệm!
. . . . .

Chúc mọi người vui vẻ!
 
Upvote 0
Khi nào sắp hư (hiện giờ đang ở cữ thôi) thì xài cái gốc
Thế nguy hiểm bác, khi nào gần hư ta mua cái khác thay vào chứ, cái gốc phải giữ đấy tuyệt đối giữ cho mới.
Tính em là cứ cái gì mới là nâng như nâng trứng, sau đó có vô tình làm rơi, hay gặp sự cố gì là bắt đầu tung như tung trứng, kéo theo 1 dãy cái sự bõ công.
Chúc bác năm mới vui vẻ, khỏe y năm ngoái!
TextBox nhập giờ mà mọi người không để ý
Chào bác, cái này lúc bác up lên là em test luôn, giữ lên xuống mà time nó không chạy phải nói là hơi bị ức chế, nhưng em thấp cổ bé họng nên không ý kiến được. Với lại có yêu cầu ************ mở code nên phải bỏ qua luôn.
Chắc bác nghiên cứu bỏ cái kìm kẹp phím thì tiện hơn. Thêm nữa là em không thích font dạng đá chân như Times ... lắm. Màu sắc thì dễ nhìn nhưng hơi đậm quá, nhẹ nhàng tí thì hợp ý em hơn. Đây là mong muốn mang tính chất cá nhân, nếu được thì mỗi mình em khoái, còn không được thì em vẫn dùng thôi. Tùy bác nhé.
Chúc bác năm mới vui vẻ, khỏe y như bác trên!
Mình đã thử nhiều cách, nhưng thực sự là bó tay.
Bác có nhiều ứng dụng hơi bị chất đấy. Có điều bác luôn khẳng định không biết VBA, chỉ ghép nối các thứ lại mà tạo thành. Nếu thế thì thực sự trình độ ghép nối hơi bị đỉnh, có thể liên kết các code lại để tạo thành file chuẩn, dùng thường xuyên không bị lỗi. Nó giống giống cao thủ ẩn mình.
Với quan điểm chủ quan của mình, thì khiêm tốn là điều mọi người nên hướng đến, nhưng khiêm tốn đến mức phi lý thì không nên lắm.
Chúc bác thành công và giúp đỡ được mọi người theo đúng ý muốn của mình!
 
Upvote 0
Chào bác, cái này lúc bác up lên là em test luôn, giữ lên xuống mà time nó không chạy phải nói là hơi bị ức chế, nhưng em thấp cổ bé họng nên không ý kiến được. Với lại có yêu cầu ************ mở code nên phải bỏ qua luôn.
Chắc bác nghiên cứu bỏ cái kìm kẹp phím thì tiện hơn. Thêm nữa là em không thích font dạng đá chân như Times ... lắm. Màu sắc thì dễ nhìn nhưng hơi đậm quá, nhẹ nhàng tí thì hợp ý em hơn. Đây là mong muốn mang tính chất cá nhân, nếu được thì mỗi mình em khoái, còn không được thì em vẫn dùng thôi. Tùy bác nhé.
Chúc bác năm mới vui vẻ, khỏe y như bác trên!
Nếu bạn là thành viên lâu năm và thường xuyên sẽ biết VBA password của tôi luôn là HoangTrongNghia hoặc HTN chỉ 2 cái pass này đổi qua đổi lại thôi, vì thế tôi không cần phải nhắc đi nhắc lại pass. Vả lại, đó là một ứng dụng nếu dùng không được thì cứ việc bỏ qua, đừng quan tâm người ta viết cái "quỷ" gì trong đó. Nếu quan tâm thì việc hỏi xin pass thì cứ việc viết bài xin pass thôi hay phá pass (diễn đàn này đầy rẫy các thủ thuật phá pass) cũng được.

Vấn đề "giữ lên xuống mà time nó không chạy" là do tôi ngăn không cho kẹt phím, tuy nhiên nhờ bạn nhắc tôi sẽ chỉnh lại nếu Keycode là mũi tên trái phải, lên xuống sẽ bỏ qua.

Khi bạn đã có password thì bạn muốn cá nhân hóa nó thế nào là tùy bạn, tôi đã chia sẻ thì tôi cũng chẳng quan tâm chuyện xào nấu code hay thiết kế mẫu mã giao diện, chỉnh sửa hay thiết kế lại theo ý bạn cứ việc tự nhiên ha.

Còn vài tiếng nữa là hết năm rồi. Chúc mọi người vui khỏe, phát triển và thành công.
 
Upvote 0
Hôm nay cuối năm âm lịch rồi, mình gửi đáp án luôn cho trọn vẹn nè, dưới đây là code ngăn không cho kẹt phím:
Mã:
Private priBlnOneKey As Boolean
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If priBlnOneKey Then KeyCode = 0
    priBlnOneKey = True
End Sub
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    priBlnOneKey = False
End Sub
''TEST:
Private Sub TextBox1_Change()
    Debug.Print "Change"
End Sub
Đơn giản nhưng hiệu quả phải không quý vị?!
Chắc anh chỉ thử với các phím số?
Code của anh có một số vấn đề bất cập khi áp dụng:
  1. Nhập ký tự với phím Shift
  2. Nhập liệu tốc độ cao
  3. Không có tác dụng với một số phím khi bật chế độ gõ tiếng việt kiểu Telex
  4. Các phím điều hướng, phím Delete và phím Backspace cũng bị ảnh hưởng bởi code trong khi các phím này thường được nhấn giữ có chủ đích.
Code sau khắc phục được 3/4 vấn đề trên, riêng vấn đề với kiểu gõ Telex sẽ không có cách xử lý bằng VBA.
Mã:
Private LastKey As Long
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii = LastKey Then KeyAscii = 0 Else LastKey = KeyAscii
End Sub
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    LastKey = 0
End Sub
 
Upvote 0
Code của anh có một số vấn đề bất cập khi áp dụng:
  1. Nhập ký tự với phím Shift
  2. Nhập liệu tốc độ cao
  3. Không có tác dụng với một số phím khi bật chế độ gõ tiếng việt kiểu Telex
  4. Các phím điều hướng, phím Delete và phím Backspace cũng bị ảnh hưởng bởi code trong khi các phím này thường được nhấn giữ có chủ đích
Do code sử dụng sự kiện KeyDown, tham số là KeyCode nên có cả các phím chức năng như shift, tab, mũi tên, delete, back, ... Sử dụng sự kiện KeyPress như code của NhatAnh bài 1,411 thì tham số Key AScii không có các phím chức năng và không bị như vậy.
Về tốc độ cao thì tôi mới chỉ test code NhatAnh thấy được, chưa test code này.
 
Upvote 0
Do code sử dụng sự kiện KeyDown, tham số là KeyCode nên có cả các phím chức năng như shift, tab, mũi tên, delete, back, ... Sử dụng sự kiện KeyPress như code của NhatAnh bài 1,411 thì tham số Key AScii không có các phím chức năng và không bị như vậy.
Về tốc độ cao thì tôi mới chỉ test code NhatAnh thấy được, chưa test code này.
Khi gõ nhanh sẽ có hiện tượng nhấn phím thứ 2 trước khi nhả phím thứ nhất. Khi đó sự kiện KeyPress/ KeyDown của phím thứ 2 xảy ra trước sự kiện KeyUp của phím thứ nhất. Thuật toán ở cả 2 bài 1411 và 1420 đều "nhận diện lầm" trường hợp này với trường hợp nhấn giữ 1 phím.
Ngoài ra code ở bài 1411 không dùng cách hủy sự kiện KeyPress (gán KeyAscii = 0) mà lưu chuỗi ký tự và gán ngược lại TextBox nên nếu con trỏ đang ở giữa chuỗi ký tự sẽ bị nhảy về cuối chuỗi ký tự.
 
Upvote 0
Khi gõ nhanh sẽ có hiện tượng nhấn phím thứ 2 trước khi nhả phím thứ nhất. Khi đó sự kiện KeyPress/ KeyDown của phím thứ 2 xảy ra trước sự kiện KeyUp của phím thứ nhất. Thuật toán ở cả 2 bài 1411 và 1420 đều "nhận diện lầm" trường hợp này với trường hợp nhấn giữ 1 phím.
Ngoài ra code ở bài 1411 không dùng cách hủy sự kiện KeyPress (gán KeyAscii = 0) mà lưu chuỗi ký tự và gán ngược lại TextBox nên nếu con trỏ đang ở giữa chuỗi ký tự sẽ bị nhảy về cuối chuỗi ký tự.
Quả đúng là như vậy, trường hợp chưa up cái này đã down cái kia mình chưa nghĩ đến. Cả trường hợp edit giữa từ/ giữa chuỗi. Chỉ phát hiện ra vụ phím chức năng của KeyCode thôi.
 
Upvote 0
Chắc anh chỉ thử với các phím số?
Code của anh có một số vấn đề bất cập khi áp dụng:
  1. Nhập ký tự với phím Shift
  2. Nhập liệu tốc độ cao
  3. Không có tác dụng với một số phím khi bật chế độ gõ tiếng việt kiểu Telex
  4. Các phím điều hướng, phím Delete và phím Backspace cũng bị ảnh hưởng bởi code trong khi các phím này thường được nhấn giữ có chủ đích.
Code sau khắc phục được 3/4 vấn đề trên, riêng vấn đề với kiểu gõ Telex sẽ không có cách xử lý bằng VBA.
Mã:
Private LastKey As Long
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii = LastKey Then KeyAscii = 0 Else LastKey = KeyAscii
End Sub
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    LastKey = 0
End Sub
Mặc dù tôi đã có đáp án tối ưu, nhưng đáp án của Hữu Thắng tôi nghĩ là tối ưu nhất.
 
Upvote 0
Nói thêm về code của Nghĩa sử dụng sự kiện KeyDown trong câu đố này. Nếu người dùng muốn:
- Đứng ở giữa chuỗi xóa từ đó đến hết, thì không nhấn đè phím delete được, phải delete từng ký tự
- Đứng ở giữa chuỗi xóa từ đó về đầu, thì không nhấn đè phím backspace được, cũng phải back từng ký tự.
- Nếu đứng giữa chuỗi nhấn Shift Home hoặc Shift End để xóa hết phía sau hoặc phía trước, sẽ phải đè Shift và nhấn Home hoặc End 2 lần.
- Nhấn Ctrl A để xóa hết phải nhấn Ctrl và 2 lần a.
- Muốn viết hoa 1 ký tự (thí dụ Bác) phải nhấn Shift và nhấn b 2 lần.
- Tiếng Việt "Anh By" gõ telex và cả gõ VNI: chữ ả không được, ra Bary hoặc Ba3y
- Chữ D (hoa), nhấn shift và d 1 lần không được, lần thứ 2 ra Đ. Tương tự A thành Â, O thành Ô, E thành Ê. Nếu giữa chuỗi sẽ mất khoảng trắng giữa 2 từ.
- Gõ kiểu VNI: gõ riêng rẽ ả thì được, gõ Bảy sẽ ra Ba3y
- Gõ kiểu VNI: Gõ Đánh thì dấu (số 2) gõ đâu cũng được, nhưng gõ Dành ra Da2nh. Nếu gõ Danh2 lúc ra Dành lúc không.
- ....
Nên không gọi là tối ưu.
 
Upvote 0
Đã tối ưu (bậc cao đỉnh) rồi còn có chuyện "tối ưu nhất"
Ôi thương cho tiếng Việt ngày nay...
Không chỉ tiếng Việt, các tiếng quốc tế trong các mục quảng cáo cũng dùng đại loại như "đã tuyệt vời nay còn tuyệt vời hơn" hay "sữa mẹ là tốt nhất, sữa ABC còn tốt hơn" v.v...
 
Upvote 0
Không chỉ tiếng Việt, các tiếng quốc tế trong các mục quảng cáo cũng dùng đại loại như "đã tuyệt vời nay còn tuyệt vời hơn" hay "sữa mẹ là tốt nhất, sữa ABC còn tốt hơn" v.v...
Tôi chỉ quan tâm tiếng mẹ đẻ của tôi. Tiếng gì khác không thành vấn đề.
Dân quảng cáo thì chỉ chú tâm thu hts, họ làm gì cần đếm xỉa đến văn hóa hay tình cảm. Đến đây thì bạn hoàn toàn dẫn chứng trật chỗ.
 
Upvote 0
Âu cũng đặng, ví như cơ cấu giải thưởng có nhất, nhì, ba , khuyến khích và trên tất thảy lại là giải đặc biệt đó thôi.
_)(#;
 
Upvote 0
Âu cũng đặng, ví như cơ cấu giải thưởng có nhất, nhì, ba , khuyến khích và trên tất thảy lại là giải đặc biệt đó thôi.
_)(#;
Đối với ngành toán và khoa học (tự nhiên cũng như nhân văn), người ta giành giải đặc biệt cho "giải pháp hoặc tư duy độc đáo"
Đem giải này trao cho "trên thảy" coi chừng vướng phải lỗi "không biết khuyến khích tư duy ngoài khuôn khổ lệ thường"
 
Upvote 0
…….……
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom