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,662
Được thích
16,720
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

Lần chỉnh sửa cuối:
Nguyên văn bởi siwtom 1. Goto "phá vỡ" trật tự, thứ tự của code, code trở nên rối rắm, khó hiểu, khó theo dõi, khó kiểm soát, khó tìm lỗi hơn.
2. Khi dùng goto thì cơ hội phạm lỗi sẽ lớn hơn. Điều này dễ hiểu vì code với goto rối rắm hơn nên ta dễ sơ ý, dễ không nhận thấy những vấn đề quan trọng.
3. Phân tích code có nhiều goto khó hơn nhiều do code rối rắm hơn.



Vì vậy đối với những người chập chững/ tìm hiểu căn bản VBA như mình xin vui lòng hướng dẫn và chia sẻ tỉ mỉ, rõ ràng hơn những kinh nghiệm đó. Tks
Kinh nghiệm quý báu. Tks
 
Upvote 0
Ý người ta nói hạn chế Goto thôi, đâu ai nói code sai
--------------------

Khẳng định: THÓI QUEN GOTO là thói quen XẤU. Không tin Nghĩa có thể search khắp google mà hỏi thử
--------------------
Một cái Goto chẳng nói gì. Thử tưởng tượng trong code có vài chục cái goto thì lúc test code chẳng biết đâu mà lần
Ngày trước khi mới tập tành, code tôi goto cả đống. Bây giờ rảnh rỗi mở ra phải sửa lại hết (vì nó khó theo dõi chứ chắng có "sáng" tí nào cả)

Làm gì làm, nhưng "Pháp luật" không cấm là được! Nếu biết nó xấu thì "Anh Bill" đã không tạo ra nó rồi! Nhiều người không biết ứng dụng nên cứ bạ đâu goto bừa ra đấy, khi kiểm tra code thì rối ren, chồng chéo! Chẳng lẽ cái code có hơn chục dòng mà có Goto lại không kiểm soát được hay sao? Còn khi dùng 2 vòng lặp cùng lúc nếu muốn vòng lặp trong cho qua 1 vòng thì không thể không goto được!


Do
Kho = InputBox("Ban chon loai san pham nao?" & Chr(13) & "(a,b,c,d)", "Chon loai", , vbYesNoCancel)
Loop Until (Kho = "a" Or Kho = "b" Or Kho = "c" Or Kho = "d" Or Kho = vbCanel)
Set Rng = Sheet4.Range("A3:A16")
If (Kho <> vbCanel) Then
......
end if

1) Trên nguyên tắc vbCancel là một Hằng số cho ra giá trị là 2, tuy nhiên bạn viết vbCanel (thiếu chữ c) nên nó là một biến, vì biến này không có khai báo nên nó là biến Variant (tức biến rỗng), tất nhiên với biến Kho dạng String thì khi Kho = "" cũng có nghĩa Kho = vbCanel . Vì thế bạn mới may mắn thoát được vòng lặp khi bạn bấm vào Cancel hay OK nhưng InputBox = "".

2) Cấu trúc của InputBox như thế này:

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

Vì vậy đặt hằng số vbYesNoCancel là hoàn toàn không hợp lý, và hằng số này nó có giá trị là 3.

Bạn phihndhsp chú ý cho điều này!
 
Lần chỉnh sửa cuối:
Upvote 0
Nhưng ít ra nó cũng rất đẹp và sáng code phải không Sư phụ!

Thứ nhất, Goto giới hạn dùng càng ít càng tốt.
Thứ hai, Goto trở về trước thì lại càng giới hạn dùng hơn.

Những cái này tuy không phải là chân lý nhưng hầu hết dân lập trình đều đồng ý. Không cần phải dẫn chứng.

Chính tôi cũng có code dùng Goto, nhưng tôi rất dè dặt khi dùng nó. 99% các trường hợp là để chạy về cuối hàm dọn dẹp rác rưởi trước khi thoát. Cos những trương hợp dùng exit sub/function không được vì code hiện khoá một số tài nguyên (*), cần phải giải toả trước khi thoát.

(*) ví dụ code bạn đặt Application trong tình trạng background update, trước khi thoát bạn phải đặt nó trở về trạng thái ban đầu.
 
Upvote 0
Làm gì làm, nhưng "Pháp luật" không cấm là được! Nếu biết nó xấu thì "Anh Bill" đã không tạo ra nó rồi! Nhiều người không biết ứng dụng nên cứ bạ đâu goto bừa ra đấy, khi kiểm tra code thì rối ren, chồng chéo! Chẳng lẽ cái code có hơn chục dòng mà có Goto lại không kiểm soát được hay sao? Còn khi dùng 2 vòng lặp cùng lúc nếu muốn vòng lặp trong cho qua 1 vòng thì không thể không goto được!

Vấn đề ở đây là gì?
Vì topic này mở ra để cho NGƯỜI MỚI học hỏi nên ta phải hướng cho họ hướng đi đúng
Để giải quyết bài toán này có hàng đống cách và goto cũng chẳng ai nói là sai hay dở hơn vòng lập... Chỉ là ta phải nên cảnh báo để cho người mới đừng quá lạm dụng
Nghĩa sành quá nên tự kiểm soát code được, người mới họ có làm được không?
Nên nhớ: kiểm tra code theo kiểu tuần tự từ trên xuống vẫn dễ dàng hơn rất nhiều so với "nhảy cóc" lung tung khắp nơi
Nếu biết nó xấu thì "Anh Bill" đã không tạo ra nó rồi
Tôi có nói GOTO của anh Bill là xấu đâu nhỉ? Tôi nói rõ thế này mà:
Khẳng định: THÓI QUEN GOTO là thói quen XẤU.

--------------------
Tôi nhắc lại: Nếu code Goto nằm ở 1 topic khác tôi sẽ không bàn đến, đừng để các thành viên mới tin tưởng để rồi tạo thành 1 thói quen xấu sau này
 
Upvote 0
2) Cấu trúc của InputBox như thế này:

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

Vì vậy đặt hằng số vbYesNoCancel là hoàn toàn không hợp lý, và hằng số này nó có giá trị là 3.

Bạn phihndhsp chú ý cho điều này!

Cả Nghĩa và Phi và cả mọi người chú ý cho điều này (sic, ẹc ẹc):

Trong cú pháp của InputBox không có chỗ cho tham số Buttons, do đó dù gán vbOKOnly, vbYesNo, vbYesNoCancel gì gì đi nữa, cũng là 2 nút OK Cancel.

Thứ 2, vbYesNoCancel không phải hằng số và cũng không có giá trị là 3.

Mấy đoạn code trong topic này, vài người khinh thường code quá căn bản nên cứ đọc suông rồi phán chứ không test.

Như tôi viết bài này, InputBox tôi học, sử dụng nhão nhừ, nhưng trước khi viết cũng phải viết 1 câu lệnh để test trước khi phán!
Rồi lại viết 1 câu MsgBox để xem trong cú pháp MsgBox, cái vbQuaiQuy là tham số gì, biết nó là tham số buttons để viết vào câu. Thế mà cũng có khi sai ấy chứ.
 
Lần chỉnh sửa cuối:
Upvote 0
Thứ nhất, Goto giới hạn dùng càng ít càng tốt.
Thứ hai, Goto trở về trước thì lại càng giới hạn dùng hơn.

Những cái này tuy không phải là chân lý nhưng hầu hết dân lập trình đều đồng ý. Không cần phải dẫn chứng.

Chính tôi cũng có code dùng Goto, nhưng tôi rất dè dặt khi dùng nó. 99% các trường hợp là để chạy về cuối hàm dọn dẹp rác rưởi trước khi thoát. Cos những trương hợp dùng exit sub/function không được vì code hiện khoá một số tài nguyên (*), cần phải giải toả trước khi thoát.

(*) ví dụ code bạn đặt Application trong tình trạng background update, trước khi thoát bạn phải đặt nó trở về trạng thái ban đầu.


Tôi không bảo thủ, nhưng tôi không ngán phải dùng GOTO và không có cảm giác sợ dùng GOTO như nhiều người nghĩ!

Lý do:

1) Khi có một nhãn (Label) thì cấu trúc của nó là một tên nhãn và dấu 2 chấm (:). Dù cho bạn có viết nó ở đâu đi chăng nữa nó cũng tự động chạy về sát rìa trái của cửa sổ soạn thảo, chính vì điều này bạn dễ dàng nhận biết code chắc chắn sẽ có GOTO.

2) Kiểm tra GOTO nằm tại đâu, đơn giản thôi, đã có Ctrl+H. Cứ Find Next là chúng "hiện nguyên hình" không sót một tên!

3) Nguyên tắc của tôi chỉ GOTO cho 1 đến 2 trường hợp và thường viết code chừng 20 dòng, nếu code nhiều hơn, tôi thường ngắt code ra thành nhiều thủ tục nhỏ, cho nên dù có GOTO nên cũng rất dễ phát hiện.

Cho đến nay tôi vẫn làm như thế và rất hài lòng là mình dám nghĩ dám làm, không theo tâm lý đám đông là như vậy.
 
Lần chỉnh sửa cuối:
Upvote 0
Thứ 2, vbYesNoCancel không phải hằng số và cũng không có giá trị là 3.

Ẹc ... ẹc ....

Em đố Sự phụ, cấu trúc này đặt tại đâu sẽ cho ra kết quả?

?vbYesNoCancel

Đồng thời, kính tặng Sư phụ bảng này luôn!
 

File đính kèm

  • KinhTang.jpg
    KinhTang.jpg
    177.1 KB · Đọc: 61
Lần chỉnh sửa cuối:
Upvote 0
Dùng goto đã khó hiểu, dùng goto để thay vòng lặp lại càng khó hiểu hơn.

Khi đọc code, thấy từ khoá DO, người ta tự động biết có một hiện tương lặp lại. Khi thấy một cái label, người ta chưng hửng: cái label này mình đã đọc qua cái Goto của nó chưa? code chỗ nào dẫn về đây? nó dùng để nhảy code hay dùng để lộn lại vòng lặp - tức là Goto tời hay lui?

Trên tình trạng lý tưởng, đường ràng ràng trước mặt, ai muốn đi bên trái bên phải gì cũng là quyền của họ. Trên thực tế, nếu đám đông đi bên phải mà mình đi bên trái là đi ngược bên. Hậu quả là cứ va mãi vào những người chiều kia.
 
Upvote 0
Ẹc ... ẹc ....
Em đố Sự phụ, cấu trúc này đặt tại đâu sẽ cho ra kết quả?
?vbYesNoCancel

Thứ nhất, khi diễn đạt trong câu văn viết về cú pháp, nó là tham số của inputBox chứ không phải hằng số.

Thứ hai, cái cửa sổ gõ dấu hỏi là chỗ nào thì tôi đã viết ra cách đây 5 năm trong topic Căn bản về For next.

Thứ ba, trong bài Nghĩa viết lời nhắc cho phihn, chắc chắn rằng ý Nghĩa muốn nói về "nếu giá trị trả về của InputBox là vbCancel" và có giá trị bao nhiêu, chứ không phải chủ ý nói đến vbYesNoCancel có giá trị bao nhiêu. vbYesNoCancel có giá trị bao nhiêu thì có ý nghĩa gì khi nói đến code của Phihn?
 
Lần chỉnh sửa cuối:
Upvote 0
Dùng goto đã khó hiểu, dùng goto để thay vòng lặp lại càng khó hiểu hơn.

Khi đọc code, thấy từ khoá DO, người ta tự động biết có một hiện tương lặp lại. Khi thấy một cái label, người ta chưng hửng: cái label này mình đã đọc qua cái Goto của nó chưa? code chỗ nào dẫn về đây? nó dùng để nhảy code hay dùng để lộn lại vòng lặp - tức là Goto tời hay lui?

Trên tình trạng lý tưởng, đường ràng ràng trước mặt, ai muốn đi bên trái bên phải gì cũng là quyền của họ. Trên thực tế, nếu đám đông đi bên phải mà mình đi bên trái là đi ngược bên. Hậu quả là cứ va mãi vào những người chiều kia.
NÓ ĐÁNG SỢ VẬY SAO? KAKAKAKAKA

Giống như Thầy ndu96081631 đang tìm cách diệt virus, tôi có tâm lý sợ bởi tôi không có cách trị, không biết nguyên tắc hoạt động của nó, không biết nó trú ẩn tại đâu nên tôi rất sợ, không dám nhìn tới nó, và tâm lý đám đông chắc cũng như tôi thôi, nhưng với Thầy thì đang tỏ ra rất khoái trá nếu ai đó "gửi tặng" Thầy một con virus!

Vậy Thầy có gì sai sao? Đi ngược với đám đông sao?

Quan trọng là ta phải biết cách để khống chế nó, hiểu được nguyên tắc hoạt động của nó! Ông bà ta có câu "Chớ thấy sóng cả mà ngã tay chèo" là như vậy!
 
Upvote 0
Xem ra, đối với HT Nghĩa bây giờ, thì đi ngủ là thượng sách. Giờ này càng viết, hắn càng không đọc kỹ. Và hắn lại edit bài để củng cố cái "xì trum" của hắn, dù chưa đọc bài trả lời của mình.
 
Upvote 0
Thứ nhất, khi diễn đạt trong câu văn viết về cú pháp, nó là tham số của inputBox chứ không phải hằng số.

Thứ hai, cái cửa sổ gõ dấu hỏi là chỗ nào thì tôi đã viết ra cách đây 5 năm trong topic Căn bản về For next.

Thứ ba, trong bài Nghĩa viết lời nhắc cho phihn, chắc chắn rằng ý Nghĩa muốn nói về "nếu giá trị trả về của InputBox là vbCancel" và có giá trị bao nhiêu, chứ không phải chủ ý nói đến vbYesNoCancel có giá trị bao nhiêu. vbYesNoCancel có giá trị bao nhiêu thì có ý nghĩa gì khi nói đến code của Phihn?
Hôm nay Sư phụ làm sao thế? Em đã nhắc tại bài #154 rồi nhưng vẫn không hiểu, đợi phải đưa cấu trúc lên!

Cho dù hằng số có nằm tại đâu vẫn là hằng số mà thôi vì hằng số không thay đổi giá trị như biến, điều này là tối thiểu. Cũng may khi bạn đó gán hằng số vbYesNoCancel lại nằm trong đối số [xpos] của InputBox nên mới không xảy ra lỗi đấy!

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
 

File đính kèm

  • KhongHopLy.jpg
    KhongHopLy.jpg
    156.7 KB · Đọc: 78
Lần chỉnh sửa cuối:
Upvote 0
Bạn hiền tuyệt lắm! Rất hợp với ý mình! Không cần dùng vòng lặp Do ... Loop để bẫy lỗi là như thế! Great!

Bạn thay Do ... Loop bằng cách dùng Goto và bạn mừng? Bản chất thì cũng là một loạt dòng code được thực hiện lặp đi lặp lại nhưng dùng Goto? Và bạn cho đó là code tốt hơn?

Thôi thì tùy mỗi người.

À mà bạn bỏ từ "bẫy lỗi" đi nhé. Code để phục phụ các chọn lựa khác nhau của người dùng đâu có dính dáng gì tới "bẫy lỗi"? Lỗi là những trường hợp vd. như: chia cho 0, mở tập tin không tồn tại, dùng đối tượng chưa được khởi tạo v...v Và để phục vụ những tình huống lỗi như thế thay vì nhìn thông báo hoặc "giết" trong Task Manager thì người ta viết code để xử lý. Đó mới là "bẫy lỗi". Chứ chuyện tôi chọn "a" hay "b" hay Cancel đâu có là lỗi gì?
 
Upvote 0
Hôm nay Sư phụ làm sao thế? Em đã nhắc tại bài #154 rồi nhưng vẫn không hiểu, đợi phải đưa cấu trúc lên!
Cho dù hằng số có nằm tại đâu vẫn là hằng số mà thôi vì hằng số không thay đổi giá trị như biến, điều này là tối thiểu.

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

Nghĩa phải đọc lại từng câu tôi viết, câu nào tôi cũng viết đủ ý nghĩa, kể cả câu sai mà tôi đã edit mờ đi và ghi chú sai. Một câu đơn giản là MsgBox Arr() bị lỗi mà Nghĩa cũng đi test sai code để nói là không lỗi.

Nhắc lại và giải nghĩa lại 1 câu liên quan:

Khi phát biểu 1 câu quan trọng để cho người mới học biết về cú pháp, phải dùng từ chính xác. InputBox() là 1 hàm, thì bên trong dấu ngoặc là các tham số (hoặc đối số) của hàm. Giá trị biến hoặc giá trị hằng cũng là tham số.

Khi nào nói đến việc viết tắt như End(3), Borders(7), InputBox (,,,3), .... thì mới nói đến giá trị hằng của tham số.

Nói đến vbOKQuaiQuy thì phải nói đến việc nó không phải là tham số của InputBox, chứ không phải nói giá trị của nó bằng bao nhiêu.


Đây là topic giới thiệu VBA căn bản cho người mới học, nên viết mọi thứ phải cân nhắc. Nếu sai phải nhận sai và ghi chú sai để người đọc biết và tránh. Cái mà ndu, siwtom, Vetmini, ... đều công nhận là không nên giới thiệu thì đừng cố bảo vệ quan điểm cá nhân trong topic này.

Còn việc gõ ?abc ở đâu hoặc tìm kiếm giá trị hằng ở bảng nào, Nghĩa có thể giới thiệu cho người mới, chứ đừng tặng tôi, vì tôi biết từ 5 năm trước đây rồi. Thí dụ tôi có thể hỏi Nghĩa có biết sử dụng object Browser hay không, chứ không phải Nghĩa hỏi ngược lại.
 
Upvote 0
Ẹc ... ẹc ....
Em đố Sự phụ, cấu trúc này đặt tại đâu sẽ cho ra kết quả?
?vbYesNoCancel
Đồng thời, kính tặng Sư phụ bảng này luôn!
Theo em hiểu: Anh Nghĩa đang nói đến đối số của MsgBox ở bảng này:
7.jpg
Nhưng anh Nghĩa chưa up luôn bảng Giá trị trả về của MsgBox:
8.jpg
Còn các tranh luận thì nói về InputBox.
Hình như không có giá trị trả về của InputBox khi nhấn các nút OK, Cancel.
Vấn đề GoTo mong là anh Nghĩa đừng bàn sâu vì đã mất 4, 5 trang rồi, bọn em khó nắm được cái cơ bản.
Sau mỗi bài tập, nhờ các Thầy chỉ cho chỗ thừa thiếu trong code, giải thuật, ... (đối với VBA cơ bản).
 
Upvote 0
Nói về Goto 1 chút:

Đúng là Goto ta nên hạn chế dùng, nhất là goto lên phía trên (dòng lệnh đã thực hiện)

Ai lại lấy Goto thay cho Do . . Loop Hay For . . . Next bao giờ!

Quả thật đây là lần đầu mình gặp & trong trường hợp là người hướng dẫn xài VBA kia đấy.

Riêng mình, xài Goto cũng có nhưng thường Goto xuống nhãn có bên dưới dòng lệnh Exit Sub

Và tôi nói thêm rằng, viết cho người khác xài tôi không bao giờ dùng Goto, thà rằng không viết còn hơn.

Với tôi Goto chỉ để dành xài riêng mà thôi.

Thân ái & cảm ơn các bạn đã chiếu cố đến bài.
 
Upvote 0
Theo em hiểu: Anh Nghĩa đang nói đến đối số của MsgBox ở bảng này:

Nhưng anh Nghĩa chưa up luôn bảng Giá trị trả về của MsgBox:

Còn các tranh luận thì nói về InputBox.
Hình như không có giá trị trả về của InputBox khi nhấn các nút OK, Cancel.
Vấn đề GoTo mong là anh Nghĩa đừng bàn sâu vì đã mất 4, 5 trang rồi, bọn em khó nắm được cái cơ bản.
Sau mỗi bài tập, nhờ các Thầy chỉ cho chỗ thừa thiếu trong code, giải thuật, ... (đối với VBA cơ bản).

Khi mới bắt đầu học lập trình, thì các cuốn sách luôn luôn dành các mục đầu tiên để nói về BIẾN & HẰNG SỐ. Đó là điều rất căn bản nên người mới lập trình phải tìm hiểu về nó, nên nó có được thảo luận tại đây cũng rất chính đáng.

Phải thống nhất với nhau rằng: Với những Hằng số có sẳn trong VBA thì dù nó là hằng số để dùng cho trường hợp nào đi chăng nữa ta vẫn có thể dùng nó được để thay thế giá trị (vấn đề là ta có muốn dùng hay không).

Hằng số là một giá trị không thay đổi, song với Biến thì có thể thay đổi được giá trị:

Mã:
Option Explicit
Private Const HangSo As Byte = 1
Private BienSo As Long


Sub Test3()
    HangSo = 3
    MsgBox HangSo
End Sub


Sub Test4()
    BienSo = 3
    MsgBox BienSo
    BienSo = 5
    MsgBox BienSo
End Sub

Với Test3 sẽ bị lỗi vì Hằng số không thể thay đổi giá trị được!

Khi một Biến, nếu không khai báo rõ ràng trong thủ tục và nếu biến đó lại trùng với tên của Hằng số có sẳn của VBA thì nó chính là Hằng số chứ không thể gọi là biến.

Chứng minh:

Mã:
[SIZE=4][COLOR=#ff0000][B]Option Explicit[/B][/COLOR][/SIZE]


Sub Test()
    Dim vbYesNoCancel As Long
    vbYesNoCancel = 10
    MsgBox vbYesNoCancel
End Sub


Sub Test2()
    MsgBox vbYesNoCancel
End Sub

Với Test1 khi chạy code, nó sẽ cho ra giá trị là 10 >>> Nó là một BIẾN

Với Test2 khi chạy code, nó sẽ cho ra giá trị là 3 >>> Nó là một HẰNG.

----------------------------------------------------------------------

Tôi đã góp ý với phihndhsp như thế này:

Do
Kho = InputBox("Ban chon loai san pham nao?" & Chr(13) & "(a,b,c,d)", "Chon loai", , vbYesNoCancel)
Loop Until (Kho = "a" Or Kho = "b" Or Kho = "c" Or Kho = "d" Or Kho = vbCanel)
Set Rng = Sheet4.Range("A3:A16")
If (Kho <> vbCanel) Then
......
end if

1) Trên nguyên tắc vbCancel là một Hằng số cho ra giá trị là 2, tuy nhiên bạn viết vbCanel (thiếu chữ c) nên nó là một biến, vì biến này không có khai báo nên nó là biến Variant (tức biến rỗng), tất nhiên với biến Kho dạng String thì khi Kho = "" cũng có nghĩa Kho = vbCanel . Vì thế bạn mới may mắn thoát được vòng lặp khi bạn bấm vào Cancel hay OK nhưng InputBox = "".

2) Cấu trúc của InputBox như thế này:

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

Vì vậy đặt hằng số vbYesNoCancel là hoàn toàn không hợp lý, và hằng số này nó có giá trị là 3.

Bạn phihndhsp chú ý cho điều này!

Và được Sư phụ comment như thế này:

Cả Nghĩa và Phi và cả mọi người chú ý cho điều này (sic, ẹc ẹc):

Trong cú pháp của InputBox không có chỗ cho tham số Buttons, do đó dù gán vbOKOnly, vbYesNo, vbYesNoCancel gì gì đi nữa, cũng là 2 nút OK Cancel.

Thứ 2, vbYesNoCancel không phải hằng số và cũng không có giá trị là 3.

Mấy đoạn code trong topic này, vài người khinh thường code quá căn bản nên cứ đọc suông rồi phán chứ không test.

Như tôi viết bài này, InputBox tôi học, sử dụng nhão nhừ, nhưng trước khi viết cũng phải viết 1 câu lệnh để test trước khi phán!
Rồi lại viết 1 câu MsgBox để xem trong cú pháp MsgBox, cái vbQuaiQuy là tham số gì, biết nó là tham số buttons để viết vào câu. Thế mà cũng có khi sai ấy chứ.

----------------------------------------------------------------------

Với phát biểu như dưới đây, tôi nghĩ là hoàn toàn không chính xác và nếu ai nói đó là chính xác thì người đó chưa hiểu gì về Hằng số!

Thứ 2, vbYesNoCancel không phải hằng số và cũng không có giá trị là 3.

Cho nên tôi mới phải tranh luận để người nào chưa nhận thức được điều này, nhất là những người mới học lập trình thấy rõ bản chất của Hằng và Biến.

Vì vậy, dù số đông có "ném đá" tôi vẫn tranh luận vì cái lẽ đúng.
 
Lần chỉnh sửa cuối:
Upvote 0
Khi mới bắt đầu học lập trình, thì các cuốn sách luôn luôn dành các mục đầu tiên để nói về BIẾN & HẰNG SỐ. Đó là điều rất căn bản nên người mới lập trình phải tìm hiểu về nó, nên nó có được thảo luận tại đây cũng rất chính đáng.

Phải thống nhất với nhau rằng: Với những Hằng số có sẳn trong VBA thì dù nó là hằng số để dùng cho trường hợp nào đi chăng nữa ta vẫn có thể dùng nó được để thay thế giá trị (vấn đề là ta có muốn dùng hay không).

Hằng số là một giá trị không thay đổi, song với Biến thì có thể thay đổi được giá trị:
.

Tôi thấy vầy:
Nghĩa đừng cố tranh luận nữa, tập trung vào chủ đề topic đi
Vì một sự thật hiển nhiên là: NGHĨA KHÔNG HIỂU NHỮNG GÌ MỌI NGƯỜI NÓI
(Ông nói Gà, bà nói Vịt)
Quay lại chủ đề chính, đừng để các thành viên mới sốt ruột
 
Upvote 0
Tôi thấy vầy:
Nghĩa đừng cố tranh luận nữa, tập trung vào chủ đề topic đi
Vì một sự thật hiển nhiên là: NGHĨA KHÔNG HIỂU NHỮNG GÌ MỌI NGƯỜI NÓI
(Ông nói Gà, bà nói Vịt)
Quay lại chủ đề chính, đừng để các thành viên mới sốt ruột
Một phát biểu chưa chính xác, nhất là phát ra từ "cây cao bóng cả" của diễn đàn thì nó nguy hiểm như thế nào đối với thành viên mới học hả Thầy? Em đang tranh luận nghiêm túc đó chứ? Mà thôi, em sẽ ngưng tranh luận tại đây, nếu thấy gì chưa đúng em cũng sẽ không tranh luận nữa vậy. Chấm dứt là chấm dứt, không dây dưa tí nào nữa!
 
Upvote 0
Với phát biểu như thế này tôi nghĩ là hoàn toàn không chính xác và nếu ai nói đó là chính xác thì người đó chưa hiểu gì về Hằng số!

Thứ 2, vbYesNoCancel không phải hằng số và cũng không có giá trị là 3.

Cho nên tôi mới phải tranh luận để người nào chưa nhận thức được điều này, nhất là những người mới học lập trình thấy rõ bản chất của Hằng và Biến.

Vì vậy, dù số đông có "ném đá" tôi vẫn tranh luận vì cái lẽ đúng.

Cái bản chất của hằng và biến, nếu Nghĩa muốn giới thiệu thì viết hẳn 1 bài để giới thiệu
Tương tự, Nghĩa viết hẳn 1 bài về giá trị ban đầu của biến có khai báo kiểu và không khai báo kiểu
Và, viết hẳn 1 bài về giá trị các hằng

Chứ không phải viết về 1 giá trị hằng nào đó trong cú pháp hàm và tham số.

Còn câu của tôi mà Nghĩa trích, tôi đã viết vắn tắt sau đó giải nghĩa lại, mà Nghĩa không đọc, hoặc đọc không hiểu, hoặc cố tình không nói đến.


Tóm lại thế này, Nghĩa mở 1 topic với một ý định tốt và đáng quý. Nếu trong tất cả các câu đố, bài giải, bài giới thiệu thêm, Nghĩa viết đúng chuẩn, không cố bảo vệ ý kiến của mình, biết tự nhận sai, hoặc nhận rằng không phù hợp trong topic này, ... thì tôi và cả ndu, anh siwtom, vetmini, ... cũng sẽ không tham gia (đừng nói ném đá, tôi không ném đá và chẳng ai ném đá ai hết)


Thí dụ bài nhận xét của Nghĩa về các bài trả lời tham gia câu đố Ending-Test, bài nhận xét đó đúng, thì có ai phản đối bài đó đâu?

Tôi và các anh ấy tham gia vì nhận thức vấn đề quan trọng của topic này, cái gì nên giới thiệu và cái gì không (Goto), nên dùng cái gì trong trường hợp nào (Do – Loop thay cho For 1 triệu lần), … nếu người mới học vào đây đọc và làm theo tất tần tật thì hậu quả thế nào? Trong khi đó Nghĩa là người tạo topic lại không nhận thức được như thế: Góp ý không nhận, sai không sửa, bài góp ý không đọc.

Vậy từ giờ, tôi không tham gia topic này nữa. Nhưng tôi vẫn sẽ theo dõi, và nếu nhận ra rằng bài hướng dẫn nào có thể làm cho người mới học đi sai đường, bài nào viết sai câu cú có thể gây hiểu sai, tôi xóa. Nếu không xóa thì người học thực hành sai, ảnh hưởng đến cả GPE, vì họ học cái sai từ GPE.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom