Nhân 1 giá trị TRUE với 1 số nguyên dương (trong VBA)

Liên hệ QC

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,952
Tôi có 1 thắc mắc không thể giãi thích được: Tại sao trong VBA khi ta nhân 1 số nguyên dương với giá trị TRUE thì kết quả thu được lại là 1 số âm
Ví dụ: 28 * TRUE = - 28
???
 
Tôi có 1 thắc mắc không thể giãi thích được: Tại sao trong VBA khi ta nhân 1 số nguyên dương với giá trị TRUE thì kết quả thu được lại là 1 số âm
Ví dụ: 28 * TRUE = - 28
???

Trong VBE gõ TRUE, bôi đen và F1 thì Bác sẽ thấy ngay
 
Upvote 0
Trong VBE gõ TRUE, bôi đen và F1 thì Bác sẽ thấy ngay
Đồng ý nó = -1... (Tôi biết vụ này lâu rồi)... nhưng tại sao chứ?
Điều này phá vở mọi nhận định thế nào là TRUE và FALSE
Sao trong công thức thường thì TRUE nó lại =1
Phải có nguyên nhân sâu xa gì đó chứ (vì tôi nghĩ không phải MS quy định 1 cách tùy tiện)
 
Upvote 0
Đồng ý nó = -1... (Tôi biết vụ này lâu rồi)... nhưng tại sao chứ?
Điều này phá vở mọi nhận định thế nào là TRUE và FALSE
Sao trong công thức thường thì TRUE nó lại =1
Phải có nguyên nhân sâu xa gì đó chứ (vì tôi nghĩ không phải MS quy định 1 cách tùy tiện)
Không tìm thấy help nói TRUE, FALSE mang giá trị là bao nhiêu của hàm Excel nhưng help của VBA thì giải thích thế này:
PHP:
Boolean data type
A data type with only two possible values, True (-1) or False (0). Boolean variables are stored as 16-bit (2-byte) numbers.
 
Upvote 0
Why “True” is not 1

You could use the value of 1 for True if you want, since it will test properly, but then True is not equal to Not False, which will seem a bit strange. As such, it cannot be used to represent the Boolean value of True in value level Boolean expressions. Example:
a = 1 ' true, in the testing sense
b = 2 ' also true using the <>0 criteria

If a And b Then ' this is false because:
' 0000000000000001
' 0000000000000010
' ----------------
' 0000000000000000 And

When you are trying to deal with value level Boolean expressions, be certain you are using the values 0 and –1 so that all bits are either zero or one. Some have said the result of ignoring this advice will be unpredictable. That is incorrect. The result of doing this is entirely predictable but may be undesirable from your standpoint.

bài này
(tiếng Anh- Microsoft Basic Logical Expression Evaluation) có giải thích khá cặn kẽ về Cint(True) = -1

Bác nào rành tiếng Anh dịch lại cho thoát nghĩa để mọi ngườì tham khảo!
 
Upvote 0
Trong VBA, toi gõ đoạn mã, sau đó ấn F5 thì kết quả ở cửa ổ Immediate có kết quả khác
'''''''''''''''''''''''''''
Option Explicit
Sub test_true()
Dim a As Boolean
Debug.Print a * 28
End Sub
''''''''''''''''''''''''''''''''''
Kết quả là 0.
 
Upvote 0
Không thể dịch hết nhưng thấy đoạn này trong link nói trên:

That is Logical operations compare each pair of corresponding bits in the operands and perform the corresponding logical operation

Các phép toán Logic so sánh từng cặp bit tương ứng (theo thú tự) giữa các toán hạng và thể hiện trên 1 bit tương ứng của kết quả.

[table="ptm"]Assignment |Bits | Value As Integer
a = 0 | 0000000000000000 | 0
b= Not a | 1111111111111111 | -1[/table]

Nghĩa là Phép toán phủ định với toán tử Not sẽ đổi tất cả các bít có giá trị 0 thành bít có giá trị 1 và ngược lại (ngôn ngữ máy dùng 16 bit để thể hiện)

Và cũng thấy 1 thí dụ khác:

[table="ptm2"]Assignment |Bits | Value As Integer
b = 3 | 0000000000000011 | 3
Not b | 1111111111111100 | -4[/table]

Rõ ràng mọi 0 thành 1 và mọi 1 thành 0, dù khó hiểu gần chết.

Xem lại đọan trích:
a = 1 ' true, in the testing sense
b = 2 ' also true using the <>0 criteria

If a And b Then ' this is false because:
' 0000000000000001
' 0000000000000010
' ----------------
' 0000000000000000

[table="ptm3"] Value | Bits| Logical Value
a = 1 | 0000000000000001| True
b = 2 |0000000000000010| True
a and b|0000000000000000| False[/table]

Nếu tính theo từng cặp bit tương ứng thì là false. (lẽ ra là True).
Chỉ khó hiểu ở chỗ vì sao b= 2 (true) lại là 10 mà không là 01?
 
Upvote 0
Trong VBA, toi gõ đoạn mã, sau đó ấn F5 thì kết quả ở cửa ổ Immediate có kết quả khác
Mã:
Option Explicit
Sub test_true()
Dim a As Boolean 
Debug.Print a * 28
End Sub
Kết quả là 0.
Đặt 1 biến a loại boolean, mà không gán trước giá trị nào, thì nó có giá trị mặc định False. Vậy False*28 = 0 đâu có gì lạ.
 
Upvote 0
Dĩ D
Trong VBA, toi gõ đoạn mã, sau đó ấn F5 thì kết quả ở cửa ổ Immediate có kết quả khác
'''''''''''''''''''''''''''
Option Explicit
Sub test_true()
Dim a As Boolean
Debug.Print a * 28
End Sub
''''''''''''''''''''''''''''''''''
Kết quả là 0.

Dĩ nhiên vì a = false mà, đây là giá trị mặc định ban đầu của biến kiểu Boolean.

Option Explicit
Sub test_true()
Dim a As Boolean
a = true
Debug.Print a * 28
End Sub

Dĩ nhiên là bằng -28

Thân!
 
Upvote 0
Chỉ khó hiểu ở chỗ vì sao b= 2 (true) lại là 10 mà không là 01?

Sao lại khó hiểu chỗ này vậy bác, hệ nhị phân chuyển sang hệ thập phân là vậy mà

DEC|Dec2Bin
1|00001
2|00010
3|00011
4|00100
5|00101
6|00110
7|00111
8|01000
9|01001
10|01010
11|01011
12|01100
13|01101
14|01110

Thân!
 
Upvote 0
Khó hiểu ở chỗ:
1. Nếu thể hiện dạng nhị phân:
- a = 1 => nhị phân 1 = 01 (đúng)
- b = 2 => nhị phân 2 = 10 (đúng)
- a and b tính theo toán tử And sao lại and 2 cái giá trị nhị phân mà không and 2 cái giá trị logic?
2. Nếu thể hiện True - False
- And 2 cái giá trị logic: Đúng
- a = 1 = True => 01 (hiểu)
- b = 2 = True => 10 (không hiểu)

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

Hay là phép tính And trở thành phép tính nhân từng cặp bit của 2 giá trị nhị phân?
 
Lần chỉnh sửa cuối:
Upvote 0
00
Khó hiểu ở chỗ:
1. Nếu thể hiện dạng nhị phân:
- a = 1 => nhị phân 1 = 01 (đúng)
- b = 2 => nhị phân 2 = 10 (đúng)
- a and b tính theo toán tử And sao lại and 2 cái giá trị nhị phân mà không and 2 cái giá trị logic?
2. Nếu thể hiện True - False
- And 2 cái giá trị logic: Đúng
- a = 1 = True => 01 (hiểu)
- b = 2 = True => 10 (không hiểu)

1 .Thì nó đang tính thể hiện dưới dạng nhị phân mà, có ai quy định rằng toán tử and chỉ dùng để dành riêng cho giá trị logic đâu ???

2. Bác xem nhé :
|DEC|BIN|PTử 1|PTử 2| Boolean
a |1|01|0|1| TRUE
|||False|True| =Or(False;True) = TRUE
b |2|10|1|0|
|||True|False| =Or(True;False) = TRUE
a and b |0|00|=And(0;1) = 0|=And(1;0) = 0|
|||False and True = False|True and False = False| =Or(False;False) = FALSE

Thân!
 
Upvote 0
Tôi có 1 thắc mắc không thể giãi thích được: Tại sao trong VBA khi ta nhân 1 số nguyên dương với giá trị TRUE thì kết quả thu được lại là 1 số âm
Ví dụ: 28 * TRUE = - 28
???

Đọc cái bài các bạn kể cả cái bài trong link của MrLearnExcel thì càng hiểu nổi lý do tại sau true = -1.

Thôi thì chẳng thà không hiểu chứ muốn hiểu sâu càng nhức đầu. Cứ cho đây là 1 qui luật trong cách tính true/false sau hậu trường của máy vi tính. Giống như ta gật đầu đồng ý chứ không là lắc đầu khi là TRUE. Trong ngôn ngữ của máy tính nó "đắc co" bằng cách xìa ra cái số -1 vậy.

À, cần nói thêm. Các đạo sĩ khi viết code trong VBA thì nhớ dùng chữ TRUE trong các boolean test cho đồng nhất chớ đừng có dùng +1 hay trừ 1 để tránh trường hợp tẩu hỏa nhập ma.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Thì nó đang tính thể hiện dưới dạng nhị phân mà, có ai quy định rằng toán tử and chỉ dùng để dành riêng cho giá trị logic đâu ???
Nếu chấp nhận toán tử and tính cho giá trị nhị phân thì thí dụ đó đúng. Nhưng khi cho thí dụ khác, thì lại không hợp lý. Thí dụ trên cho b = 2 là true theo criteria <>0, bây giờ cho b = 2 là false theo criteria >3 hoặc criteria <=1 thì
- a=1 thể hiện vẫn là 01
- b = 2 thể hiện sao đây? vẫn 10 hay cái gì khác? Nếu vẫn 10 thì a and b thế nào? Nếu cái gì khác thì có nhất quán không?
 
Upvote 0
Tôi có 1 thắc mắc không thể giãi thích được: Tại sao trong VBA khi ta nhân 1 số nguyên dương với giá trị TRUE thì kết quả thu được lại là 1 số âm
Ví dụ: 28 * TRUE = - 28
???
TRUE=1 hay TRUE=-1 thì do các cao thủ của Microsoft quy định như vậy thì mình phải theo thôi. Có lẽ do Microsoft phân công 1 anh viết hàm cho Excel, 1 anh viết cho BVA nên 2 bên không thống nhất nhau ?
Thôi thì mỉnh sử dụng thì phải nhớ:
TRUE của bảng tính Excel là 1, TRUE của VBA là -1
Không riêng TRUE, một số hàm của Excel và BVA cũng có khác nhau. Ví dụ hàm MID:
Excel: MID(text,start_num,num_chars) đối số num_chars bắt buộc nhập
VBA: Mid(string, start[, length]) đối số length không bắt buộc
nên hàm MID của VBA dễ viết hơn trong trường hợp cần lấy hết các ký tự bên phải trong chuỗi kể từ start mà không cần khai báo length
 
Upvote 0
Em không nghĩ là họ quy định tùy tiện đâu... Có 1 nguyên nhân sâu xa nào đó mà nếu quy định khác đi sẽ gây bất hợp lý, có điều em chưa nghĩ ra đó là cái gì!
 
Upvote 0
Cái vụ cộng TRUE trong VBA chưa biết tại sao. Giờ cộng TRUE trong XL có phần lấn cấn. Này nhá theo cách hướng dẩn sau đây:

Bạn gõ vào ô A1 & A2 chữ TRUE. Xuống ô A3 bỏ vô FALSE. Trong 1 ô khác gõ vô công thức =A1+A2+A3 ra kết quả là 2, không có chuyện gì kỳ lạ chứ gì? OK, vào ô khác nữa quăng công thức hàm =SUM(A1:A3) coi nó ra số gì nha.

Chưa hết, tò mò dùng hàm AND, chọn cái ô bạn vừa gõ công thức có kết quả 2 rồi chọn thêm 1 ô trống nào đó. Nó cho đáp số là TRUE.

Trời ơi! Làm sao phân biệt hư thật đây?

Xin chào thua.
 
Upvote 0
Cái vụ cộng TRUE trong VBA chưa biết tại sao. Giờ cộng TRUE trong XL có phần lấn cấn. Này nhá theo cách hướng dẩn sau đây:

Bạn gõ vào ô A1 & A2 chữ TRUE. Xuống ô A3 bỏ vô FALSE. Trong 1 ô khác gõ vô công thức =A1+A2+A3 ra kết quả là 2, không có chuyện gì kỳ lạ chứ gì? OK, vào ô khác nữa quăng công thức hàm =SUM(A1:A3) coi nó ra số gì nha.
.
Thì cũng giống như: Anh gõ giá trị text vào A1 và A2, gõ giá trị Number vào A3 và A4... Tại B1 anh gõ công thức:
Nó cho kết quả #VALUE!
Nhưng nếu anh dùng công thức:
Thì nó phớt lờ Text tại A1, A2 ---> Cho ra kết quả luôn
Em nghĩ phép + và SUM có 1 sự khác biệt nào đó về thuật toán
Thí nghiệm về AND như thế cứ cho là tạm chấp nhận đi, nhưng vẩn không sao giãi thích nổi vụ TRUE = -1 trong VBA
Hic...
 
Upvote 0
Em không nghĩ là họ quy định tùy tiện đâu... Có 1 nguyên nhân sâu xa nào đó mà nếu quy định khác đi sẽ gây bất hợp lý, có điều em chưa nghĩ ra đó là cái gì!
Tùy tiện thì không thể vỉ nó là chuẩn cho bao nhiêu hàm khác phát triển dựa trên 2 giá trị TRUE, FALSE.
Giữa EXCEL và VBA còn nhiều chuyện lắm. Tôi chỉ biết vài hàm cho kết quả không giống nhau là TRIM, MID.
Còn các hàm của EXCEL là CODE, CHAR thì cũng có những hàm tương ứng bên VBA là Asc, Chr. Tại sao 2 bên đặt tên khác nhau để làm chi ?
 
Upvote 0
Web KT

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

Back
Top Bottom