CÔNG TY CỔ PHẦN BLUESOFTS

Hướng dẫn hàm BS_MATCHCALC Lấy mảng vị trí các phần tử mà tổng giá trị của nó là một số

   
Hàm BS_MATCHCALC trong Add-in A-Tools cho phép lấy mảng vị trí các phần tử mà tổng hoặc trung bình các giá trị của nó là một số xác định. Đây chính là phương pháp gom dữ liệu theo một con số được đính toán.


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

Cấu trúc hàm

BS_MATCHCALC(
lookup_value,
lookup_array,
[lookup_column],
[result_column],
[match_type],
[limit],
[min_elements],
[func_kind],
[timeout])


Các tham số

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

- lookup_value: là giá trị cần tìm, là một con số hoặc biểu thức so sánh.

- lookup_array: là mảng dữ liệu nguồn chứa giá trị cần tìm.

- lookup_column: chỉ định vị trí cột trong lookup_array để tìm kiếm, ngầm định -1 tìm cột đầu tiên. Tham số này chỉ dùng nếu lookup_array là mảng 2D.

- result_column: là vị trí cột hoặc giá trị được trả về. Nếu là -1 (ngầm định) thì hàm trả về vị trí của các giá trị tìm được trong mảng. Nếu > 0 là giá trị tại cột có vị trí đó được trả về, áp dụng chơ lookup_array là mảng 2D. Nó có thể là mảng các vị trí, ví dụ {1, 2}. "*" là tất cả các cột. Cũng có thể dùng "1, 2, ..." liệt kê các vị trí cột.

- match_type:  0 là tìm tuyệt đối (ngầm định), tức là là tìm chính xác đúng với lookup_value ; 1 là tìm tương đối, tức là tìm số lớn nhất mà <= lookup_value.

- limit: nếu > 0 là số trường hợp cần trả về kết quả. Ngầm định là 1. Nếu là 0 hàm trả về tổng số trường hợp tìm được. Nếu là -1 Hàm trả về tất cả các trường hợp mà nó tìm được.

- min_elements: ngầm định là FALSE, nếu là TRUE - hàm trả về trường hợp có ít phần tử nhất.

- func_kind: ngầm định: 0 - phép toán SUM; 1 - AVERAGE phép toán trung bình.

- timeout: ngầm định là 1, thời gian tối đa để hàm tìm kiếm, đơn vị tính là phút.
 
VIDEO hướng dẫn

 



Ví dụ

Giả sử ta có vùng dữ liệu từ A4: B13 như dưới đây

Code Qty
A1 10
A2 40
A3 20
A4 50
A5 80
A6 70
A7 30
A8 60
A9 90
A10 10

- Ví dụ 1: Lấy ra dánh sách vị trí các phần tử mảng ở cột QTY (B4:B13)  mà tổng bằng 100

+ Công thức là:

BS_MATCHCALC(100, B4:B13)

+ Kết quả là một mảng các vị trí như sau:
1
2
3
7

Để điền cả mảng vào bảng tính ta dùng hàm BS_FILLARRAY và để tạo NAME, xoay chiều mảng. 

Công thức là:

BS_FILLARRAY( BS_MATCHCALC(E1,B4:B13) ,
                              "TP=YES; NAME=MYROWS_1")

+ Địa chỉ E1 là ô chứa giá trị tìm kiếm là 100.
+ TP=YES; để xoay chiều mảng kết quả. Vì mảng trả về của hàm BS_MATCHCALC phân bố theo cột.
+ NAME=MYROWS_1; để A-Tools tạo NAME có tên MYROWS_1 cho vùng kết quả.

Kết quả như hình dưới đây.


Khi công thức đã chạy, bạn có name MYROWS_1 bao vùng kết quả là các vị trí. Nếu muốn nhận mảng giá trị ở cột QTY ứng với mỗi vị trí dùng công thức Excel

=BS_FILLARRAY( INDEX($B$4:$B$13, MYROWS_1) )

Hàm lấy trực tiếp giá trị là:
 =BS_FILLARRAY(BS_MATCHCALC(E1,B4:B13,1,1), "TP=YES")

Kết quả là:
10
40
20
30

- Ví dụ 2: Lấy ra các CODE ứng với các vị trí ở QTY mà tổng của chúng là 100 ở ô E1.

+ Phân tích:
Các tham số cần dùng là
lookup_array: chỉ định vùng A4:B13 vì hai cột: A là CODE; B là QTY phục vụ cho tìm kiếm và trả về giá trị
lookup_column: chỉ định là 2 vì trong mảng A4:B13 vị trí 2 là cột QTY.
result_column: chỉ định là 1 vì trong mảng A4:B13 vị trí 1 là COD ta cần lấy giá trị.

+ Công thức là:

=BS_FILLARRAY( BS_MATCHCALC(E1,A4:B13,2,1),"TP=YES;")

+ Kết quả là:


- Ví dụ 3:  Lấy ra mảng dữ liệu gồm các cột thông tin CODE, QTY trong vùng A3:B13 (dữ liệu nguồn), ứng với các dòng mà tổng các QTY ở đó là 100. Giá trị 100 đặt tại ô E1.

+ Cách làm:

Cách làm vẫn giống "Ví dụ 2" nhưng kết quả lấy về là nhiều cột từ dữ liệu nguồn. Vì vậy ta sẽ làm công thức với các bước.

+ Công thức:

Công thức tại D4:

=BS_FILLARRAY(BS_MATCHCALC(E1,A4:B13,2, {1,2})")

Lưu ý: tham số result_column bây giờ là mảng chứa các vị trí cột cần lấy giá trị : {1,2}.
Nếu lấy tất cả các cột thì gàn tham số này là "*". Công thức như sau:

=BS_FILLARRAY(BS_MATCHCALC(E1,A4:B13,2, "*")")

Kết quả là:


 - Ví dụ 4: Vẫn theo ví dụ 3. Nhưng muốn hiển thị tối đa 4 trường hợp (mảng), mỗi trường hợp tổng cột QTY là giá trị tại E1.

+ Phân tích: Tham số [limit] để chỉ ra số cặp kết quả được trả về. Chỉ định tham số này giá trị là 4.
+ Công thức là:
Bạn chỉ cần sửa công thức tìm mảng vị trí tại ô D4, thêm giá trị 4 vào tham số limit.

=BS_FILLARRAY(BS_MATCHCALC(E1,A4:B13,2,"*",,4), "INSERT=YES;")

+ Kết quả là:


(Như hình trên các bạn thấy hàm nhận được 4 trường hợp mà mảng kết quả được ghép vào nhau. Mỗi mảng đều có tổng QTY đều là 100 ở E1.)

- Ví dụ 5: Tính ra tổng số trường có thể nhận kết quả?
 
=BS_MATCHCALC(E1,B4:B13,,,, 0)

Kết quả là 17. Tức ta có 17 mảng kết quả.

- Ví dụ 6: Lấy ra tất cả các trường hợp có tổng QTY ltaij ô E1

=BS_FILLARRAY(BS_MATCHCALC(E1,A4:B13,2,"*",,-1))

(Tham số limit = -1 )

- Ví dụ 7: Vẫn là yêu cầu ví dụ 4 nhưng lấy kết quả mà số phần tử mảng là thấp nhất.

+ Phần tích: ta sử dụng tham số  min_elements gán là TRUE
+ Công thức là:

=BS_FILLARRAY(BS_MATCHCALC(E1,A4:B13,2,"*",,,TRUE),
"INSERT=YES;")

+ Kết quả:
 

(Hãy so sánh kết quả trong hình này với hình ở Ví dụ 4)

- Ví dụ 8: Lấy mảng giá trị mà giá trị trung bình ở cột QTY là một số ở E1

+ Phan tích: tham số  func_kind điền giá trị là 1 - Hàm Average.
+ Công thức:
 =BS_MATCHCALC(E1,B4:B13,,,,,,1)

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

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

Download Add-in A-Tools