Như trong hình khi chạy bất cứ dòng nào trong 4 dòng cuối thì đều có lỗi "Operator not applicable to this operand type"
....
Tức không có chuyện 1 tham số integer còn tham số kia là boolean. Chỉ chấp nhận hoặc 2 boolean hoặc 2 integer.
Tóm lại trong trường hợp trên compiler không "ngầm ngầm" ép kiểu. Nếu muốn thì người viết code phải tự ép kiểu - tường minh.
a = True, b = False thi Integer(a) = 1, Integer(b) = 0
Nhưng ép integer về boolean thì phải cẩn thận. Khi chạy code trong hình dưới
...
Thì thấy chỉ có cửa sổ thứ 3 hiển thị số 1. Tại sao? 4000 (dec) = 0FA0 (hex). Do kiểu boolean có 1 BYTE nên boolean(4000) = boolean(0FA0) = A0 (hex) = 160. Tức khi ép thì chỉ lấy 1 BYTE. Tương tự boolean(2) = 2, boolean(1) = 1. Mà "a = true" chỉ thỏa khi a = 1.
Nếu thay cả 3 điều kiện "a = true" bằng "a = false" thì không có cửa sổ nào được hiện. Chỉ khi " a := boolean(0)" thì cửa sổ mới hiện với con số 0.
Nhưng nếu thay bằng "If a then" - có nghĩa không là "a = true", và không là "a = false" thì cả 3 cửa sổ đều hiện với 3 con số 160 (a = 160), 2 (a = 2), 1 (a = 1)
Tóm lại a: boolean là kiểu 1 BYTE. Nếu có a = false thì trong a có giá trị 0, nếu a = true thì trong a có giá trị 1. Nhưng nếu có a = boolean(c) với c là integer thì trong a có thể có giá trị tới 255 (nằm trong giới hạn 1 BYTE).
Cùng 1 code với cùng 3 giá trị nhưng với If a = true then thì chỉ có cửa sổ cuối với a = 1, với If a = false then thì không có cửa sổ nào, còn với If a then thì có cả 3 cửa sổ.
Theo như bác nói thì tôi hiểu Delphi (Object Pascal?) thuộc loại khá cứng về kiểu, nếu ép kiểu - tôi gọi theo tiếng nghề là implicit - mà có thể bị hiểu lầm thì nó không làm. Khi ấy người viết code phải chính thức ép kiểu - tôi gọi là explicit - chấp nhận rằng "tôi biết tôi đang làm gì".
Phần lớn các ngôn ngữ khác thì theo luật ép kiểu implicit: bên có phần chứa nhỏ sẽ ép theo bên lớn hơn, mục đích là để tránh tràn bộ nhớ.
Ví dụ sau đây tôi biết bác thừa biết, tôi chỉ nêu ra cho các bạn cần học code VBA:
- Trong VBA Boolean là một kiểu biến đặc biệt cuả Long (4 bai)
Nghẹn khi đem ép kiểu Long (4 triệu) vào b (chỉ chứa số lớn nhất là 32767). Giảm xuống là hết liền.
Lưu ý là nếu nạp số lớn hơn 2 tỷ gì đó thì Long sẽ mắc nghẹn. (dấu # là VBA tự thêm vào để cho biết đấy là trị Double - lớn hơn khả năng chứa của Long).
Nhưng Boolean sẵn sàng ép kiểu:
Và khi ép kiểu thì cứ trị khác 0 là True, không cần biết đầu vào là gì.
Tôi nhắc nhở cặn kẽ để cho các bạn mới học VBA biết cách hoạt động của các câu lệnh lô gic.
Nhưng cái mà tôi, chỉ nhắc lần này thôi, nhắc hoài đâm vô duyên, muốn truyền lại cho các bạn mới học code là sau khi đọc bài #20 và bài này thì bạn nhận cái gì?
Nếu bạn nói
"hiểu thêm về phép ép kiểu" thì tôi thất vọng quá.
Bạn nhìn kỹ lại xem hy vọng lần nàyn bạn nhận ra:
Để đi đến kiến thức này, chúng tôi phải trải qua công sức viết những đoạn code nhỏ để test: tức là tự đặt cho mình những tình huống, đoán chừng VBA sẽ cho ra gì. Và test, không đúng thì sửa và lại test. Không có một lập trình viên nào tiến trên mức nâng cao mà không biết thử và test.