HÀM CHOOSE

Liên hệ QC

leonguyenz

Thành viên gạo cội
Thành viên BQT
Moderator
Tham gia
2/8/10
Bài viết
5,218
Được thích
9,002
Giới tính
Nam
CHOOSE

Trả về một giá trị, một vùng tham chiếu hoặc một công thức tại vị trí được chỉ định trong danh sách các đối số.

Cú pháp: =CHOOSE(index_num, value1, [value2], ...)

index_num
: Là vị trí của giá trị cần trả về trong danh sách. Ví dụ, index_num = 1 thì lấy giá trị value1; index_num bằng 2 thì lấy giá trị value2...
Index_num có giá trị là số nguyên, và trong khoảng từ 1 đến 254

value: Danh sách các giá trị để chọn. Tối đa là 254. Những giá trị này có thể là con số, là chuỗi, là một vùng tham chiếu, là một công thức, là một hàm.

Ví dụ: lấy Thứ ngày dựa theo thứ tự ngày trong tuần:
1602044726639.png

(Hàm WEEKDAY trả về thứ tự ngày trong tuần)

Ví dụ: lấy vùng tham chiếu để tính toán.
1602045120635.png


Ví dụ: tạo tham chiếu mảng để dò tìm từ phải qua trái bằng hàm VLOOKUP
1602044494532.png
 

File đính kèm

  • Ham_CHOOSE.xlsx
    17.9 KB · Đọc: 234
Ví dụ thứ ba ở bài trên không hẳn là nhiệm vụ chính của hàm Choose. Đấy chỉ là một xảo thuật lợi dụng tính chất "có khả năng hoạt động trên mảng và khả năng trả về mảng" của hàm này.
Dưới đây là một đoạn trích từ bài tôi dùng để giải thích cho một bạn ở thớt khác:

<quote>
Cách hoạt động của Choose:
Choose( số/biểu thức để xét, kết quả nếu trị là 1, kết quả nếu trị là 2, .... )
Cũng như một số ít hàm khác, Choose có khả năng xét số theo dạng mảng. Tức là:
Choose( { 1, 3, 2 }, 5, 10, 15 ) thì nó sẽ xét lần lượt với 1, rồi đến 3, rồi đến 2. Và kết quả sẽ là 5, 15, 10.
Khi xét dạng mảng như vậy, nó sẽ được coi là công thức mảng và sẽ trả về một mảng có các cột là các trị được quy ra. Với ví dụ trên, ta sẽ có một mảng { 5, 15, 10 }
Lưu ý là với ví dụ trên, tôi cố tình cho nó xét 3 trước 2 để quý vị có thể thấy mức độ uyển chuyển của nó.
Ví dụ ở trên là trị đơn. Nếu trị quy ra là các mảng (một cột nhiều hàng) thì nó cũng gộp các cột này thành một mảng 2 chiều. Và đó chính là xảo thuật được dùng ở ví dụ 3, bài #1.
<unquote>

Minh hoạ cho ví dụ trên:
Chọn 3 ô A1, B1, C1. Gõ công thức, và nhấn Ctrl+Shift+Enter.
1602054098367.png


(nếu không CSE thì nó cũng cho ra một mảng, nhưng nó sẽ không hiểu là bạn muốn rải kết quả vào một mảng cells. Và bạn chỉ được phần tử đầu tiên)
1602054434334.png

Công thức dưới đây chứng minh nó trả về một mảng 1 dòng x 3 cột:
1602054703220.png
 
Ví dụ thứ ba ở bài trên không hẳn là nhiệm vụ chính của hàm Choose. Đấy chỉ là một xảo thuật lợi dụng tính chất "có khả năng hoạt động trên mảng và khả năng trả về mảng" của hàm này.
Microsoft có ghi chú cho trường hợp index_num là 1 mảng. Nhờ bác biên dịch giúp dòng này:
"If index_num is an array, every value is evaluated when CHOOSE is evaluated."
Xin cảm ơn bác!
1602061158692.png


Một số ví dụ cho thấy, khi index_num là 1 mảng ngang (các phần tử cách nhau bằng dấu phẩy, ví dụ {1,2,3}) thì CHOOSE sẽ tạo ra 1 mảng có kích thước 3 cột và số dòng bằng kích thước cao lớn nhất của các đối số value, các phần tử thiếu sẽ cho kết quả #N/A. Khi index_number là 1 mảng dọc (ví dụ {1;2;3}), thì CHOOSE tạo ra 1 mảng có kích thước 3 dòng và số cột bằng kích thước rộng lớn nhất của đối số value.
1602062520312.png
 
Microsoft có ghi chú cho trường hợp index_num là 1 mảng. Nhờ bác biên dịch giúp dòng này:
"If index_num is an array, every value is evaluated when CHOOSE is evaluated."
Xin cảm ơn bác!
View attachment 246963

Một số ví dụ cho thấy, khi index_num là 1 mảng ngang (các phần tử cách nhau bằng dấu phẩy, ví dụ {1,2,3}) thì CHOOSE sẽ tạo ra 1 mảng có kích thước 3 cột và số dòng bằng kích thước cao lớn nhất của các đối số value, các phần tử thiếu sẽ cho kết quả #N/A. Khi index_number là 1 mảng dọc (ví dụ {1;2;3}), thì CHOOSE tạo ra 1 mảng có kích thước 3 dòng và số cột bằng kích thước rộng lớn nhất của đối số value.
View attachment 246968
Index_Num có thể là mảng 2 chiều nhưng điều kiện các value không phải là mảng , giá trị trả về là một mảng cùng kích thước với index num , đây mới là giá trị của hàm Choose để giải quyết các bài toán về mảng
1602064183007.png
 
Tham số đầu tiên được MSA gọi là index-number (chỉ số để chọn)
Câu: "If index_num is an array, every value is evaluated when CHOOSE is evaluated."
có nghĩa là "nếu chỉ số nạp vào là một mảng, Choose sẽ tuần tự duyệt mỗi phần tử của mảng. Từ "every value is evaluated" bảo đảm rằng nếu phần tử trong mảng là hàm thì các hàm ấy sẽ tuần tự được chạy, không sót cái nào. Và choose sẽ tuỳ theo trị của mỗi chỉ số kia mà chọn lấy cho đủ.

Quan trọng về vách Excel sử lý các biểu thức được nạp làm tham trong hàm:
Lưu ý là khi tham mảng như vậy thì tất cả các tham còn lại của Choose đều được tính. Nếu chỉ số chỉ là một trị đơn giản thì chỉ có tham tương ứng với chỉ số này được tính mà thôi.
Điều này khá quan trọng khi bạn cần tính sức nặng của công thức, hoặc cần kiểm soát khi gọi hàm UDF.

Minh hoạ
Function f(x)
MsgBox x
f = x
End Function
1602064969511.png

Bạn sẽ thấy hàm f(x) chỉ được gọi 1 lần, với tham số là 2, ứng với chọn lựa của Choose.
Đây là nguyên tắc shortcut logic của nhiều ngôn ngữ.

Nhưng nếu bạn đổi tham thứ nhất thành 1 mảng:
1602065247081.png

Bạn sẽ thấy Excel chọn chạy hàm f(x) 3 lần, với f(1), kế đến f(2), và f(3). Tức là ứng với 3 tham số được nạp.
Nếu đúng theo nguyên tắc shorrtcut trên thì đáng lẽ chỉ được gọi 2 lần, với f(2), kế đến f(1)
Theo tôi đây là cách Excel giản dị hoá công thức.
Tốt hay xấu chưa biết. Nhưng điều này cho thấy hàm Choose đối xử với chỉ số đơn khác với mảng. Và đó là điều cần lưu ý khi sử dụng hàm Worksheet cùng lúc với hàm UDF.
 
Web KT
Back
Top Bottom