Giúp lập công thức đếm chữ số lẻ, chữ số chẵn trong các ô. Em cảm ơn

Liên hệ QC
untitled-png.274242
View attachment 274244
3468748Lẻ ?Chẵn ?
35598205
863202316
4107923

Ví dụ :
Ô A1 có 1 chữ số lẻ và 2 chữ số chẵn, ô B1 có 1 chữ số lẻ và 3 chữ số chẵn.
Ô A2 có 2 chữ số lẻ, ô B2 có 3 chữ số lẻ và 3 chữ số chẵn.
Số 0 coi là chữ số chẵn.
Viết công thức
Có tổng cộng bao nhiêu "chữ số lẻ", bao nhiêu "chữ số chẵn" trong các ô trên ?
Bạn thử công thức này
Diff:
Đếm số lẻ =COUNT(1/ISODD(MID(SMALL(A1:B4,ROW(INDIRECT("1:"&ROWS(A1:B4)*2))),TRANSPOSE(ROW(1:15)),1)))
nhấn CSE
Excel365
Mã:
=LET(a,CONCAT(A1:B4),COUNT(1/ISODD(MID(a,SEQUENCE(LEN(a)),1))))
Đếm số chẵn thì dùng hàm ISEVEN thay cho hàm ISODD
 
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)

1649740226488.png
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.

1649740495846.png

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).
1649741301463.png

Nhưng Boolean sẵn sàng ép kiểu:
1649741348314.png

Và khi ép kiểu thì cứ trị khác 0 là True, không cần biết đầu vào là gì.
1649741661213.png

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.
 
Bạn thử công thức này
Diff:
Đếm số lẻ =COUNT(1/ISODD(MID(SMALL(A1:B4,ROW(INDIRECT("1:"&ROWS(A1:B4)*2))),TRANSPOSE(ROW(1:15)),1)))
nhấn CSE
Excel365
Mã:
=LET(a,CONCAT(A1:B4),COUNT(1/ISODD(MID(a,SEQUENCE(LEN(a)),1))))
Đếm số chẵn thì dùng hàm ISEVEN thay cho hàm ISODD
cảm ơn bạn nhé. trình độ của các bác trên sâu xa quá. chủ đề nhỏ của e thôi mà các bác trên thảo luận khiến người ta phải thán phục
 
Web KT

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

Back
Top Bottom