CÔNG TY CỔ PHẦN BLUESOFTS

Hướng dẫn hàm BS_COMBINLIST Lấy cặp giá trị theo phương pháp tổ hợp và chỉnh hợp

    
Hàm BS_COMBINLIST trong Add-in A-Tools trả về danh sách giá trị tổ hợp hoặc chỉnh hợp, chỉnh hợp lặp. Mỗi cặp giá trị lấy ra là một mảng các phần tử hoặc được ghép lại với nhau. Nếu đặt tham số result_type = -1 hàm trả về số tổ hợp hoặc chỉnh hợp.


Hàm này chỉ có từ Add-in A-Tools v10.x

Cấu trúc hàm

BS_COMBINLIST(source, number_chosen, [result_type], [options])

Các tham số

Các tham số trong [ ] có thể bỏ qua.

- source: là mảng giá trị phục vụ cho việc lấy tổ hợp. Nếu tham số này là số nguyên hàm trả về giá trị tổ hợp.

- number_chosen: là số giá trị được gộp lại. number_chosen <= số phần tử mảng của source.

+ Nếu giá trị của tham số này giá trị là: < 0 hoặc lớn hơn số phần tử của source trả về lỗi #NUM!
+ Nếu giá trị tham số này là 0 hàm trả về một trường hợp mà các phần tử hợp thành chính là các phần tử của mảng source.

- result_type: nếu là 0 - Các phần tử hợp lại tạo thành mảng; Nếu là 1 thì các phần tử được nối lại và ngăn cách bởi dấu phảy (,); Nếu là -1 hàm trả về số trường tính theo tổ hợp. : là giá trị cần tìm, là một con số hoặc biểu thức so sánh. 

- options: tham số này kiểu chuỗi, có thể bỏ qua. Các thuộc tính sử dụng:
+ Nếu muốn thay đổi ký tự ghép giá trị (khi tham số result_type=1), nhập "SEP=Delimiter;". Delimiter là ký tự bất kỳ, nếu là NULL hàm không dùng ký tự để ghép.
+ Quy định thời gian chạy: "TIMEOUT=m;" m là số phút tối đa chạy hàm. Nếu hàm chạy quá thời gian TIMEOUT sẽ dừng lại. Nếu không khai báo hàm chạy đến khi hoàn thành.
+ Chỉ định số giá trị: "TOP=n;" n là số giá trị tối đa được lấy ra. Nếu không khai báo hàm lấy ra tất cả trường hợp.
+ "FUNC=PERMUTA;" hoặc "FUNC=1;" hàm tính chỉnh hợp lặp.
+ "FUNC=PERMUT;" hoặc "FUNC=2;" hàm tính chỉnh hợp không lặp.
+ "FUNC=COMBIN;" hoặc "FUNC=0;" hoặc không khai báo gì hàm tính tổ hợp.

(*) Lưu ý
Hàm chạy trên bảng tính (UDF) chỉ lấy tối đa 1048576 giá trị với Excel 2007 trở lên, 65536 với phiên bản Excel thấp hơn. Nếu muốn lấy số giá trị lớn hơn thì cần chạy hàm trong môi trường VBA với hàm API cua A-Tools là BS_CombinList. Hãy xem bài hướng dẫn lập trình VBA lấy tổ hợp, chỉnh hợp, chỉnh hợp lặp với hàm API BS_CombinList.


Ví dụ

Giả sử ta có 5 giá trị A, B, C, D, E ở vùng A3:A7

A
B
C
D
E

- Ví dụ 1: Lấy ra các cặp giá trị gồm 2 giá trị từ vùng A4:A8

+ Công thức là:

 =BS_COMBINLIST(A4:A8, 2)

+ Kết quả là một mảng mà các dòng là các trường hợp ghép cặp:


Nếu lấy ra số trường hợp - tổ hợp thì công thức là:

  =BS_COMBINLIST(A4:A8, 2, -1)
(Tham số result_type là -1)

Nếu lấy mảng giá trị mà mỗi mảng các giá trị kết hợp tạo thành danh sách nối tiếp, ngăn cách bởi dấu phảy (,). Công thức là:

 =BS_TRANSPOSE( BS_COMBINLIST(A4:A8,D2, 1) )
(Tham số result_type là 1. Dùng hàm BS_TRANSPOSE mục đích để xoay chiều mảng kết quả.)

(*) Nếu Excel của bạn không phải là Excel 365 thì phải dùng hàm BS_FILLARRAY bao bên ngoài để điền cả mảng vào bảng tính. Đây là hàm có nhiều tính năng hỗ trợ hay các bạn nên xem hướng dẫn chi tiết.

=BS_FILLARRAY(
                               BS_COMBINLIST(A4:A8, 2) )

- Ví dụ 2: có 5 vận động viên bóng bàn trong một bảng thi đấu theo thể trức đầu vòng tròn. 
Danh sách CÁC VĐV bóng bàn đặt trong A4:A8 là: 

WANG Chuqin
LIANG Jingkun
MA Long
FAN Zhendong
LEBRUN Felix

+ Công thức như sau:

 =BS_COMBINLIST(A4:A8, 2) )

+ Kết quả là:


Ví dụ 3:  Theo dữ liệu ở Ví dụ 1. Số giá trị được kết hợp đặt tại ô D2.



Ví dụ 4:  Theo dữ liệu ở Ví dụ 3. Các giá trị được ghép vào nhau.
=BS_FILLARRAY(
     BS_COMBINLIST(A4:A8,D2, 1),
     "TP=YES;")


(*) Nếu không dùng ký tự ",'" ngăn cách các giá trị thì nhập "SEP=NULL" vào tham số Options.
=BS_FILLARRAY(
BS_COMBINLIST(A4:A8,D2, 1, "SEP=NULL;"),
"TP=YES;")

Kết quả là:
ABCD
ABCE
ABDE
ACDE
BCDE

Ví dụ 5: Liệt kê giá trị tổ hợp, hàm chỉ chạy trong 1 phút, số giá trị lấy ra tối đa là 1000000.
Giả xử có 26 chữ cái A-Z trong vùng A4:A29, ô D2 nhập số ký tự được ghép vào nhau.
Công thức là:
sd =BS_FILLARRAY(
BS_COMBINLIST(A4:A29,D2,1,"SEP=NULL; TIMEOUT=1; TOP=1000000;"),
"TP=YES")

(*) Nếu bạn chỉ cần tính ra giá trị tổ hợp tương tự hàm COMBIN của Excel thì tham số đầu tiên (source) của hàm BS_COMBINLIST la một số nguyên. Trường hợp này thì hàm BS_COMBINLIST tương tự hàm COMBIN cảu Excel.

Ví dụ tính giá trị tổ hợp của 3 trong 5 phần tử:
=BS_COMBINLIST(5, 3)

Hàm Excel thì là:
=COMBIN(5,3)

Kết quả: 10

Ví dụ 6: Liệt kê chỉnh hợp lặp. 
Liệt kê các cặp giá trị gồm k phần tử (ở ô D2) trong tổng 5 phần tử trong vùng A4:A8 (A,B,C,D,E).
Mỗi phần tử tham gia từ 1 đến k lần.

=BS_FILLARRAY( BS_COMBINLIST(A4:A8,D2,1,"FUNC=PERMUTA"), "TP=YES")
Hoặc
=BS_FILLARRAY( BS_COMBINLIST(A4:A8,D2,1,"FUNC=1"), "TP=YES")

Kết quả là:
A,A,A
A,A,B
A,A,C
A,A,D
A,A,E
A,B,A
A,B,B
A,B,C
A,B,D
A,B,E
...

(Còn nữa tôi không liệt kê hết)

Ví dụ 7: Liệt kê chỉnh hợp không lặp.
Liệt kê các cặp giá trị gồm k phần tử (ở ô D2) trong tổng 5 phần tử trong vùng A4:A8 (A,B,C,D,E).

=BS_FILLARRAY( BS_COMBINLIST(A4:A8,D2,1,"FUNC=PERMUT"), "TP=YES")
Hoặc
=BS_FILLARRAY( BS_COMBINLIST(A4:A8,D2,1,"FUNC=2"), "TP=YES")

Kết quả là:
A,B,C
A,B,D
A,B,E
A,C,B
A,C,D
A,C,E
A,D,B
A,D,C
A,D,E
A,E,B
A,E,C
A,E,D
B,A,C
B,A,D
...
(Còn nữa tôi không liệt kê hết)

Ví dụ 8: Cách xử lý kết quả tổ hợp, chỉnh hợp, chỉnh hợp lặp hàng trăm triệu giá trị.
Bạn cần phải chạy hàm API BS_CombinList của A-Tools trong VBA hay ngôn ngữ lập trình nào đó. Xem chi tiết tại đây.

(*) Hãy mở file "C:\A-Tools\Help & Demos\\Function BS_ COMBINLIST.xlsx" để xem ví dụ đầy đủ.

Tác giả Nguyễn Duy Tuân

Download Add-in A-Tools