3. CÔNG THỨC MẢNG (Array formulas)

Tác giả: Trần Thanh Phong (ttphong2007 - GPE) có tham khảo bài viết của handung107 - GPE

Các tập tin ví dụ đính kèm

Mục lục bài viết:

 

1. Các khái niệm về công thức mảng

Công thức mảng trả kết quả về một vùng nhiều ô

Công thức mảng trả kết quả về một ô

Mảng một chiều

Mảng hai chiều

Hằng mảng

Đặt tên cho hằng mảng

 

2. Các thao tác với công thức mảng

Tạo một mảng từ các giá trị trong một dãy

Tạo một hằng mảng từ các giá trị trong một dãy

Chọn một dãy công thức mảng

Hiệu chỉnh một công thức mảng

Mở rộng và thu hẹp công thức mảng nhiều ô

 

3. Ví dụ và ứng dụng

 

Công thức mảng trả kết quả về một ô

a. Đếm các ký tự trong một dãy

b. Đếm các ô Text trong một dãy

c. Đếm các ô lỗi trong một dãy

d. Tính tổng một dãy có chứa các lỗi

e. Tính tổng 3 giá trị nhỏ nhất trong một dãy

f. Tính tổng 3 giá trị lớn nhất trong một dãy

g. Tính tổng n giá trị lớn nhất trong một dãy

h. Tính tổng theo điều kiện

i. Tính bình quân lọai bỏ giá trị 0

j. Kiểm tra Text cần tìm có trong dãy Text không?

k. So sánh 2 dãy

l. Trả về vị trí của giá trị lớn nhất trong mảng

m. Tìm số dòng chứa giá trị xuất hiện thứ n trong tổng số lần xuất hiện của giá trị trong dãy

n. Trả về chuỗi dài nhất trong dãy các chuỗi

o. Xác định dãy chứa các giá trị hợp lệ hay không

p. Cộng các con số của số nguyên

q. Cộng các giá trị đã làm tròn

r. Cộng các giá trị cách nhau n khoảng trong dãy

s. Loại bỏ các ký tự khác số khỏi chuỗi

t. Xác định giá trị gần đúng nhất trong dãy với giá trị cho trước

u. Trả về giá trị cuối cùng trong một cột

v. Trả về giá trị cuối cùng trong một dòng

w. Xếp hạng bằng công thức mảng

x. Tạo bảng chéo động

y. Đếm nhiều điều kiện

z. Đếm số phần tử duy nhất trong danh sách

aa. Cộng các phần tử trong mảng và không tính nếu phần tử xuẩt hiện lần thứ 2 trở lên

 

Công thức mảng trả kết quả về nhiều ô

a. Tạo mảng số nguyên liên tục

b. Chỉ trả về các giá trị dương trong dãy

c. Trả về các ô Nonblank trong dãy

d. Đảo thứ tự các ô trong dãy

e. Sắp xếp các giá trị số trong một dãy động

f. Trả về danh sách các phần tử duy nhất trong một dãy

g. Tạo dương lịch


1. Các khái niệm về công thức mảng

Một trong những tính năng độc đáo và mạnh mẽ nhất của Excel chính là khả năng tính toán với các mảng dữ liệu trong công thức. Khi hiểu rõ được khái niệm này sẽ giúp chúng ta tạo ra được các công thức thực hiện các phép tính khó một cách kỳ diệu. Bài viết này sẽ giới thiệu các khái niệm về các mảng số liệu mà bất kỳ ai nếu muốn trở thành chuyên gia sử dụng công thức trong Excel đều phải biết về nó, ngoài ra trong bài cũng trình bày các ví dụ về công thức mảng rất hữu ích.

Nếu bạn đã từng lập trình trên bất kỳ ngôn ngữ lập trình nào thì chắc bạn cũng đã nghe đến khái niệm mảng (array). Một array đơn thuần chỉ là một tập hợp các phần tử có quan hệ hay độc lập với nhau. Trong Excel, một array có thể là array một chiều hoặc array hai chiều. Chiều của array ở đây chính là chỉ  các dòng và cột trong array. Ví dụ như array một chiều thì có thể hiểu đó là một vùng (range) số liệu trên bảng tính mà vùng này sẽ có một dòng (khi array nằm ngang) hoặc một cột (array nằm dọc). Một array hai chiều có thể hiểu đó là một vùng số liệu trên bảng tính (có dạng hình chữ nhật) bao gồm nhiều dòng và nhiều cột. Excel không hỗ trợ array 3-chiều (VBA thì hỗ trợ).

Công thức mảng không cần lưu trữ các số liệu trong quá trình tính toán trong các ô (cell), mà Excel sẽ xử lý các mảng số liệu này trong bộ nhớ máy tính. Sau đó các công thức mảng sẽ lấy kết quả tính toán trả về trên bảng tính. Một công thức mảng có thể trả về kết quả là nhiều ô (range) hay chỉ một ô.

Công thức mảng trả kết quả về một vùng nhiều ô

Hình minh hoạ bên dưới trình bay ví dụ đơn giản về việc tính toán cột Total (Tổng doanh thu của một loại sản phầm), thông thường để tính cột Total (cột D) này bạn sẽ nhập vào công thức sau:

Tại ô D2 nhập vào công thức =B2*C2     sau đó chép xuống D3:D7


Hình 1: Tính cột [Total] = [Units Sold] * [Unit Price]

Để tính cho cột Total ở đây chúng ta dùng tới 6 công thức. Ngoài cách này chúng ta có thể dùng 1 công thức mảng để tính ra kết quả cho cả cột Total và lưu kết quả trả về tại D2:D7.

Để tạo một công thức mảng tính toán cho trường hợp này hãy làm theo các bước sau:

  • Chọn vùng các ô sẽ lưu kết quả trả về của công thức mảng, trong ví dụ này chọn vùng D2:D7.

  • Nhập vào công thức sau =B2:B7*C2:C7 (sau khi chọn vùng thì gõ công thức này vào)

  • Vì đây là công thức mảng bạn hãy nhấn tổ hợp phím Ctrl+Shift+Enter để nhận kết quả công thức trả về. (Công thức thông thường thì chỉ cần Enter)

Lúc này toàn bộ vùng D2:D7 đã có kết quả tính toán và khi vào xem thì sẽ có công thức như sau:

{=B2:B7*C2:C7}

Lưu ý, Excel sẽ đặt cặp ngoặc móc bao quanh công thức để chỉ đây là công thức mảng.

Công thức mảng trên khi tính toán nó sử dụng dữ liệu từ hai mảng đó là mảng chứa số liệu về [Units Sold] được lưu tại vùng địa chỉ B2:B7 và mảng chứa số liệu về [Unit Price] được lưu tại vùng địa chỉ C2:C7 trong bảng tính.

Vì ứng với mỗi mặt hàng sẽ có một kết quả Total khác nhau, nên đó là lý do chúng ta phải chọn trước vùng địa chỉ D2:D7 để lưu trữ kết quả trả về của công thức mảng.

Công thức mảng này trả về kết quả hoàn toàn chính xác cũng giống như kết quả trả về từ 6 công thức riêng lẽ sau:

=B2*C2
=B3*C3
=B4*C4
=B5*C5
=B6*C6
=B7*C7

Sử dụng công thức mảng thay cho công thức đơn có một số ưu điểm như:

  • Là cách tính toán đảm bảo sự chính xác về kết quả (tránh trường hợp vô tình sao chép sai công thức do chạy địa chỉ tham chiếu)

  • Dùng công thức mảng tránh được việc vộ tình xoá hay làm thay đổi công thức trong một ô nào đó của vùng công thức mảng. Vì công thức mảng không cho phép xoá, sửa chữa một ô trong vùng công thức mảng.

  • Dùng công thức mảng sẽ giúp tránh trường hợp người chưa thành thạo Excel làm xáo trộng các công thức của bạn.

Công thức mảng trả kết quả về một ô

Bây giờ chúng ta cần tính Tổng doanh thu của tất cả các sản phẩm, tuy nhiên yêu cầu là tính toán căn cứ vào cột  [Units Sold] và [Unit Price] bằng công thức mảng (nghĩa là không tính toán thông qua cột Total). Khi đó chúng ta có thể dùng công thức mảng sau:

Tại ô D8 bạn nhập vào công thức: =SUM(B2:B7*C2:C7)  và kết thúc bằng tổ hợp phím Ctrl+Shift+Enter. Khi đó công thức trong ô D8 có dạng sau  {=SUM(B2:B7*C2:C7)}

Công thức mảng này trả về kết quả tính toán tổng doanh thu cho tất cả các sản phẩm trong một ô D8. Công thức này cũng tính toán căn cứ vào 2 mảng số liệu được lưu trong vùng B2:B7 và C2:C7, trong quá trình tính toán công thức mảng sẽ tạo ra trong bộ nhớ một mảng số liệu mới chứa kết quả của phép nhân các cặp số liệu, sau đó hàm SUM được dùng để cộng tất cả các phần tử trong mảng mới này và trả về một giá trị duy nhất lưu vào ô D8.

Trong trường hợp này chúng ta cũng có thể dùng công thức thông thường là hàm SUMPRODUCT như sau:

Tại ô D8 nhập vào công thức   =SUMPRODUCT(B2:B7,C2:C7)  sau đó Enter.

Mảng một chiều

Ta có thể xem mảng một chiều là một hàng (mảng ngang) hay một cột (mảng dọc). Các phần tử trong mảng một chiều (mảng ngang) được cách biệt nhau bằng một dấu phẩy, và trong mảng dọc được cách nhau bằng dấu chấm phẩy.

Ví dụ: {1,2,3,4,5} (mảng ngang) và {10;20;30;40;50} (mảng dọc)

Hay {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"} (phần tử là Text dạng chuỗi)

Để hiển thị một mảng một chiều 5 phần tử theo dạng ngang hay dọc, ta cần 5 ô liên tục trên cùng một hàng hay một cột

Ví dụ: Tạo mảng 1 chiều

  • Ta chọn 5 ô từ B3:F3, nhập: ={1,2,3,4,5} và nhấn Ctrl+Shift+Enter

  • Ta chọn 5 ô từ B6:B10, nhập: ={10;20;30;40;50} và nhấn Ctrl+shift+Enter

  • Ta chọn 7 ô từ B13:H13, nhập ={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"} và nhấn Ctrl+shift+Enter

Hình 2. Mảng một chiều ngang và dọc

Các phần tử trong mảng sẽ lần lượt được nhập vào 5 ô liên tục theo thứ tự trong mảng. Nếu trong mảng chỉ có 5 phần tử nhưng ta chọn nhiều hơn 5 ô để nhập mảng thì từ ô thứ 6 sẽ cho giá trị #N/A

Hình 3. Mảng lỗi

Mảng hai chiều

Mảng hai chiều là một hình chữ nhật bao gồm nhiều hàng và nhiều cột. Tương tự như mảng một chiều, ta sử dụng các dấu phẩy để ngăn cách các phần tử trong cùng một hàng và dấu chấm phẩy để ngăn cách các phần tử trong cùng một cột.

Ví dụ : Tạo mảng 2 chiều sau {1,2,3,4;5,6,7,8;9,10,11,12}

Để hiển thị mảng này trên bảng tính, ta chọn vùng A1:D3, nhập :

={1,2,3,4;5,6,7,8;9,10,11,12} và nhấn Ctrl+Shift+Enter

Hình 4. Tạo mảng 2 chiều

Cũng vậy, nếu bạn nhập một mảng vào một dãy vốn có các ô nhiều hơn các phần tử mảng, Excel sẽ hiển thị #N/A trong các ô trống còn lại.

Hình 5. Mảng lỗi

Hằng mảng

Bạn có thể tạo một hằng mảng, đặt cho nó một cái tên, sau đó sử dụng mảng được đặt tên này cho công thức. Ví dụ: Ta có hằng mảng như sau: {1,0,1,0,1}. Công thức sau sử dụng hàm SUM với hằng mảng đứng trước là đối số của nó. Công thức trả về tổng của các giá trị trong mảng (ở đây là 3). Công thức này sử dụng mảng là đối số nhưng không phải là công thức mảng: =SUM({1,0,1,0,1}) và công thức này có cùng kết quả với công thức sau =SUM(1,0,1,0,1). Vào thời điểm này, có thể bạn chưa thấy ưu điểm của việc sử dụng hằng mảng.

Công thức sau sử dụng hai hằng mảng: =SUM({1,2,3,4}*{5,6,7,8}). Công thức này sẽ tạo ra một mảng mới trong bộ nhớ máy tính như sau :{5,12,21,32} và sau đó mảng này lại là đối số cho hàm SUM và trả về kết quả là 70. Bạn sẽ thấy công thức trên tương tự như công thức sau : =SUM(1*5,2*6,3*7,4*8) không là công thức mảng.

Một công thức mảng có thể tính tóan trên các mảng số liệu lưu trữ trên bảng tính và hàng mảng. Ví dụ như công thức =SUM((A1:D1*{1,2,3,4})), công thức này tương đương với công thức =SUM(A1*1,B1*2,C1*3,D1*4). (A1:D2 là mảng ngang lưu trữ trên bảng tính).

Một hằng mảng sẽ không chứa các công thức, các hàm, các giá trị có chứa dấu dollar, dấu phẩy, chấm phẩy... Sau đây là một hằng mảng không hợp lệ: {SUM(3,2),$56,12,5%}

Đặt tên cho hằng mảng

Việc đặt tên cho hằng mảng được thông qua hộp thọai Insert/Name/Define (Excel 2007 vào Ribbon | Formulas | Defined Names | Define Name.). Gọi nhanh hộp thọai Name Manager (Ctrl+F3), chèn nhanh Name vào công thức nhấn F3.

Tên của mảng đặt tại hộp Name: Ví dụ ta đặt tên là DayNames

Scope: Chọn phạm vi họat động của Name

Tại hộp Refers to ta đặt dấu ={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}

Hình 6. Đặt tên cho hằng mảng

Nếu bây giờ, ta chọn dãy A1:G1 và nhập công thức mảng sau :{=DayNames}, ta sẽ thấy các phần tử của mảng lần lượt hiện ra trong các ô này.

Hình 7. Sử dụng tên hằng mảng vào công thức

Để chuyển mảng này thành mảng dọc, ta dùng công thức: ={TRANSPOSE(DayNames)}

Để truy cập từng phần tử riêng lẻ của mảng, ta dùng hàm: =INDEX(DayNames,4) sẽ cho kết quả là Wed.

Top

2. Các thao tác với công thức mảng

Phần này sẽ trình bày các thao tác đối với các ô chứa công thức mảng trong bảng tính.

Tạo một mảng từ các giá trị trong một dãy

Giả sử ta có một tập số dữ liệu được nhập vào A1:C4. Ta chọn dãy D8:F11, và nhập vào công thức mảng : {=A1:C4}. Mảng D8:F11 bây giờ sẽ chứa những dữ liệu liên kết với mảng A1:C4, mọi thay đổi giá trị bất kỳ trong A1:C4, thì ô tương ứng trong D8:F11 cũng phản ánh sự thay đổi theo.

Hình 8. Tham chiếu một tập số liệu bằng công thức mảng

Tạo một hằng mảng từ các giá trị trong một dãy

Ở trên, ta đã có công thức mảng trong D8:F11 liên kết với các ô trong mảng A1:C4, bây giờ ta sẽ cắt đứt sự liên kết này để tạo ra một hằng mảng gồm các giá trị trong A1:C4. Để thực hiện, chúng ta làm như sau :

  • Chọn mảng D8:F11

  • Nhấn F2 để hiệu chỉnh công thức mảng

  • Nhấn F9 để chuyển đổi các tham chiếu ô thành các giá trị

  • Nhấn Ctrl+Shift+Enter để nhập lại công thức mảng

Ta sẽ thấy các giá trị của hằng mảng ở trên thanh công thức

Chọn một dãy công thức mảng

Ta có thể chọn bằng tay, hoặc dùng Edit/Go to (hoặc nhấn F5), nhấp nút Special, sau đó chọn Current array, nhấp OK để đóng hộp thọai. (Excel 2007 thì bạn chọn vào vùng công thức mảng | Ribbon | Home | Editing | Find & Select | Go | To Special | chọn Current Array.)

Hiệu chỉnh một công thức mảng

  • Bạn không thể thay đổi nội dung của bất kỳ ô nào vốn tạo nên một công thức mảng (nếu là mảng nhiều ô).

  • Bạn không thể xóa các ô vốn hình thành của một công thức mảng (nhưng bạn có thể xóa tòan bộ một mảng)

  • Bạn không thể chèn các ô mới vào một dãy mảng (nghĩa là chèn hàng và chèn cột)

Hình 9. Excel cảnh báo khi bạn sửa đổi một thành phần thuộc mảng

Để hiệu chỉnh công thức mảng, bạn chọn tất cả các ô trong dãy mảng, kích họat thanh công thức hay nhấn F2, Excel sẽ lọai bỏ các dấu ngoặc móc, và khi bạn hiệu chỉnh xong, bạn sẽ nhấn Ctrl+Shift+Enter để kết thúc.

Mở rộng và thu hẹp công thức mảng nhiều ô

Bạn làm theo trình tự sau:

  • Chọn tòan bộ vùng chứa công thức mảng trên bảng tính.

  • Nhấn F2 vào chế độ hiệu chỉnh

  • Nhấn Ctrl+Enter để chuyển về dạng công thức thường cho tất cả các ô đang chọn.

  • Chọn lại vùng xuất kết quả công thức mảng mới (mở rộng hay thu hẹp)

  • Nhấn F2 để vào chế độ hiệu chỉnh

  • Nhấn Ctrl+Shift+Enter

Top

 

3. Ví dụ và ứng dụng

Công thức mảng trả kết quả về một ô

a.     Đếm các ký tự trong một dãy

Giả sử bạn có một dãy ô, chứa các dữ liệu dạng Text từ A1:A8, bây giờ bạn cần đếm tổng số ký tự có trong dãy trên. Nếu không dùng công thức mảng, bạn sẽ phải dùng một cột phụ, thí dụ cột B từ B1:B8. Tại B1, bạn nhập công thức B1=LEN(A1) và sao chép công thức xuống đến B8. Sau đó, tại B9, bạn dùng công thức tính tổng: =SUM(B1:B8)

Để thay thế cho tất cả công việc trên, ta dùng công thức mảng ngay tại Cell D1 {=SUM(LEN(A1:A8)}. công thức mảng sử dụng hàm LEN để tạo ra một mảng mới (trong bộ nhớ) gồm số ký tự trong mỗi ô của dãy rồi sau đó, tính tổng của dãy.

b.    Đếm các ô Text trong một dãy

Công thức mảng sau đây dùng hàm IF để kiểm tra từng ô một trong dãy. Sau đó, nó tạo ra một mảng mới (có cùng kích cỡ và các chiều với mảng gốc) gồm các số 0 và 1 phụ thuộc vào ô đó có chứa dữ liệu Text hay không. Mảng mới này được chuyển sang hàm SUM để tính tổng các ô trong mảng và cho kết quả là số ô Text được đếm trong dãy.

Các công thức mảng dưới cho kết quả như nhau: 

{=SUM(IF(ISTEXT(A11:D15),1,0))}

Hay : {=SUM(ISTEXT(A11:D15)*1)}

Hay:  {=SUM(ISTEXT(A11:D15)+0)}

Hay:  {=SUM(--ISTEXT(A11:D15))}

Lưu ý: True*1=1; False*1=0; x*1=x; x+0=x; --x=x

c.     Đếm các ô lỗi trong một dãy

Tương tự công thức trên, ta dùng công thức sau để đếm ô có lỗi trong một dãy:

{=SUM(IF(ISERROR(A3:D14),1,0))}

Hay: {=SUM(IF(ISERROR(A3:D15),1))}

Hay: {=SUM(ISERROR(A3:D14)*1)} …

d.    Tính tổng một dãy có chứa các lỗi

Bạn thấy đó, hàm SUM của Excel không họat động nếu bạn dùng để tính tổng một dãy có chứa một hoặc nhiều giá trị lỗi (#DIV/0! hoặc #N/A). Công thức mảng sau đây trả về tổng của một dãy ngay cả dãy này có chứa các lỗi

{=SUM(IF(ISERROR(C1:C10),"", C1:C10)}

e.     Tính tổng 3 giá trị nhỏ nhất trong một dãy

Công thức sau đây trả vế tổng của 3 giá trị nhỏ nhất trong một dãy có tên là Data (đặt tên mảng, các bạn tham khảo trong phần "Tên và nhãn trong công thức").

{=SUM(SMALL(Data, {1,2,3}))}

Hàm sử dụng một hằng mảng làm đối số thứ hai cho hàm SMALL. Hàm SMALL được tính tóan 3 lần với 3 đối số thứ hai khác biệt là 1, 2, 3 tương ứng với các giá trị nhỏ nhất, nhỏ thứ hai, và nhỏ thứ ba trong dãy. Sau đó, kết quả tạo ra một mảng mới gồm 3 số hạng nhỏ nhất trong dãy và hàm SUM sẽ tính lại tổng của mảng mới này.

f.      Tính tổng 3 giá trị lớn nhất trong một dãy

Tương tự, bạn có thể tính tổng của 3 giá trị lớn nhất trong một dãy như sau

{=SUM(LARGE(Data, {1,2,3}))}

g.    Tính tổng n giá trị lớn nhất trong một dãy

{=SUM(LARGE(Data,ROW(INDIRECT("1:n"))))}                (n: giá trị bạn muốn tính )

Hàm ROW(INDIRECT("1:n")) sẽ tạo ra một mảng gồm các đối số từ 1 đến n và hằng mảng này sẽ được dùng làm đối số thứ hai cho hàm LARGE như đã giải thích ở phần trên.

h.    Tính tổng theo điều kiện

Thông thường chúng ta tính tổng dựa vào một hay nhiều điều kiện. Xét ví dụ sau:

{=SUM(IF(DATA>0,DATA))}

Hàm IF sẽ tạo ra một mảng chỉ chứa các số dương và giá trị FALSE. Sau đó nạp vào hàm SUM, hàm SUM bỏ qua các giá trị FALSE và chỉ cộng các giá trị dương lại cho ra kết quả. Công thức trên tương đương hàm sau: =SUMIF(DATA,”>0”).

Khi có nhiều điều kiện thì Excel 2007 có hàm SUMIFS. Ví dụ muốn tính tổng các giá trị lớn hơn 0 và nhỏ hơn hoặc bằng 5. Dùng hàm SUMIFS như sau: = SUMIFS(DATA,DATA,”<=5”,DATA,”>0”) và công thức mảng sau là tương đương:

{=SUM((DATA>0)*(DATA<=5)*DATA)}. Tuy nhiên công thức mảng này sẽ báo lỗi nếu tập số liệu có chứa chuỗi

i.      Tính bình quân lọai bỏ giá trị 0

Muốn tính bình quân cho tập số liệu B5:B12 nhưng loại bỏ các số 0 hãy nhập vào công thức sau:

{=Average(If(Data<>0,Data))}

Hàm này sẽ tạo ra một mảng trong bộ nhớ chỉ chứa các giá trị khác 0 và các giá trị False. Sau đó nạp vào hàm Average tính ra trung bình của các giá trị khác 0. Công thức mảng trên tương đương với công thức sau: =SUM(Data)/CountIf(Data,”<>0”).

j.      Kiểm tra Text cần tìm có trong dãy Text không?

Cho mảng tên A5:E24 (đặt tên là NameList) như hình bên dưới, tại ô C3 (đặt tên là TheName) nhập vào tên cần tìm, nếu tên có trong mảng thì tại ô D3 hiện lên chữ Found (tìm thấy), còn không D3 hiện lên Not Found (không tìm thấy).

Công thức mảng tại ô D3 là: {=IF(OR(Thename=NameList),”Found”,”Not Found”)}

Công thức sau sẽ cho kết quả tương đương.

=IF(COUNTIF(NameList,TheName)>0,"Found","Not Found")

k.     So sánh 2 dãy

Điều kiện so sánh là 2 dãy phải có cùng một kích cỡ và cùng chiều với nhau. Ta gọi 2 dãy này là MyData và YourData. Công thức mảng sau đây sẽ cho kết quả có bao nhiêu số phần tử khác nhau trong 2 dãy {=SUM(IF(MyData=YourData,0,1))}

Công thức này sẽ tạo ra một mảng mới có cùng kích cỡ với 2 mảng đang được so sánh. Hàm IF sẽ lấp đầy mảng này bằng các phần tử 0, 1 (0 nếu có một phần tử khác nhau được tìm thấy và 1 nếu các phần tử của 2 dãy giống nhau). Sau đó, hàm SUM sẽ trả về tổng của các giá trị 0 trong mảng (số phần tử khác nhau trong 2 dãy). Ta có thể đơn giản hóa công thức trên như sau : {=SUM(1*(MyData<>YourData))}

l.      Trả về vị trí của giá trị lớn nhất trong mảng

Công thức mảng sau sẽ trả về số dòng của của giá trị lớn nhất trong mảng dọc một chiều:

{=MIN(IF(Data=MAX(Data),ROW(Data), ""))}.

Nếu mảng Data chứa nhiều hơn 1 giá trị lớn nhất thì dòng chứa giá trị lớn nhất đầu tiên được chọn. Công thức mảng sau sẽ trả về địa chỉ của ô chứa giá trị lớn nhất trong mảng dọc một chiều:

{=ADDRESS(MIN(IF(Data=MAX(Data),ROW(Data), "")),COLUMN(Data))}

Nếu mảng có nhiều cột thì dùng công thức sau:

{=ADDRESS(MIN(IF(Data=MAX(Data),ROW(Data),"")),MIN(IF(Data=MAX(Data),COLUMN(Data),"")))}

m.   Tìm số dòng chứa giá trị xuất hiện thứ n trong tổng số lần xuất hiện của giá trị trong dãy

Công thức mảng sau sẽ trả về số dòng chứa giá trị xuất hiện thứ n trong tổng số lần xuất hiện của giá trị trong dãy dọc

{=SMALL(IF(A4:A18=E4,ROW(A4:A18),""),E5)}

Hàm If sẽ tạo một mảng mới trong bộ nhớ chứa số thứ tự dòng của các giá trị trong vùng A4:A18 bằng với giá trị của ô E4. Các giá trị trong vùng A4:A18 không bằng với giá trị trong E4 sẽ được thay bằng một chuỗi rỗng. Sau đó hàm SMALL sẽ tìm ra số dòng nhỏ thứ n trong tổng số lần xuất hiện của giá trị trong dãy.

Hàm sẽ trả về lỗi #NUM khi giá trị cần tìm không có trong dãy hoặc n lớn hơn tổng số lần xuất hiện.

n.    Trả về chuỗi dài nhất trong dãy các chuỗi

Muốn tìm chuỗi ký tự dài nhất trong các chuỗi thuộc dãy dùng công thức mảng sau:

{=INDEX(Data,MATCH(MAX(LEN(Data)),LEN(Data),FALSE),1)}

Hàm này tạo ra hai mảng chứa độ dài của mỗi chuỗi trong dãi được tạo ra bằng 2 hàm LEN. Sau đó dùng hàm MAX để xác định giá trị lớn nhất, và hàm MATCH sẽ tính ra vị trí trong dãy số liệu chứa chuỗi dài nhất này. Cuối cùng hàm INDEX sẽ trả về nội dung của ô chứa chuỗi dài nhất. Hàm này chỉ làm việc trên dãy một chiều dọc.

o.    Xác định dãy chứa các giá trị hợp lệ hay không

Bạn có 2 dãy số liệu 1 và 2, bạn muốn kiểm tra xem các phần tử của dãy 1 (tên là MyList) có thuộc dãy 2 (tên là Master) không? Công thức sau trả về TRUE nếu toàn bộ dãy 1 thuộc dãy 2, lưu ý 2 dãy số liệu phải được bố trí dạng cột và không bắt buộc số phần tử bằng nhau.

{=ISNA(MATCH(TRUE,ISNA(MATCH(MyList,Master,0)),0))}

Hàm MATCH ở trên sẽ so sánh từng cặp phần tử trong MyList và Master, nó sẽ trả về một dãy trong bộ nhớ máy tính chứa các con số và lỗi #NA cho các cặp không trùng nhau. Sau đó hàm ISNA sẽ chuyển đổi dãy giá trị trong bộ nhớ này thành các giá trị luận lý TRUE (#NA à TRUE) và FALSE. Tiếp theo hàm MATCH phía ngoài sẽ tìm vị trí của các giá trị TRUE trong dãy của ISNA vừa trả về, nếu tìm thấy giá trị TRUE thì ngay lập tức hàm ISNA ngoài cùng sẽ trả về FALSE (nghĩa có phần tử của MyList nằm ngoài Master), còn nếu không tìm thấy giá trị TRUE nào thì hàm ISNA trả về TRUE (nghĩa là toàn bộ phần tử MyList đều có trong Master).

Hàm trên chỉ cho ta biết thông tin là một danh sách này có thuộc hay không thuộc một danh sách khác, hàm bên dưới sẽ cho ta biết có bao nhiêu phần tử của MyList không thuộc Master.

{=SUM(1*ISNA(MATCH(MyList,Master,0)))}

Hàm sau sẽ cho biết phần tử đầu tiên trong MyList không thuộc Master là phần tử nào:

{=INDEX(MyList,MATCH(TRUE,ISNA(MATCH(MyList,Master,0)),0))} 

p.    Cộng các con số của số nguyên

Ví dụ ô A1 chứa số nguyên 8668, bây giờ chúng ta muốn cộng các con số của số nguyên trên 8+6+6+8=28. Để thực hiện điều đó ta dùng công thức sau:

{=SUM(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)*1)}

Công thức này khi tính nó sẽ tạo ra một dãy số nguyên bắt đầu là số 1 và kết thúc lá số các con số chứa trong ô A1. Ví dụ A1 chứa số 8668 thì thì hàm LEN trả về số 4 và hàm ROW khi tính sẽ tạo ra một mảng chứa các giá trị {1,2,3,4}. Sau đó kết quả từ hàm ROW sẽ làm đối số cho hàm MID như sau: 

{=MID(8668,{1,2,3,4},1)*1}

Và công thức trên sau khi tính toán sẽ trả về mảng {8,6,6,8}

Sau đó mảng này sẽ làm đối số cho hàm SUM ngoài cùng và trả về kết quả là 28.

Tuy nhiên công thức trên không áp dụng cho số nguyên âm, công thức sau sẽ giải quyết vấn đề được tổng quát hơn.

{=SUM(VALUE(MID(ABS(A1),ROW(INDIRECT("1:"&LEN(ABS(A1)))),1)))}

q.    Cộng các giá trị đã làm tròn

Thông thường khi tính toán các giá trị đã làm tròn trên bảng tính, Excel vẫn lấy các giá trị lưu trữ thực sự trong các ô để tính toán chứ không lấy các giá trị làm tròn đang hiển thị trên bảng tính để tính (do định dạng việc hiển thị các con số), do vậy kết quả có thể không như ý muốn. Bạn hãy dùng công thức mảng sau để giải quyết vấn đề này:

=SUM(ROUND(E4:E6,2))

r.     Cộng các giá trị cách nhau n khoảng trong dãy

Giả sử bạn có một tập dữ liệu và bạn muốn cộng các phần tử cách nhau 5 phần tử, khi đó bạn nên nghĩ tới công thức sau:

{SUM(IF(MOD(ROW(INDIRECT("1:"&COUNT(Data)))-1,n)=0,Data,""))} 

Công thức này trước tiên sẽ tạo ra một mảng trong bộ nhớ chứa các con số liên tục từ 1 đến số phần tử của danh sách (hàm count trả về). Sau đó mảng này sẽ là đối số thứ nhất của hàm MOD và đối số thứ 2 chính là giá trị cách nhau n. Hàm MOD sẽ tạo ra trong bộ nhớ một mảng chứa các số dư của phép chia số thứ tự dòng cho n (các giá trị 0 trong mảng mới này tượng trưng cho việc chia hết cho n). Sau đó mảng này trở thành đối số cho hàm IF, nếu giá trị trong mảng là 0 thì hàm IF trả về giá trị tương ứng của tập dữ liệu và cuối cùng là hàm SUM sẽ cộng tất cả các giá trị thõa điều kiện lại.

Công thức trên sẽ bị sai nếu n là 0 (nghĩa là tổng của tập hợp rỗng). Công thức hiệu chỉnh sau sẽ giải quyết  lỗi này:

{=IF(n=0,0,SUM(IF(MOD(ROW(INDIRECT("1:"&COUNT(data)))-1,n)=0,data,"")))}

Lưu ý công thức này chỉ áp dụng cho một cột dữ liệu mà thôi. Công thức trên khi tính lúc nào cũng có giá phần tử thứ nhất trong tập số liệu. Ví dụ n là 5 thì công thức sẽ tính tổng các phần tử thứ 1, 6, 11, 16 … Nếu bạn không muốn phần tử thứ nhất có trong kết quả tính thì hãy dùng công thức hiệu chỉnh sau, công thức này chỉ tính giá trị thứ 5, 10, 15 …:

{=IF(n=0,0,SUM(IF(MOD(ROW(INDIRECT("1:"&COUNT(Data)))-n,n)=0,Data,"")))}

Khi muốn công thức tính cho mảng nằm ngang thì dùng thêm hàm TRANSPOSE như sau;

{=IF(n=0,0,SUM(IF(MOD(TRANSPOSE(ROW(INDIRECT("1:"&COUNT(Data))))-1,n)=0,Data,"")))}

s.     Loại bỏ các ký tự khác số khỏi chuỗi

Công thức mảng sau sẽ giúp chúng ta trích được các con số từ một chuỗi có chứa các con số. Ví dụ chuỗi là ABC145Z thì sau khi dùng công thức này sẽ trả về kết quả là 145.

{=MID(A1,MATCH(0,(ISERROR(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)*1)*1),0),
LEN(A1)-SUM((ISERROR(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)*1)*1)))}

Lưu ý công thức này chỉ áp dụng cho 1 chuỗi có 1 con số trong đó, kết quả sẽ ra sai nếu có từ 2 con số xen kẽ là ký tự ví dụ như Z253X8 thì kết quả sẽ sai.

t.      Xác định giá trị gần đúng nhất trong dãy với giá trị cho trước

Công thức mảng sau sẽ giúp xác định giá trị gần nhất với giá trị cần tìm trong một dãy số. Ví dụ giá trị cần tìm đặt tên là Target và tập số liệu tên là Data.

{=INDEX(Data,MATCH(SMALL(ABS(Target-Data),1),ABS(Target-Data),0))}

Nếu trong Data có 2 giá trị gần nhất so với Target thì công thức sẽ trả về giá trị tìm thấy trước trong danh sách. Như trong hình minh họa thì giá trị gần nhất với 45 là 48.

u.    Trả về giá trị cuối cùng trong một cột

Bạn có một bảng tính dùng để cập nhật số liệu hàng ngày vào các cột. Bạn muốn biết giá trị của ô cuối cùng trong cột A có chứa số liệu, nếu cột A không có chứa các ô rỗng (empty) thì ta có thể dùng hàm OFFSET để thực hiện như sau (không dùng công thức mảng):

=OFFSET(A1,COUNTA(A:A)-1,0)

Hàm COUNTA sẽ đếm xem có bao nhiêu ô không rỗng trong cột A và kết quả sẽ trừ bớt 1, kết quả này sẽ là đối số thứ 2 của hàm OFFSET. Ví dụ dòng có giá trị cuối cùng trong cột A là 100, hàm COUNTA sẽ trả về 100 (do vậy phải trừ bớt 1) vì hàm OFFSET sẽ trả về địa chỉ cách ô A1 (làm mốc) 99 dòng.

Nếu cột A có các ô rỗng thì công thức trên sẽ không đúng nữa do hàm COUNTA chỉ đếm các ô không rỗng. Công thức mảng sau sẽ giải quyết được vấn đề nêu trên:

=INDEX(A:A,MAX(ROW(A:A)*(A:A<>"")))

Cẩn thận với việc dùng cách khai báo cả cột A:A trong Excel 2007 (có trên 1 triệu dòng) vì điều này sẽ làm tăng khối lượng tính toán rất đáng kể, thay vào đó bạn nên dự trù số dòng cần kiểm tra thôi ví dụ 500 dòng:

{=INDEX(A1:A500,MAX(ROW(A1:A500)*(A1:A500<>"")))}

v.      Trả về giá trị cuối cùng trong một dòng

Tương tự như trên, nhưng ở đây yêu cầu cho biết giá trị của ô cuối cùng trong một dòng. Ví dụ như tìm tại dòng 1 từ A1 đến GR1 (200 cột).

{=INDEX(A1:GR1,MAX(COLUMN(A1:GR1)*(A1:GR1<>"")))}

Nếu bạn muốn kiểm tra toàn bộ dòng 1 thì dùng:

{=INDEX(1:1,MAX(COLUMN(1:1)*(1:1<>"")))}

Tuy nhiên vì Excel 2007 có 16384 cột nên cách này sẽ ảnh hưởng rất lớn đến tốc độ tính toán của bảng tính.

w.    Xếp hạng bằng công thức mảng

Hàm xếp hạng RANK của Excel đôi khi không đáp ứng được nhu cầu xếp hạng của chúng ta.  Giả sử hình bên dưới có 2 giá trị bằng nhau do vậy hàm Rank sẽ xếp đồng hạng 3, tuy nhiên ta muốn xếp hạng theo giá trị trung bình tức là hạng 3.5. Khi đó chúng ta dùng công thức mảng sau:

Tại ô D5 nhập vào:        {=SUM(1*(B5<=Sales))-(SUM(1*(B5=Sales))-1)/2}

Sau đó chép công thức cho các dòng còn lại.

x.     Tạo bảng chéo động

Ta muốn tạo bảng báo cáo thống kê về từng nhóm hàng (Category) trong từng tháng như hình trên. Khi đó chúng ta lập các nhãn các nhóm hàng tại F5:H5 và lập nhãn các tháng tại E6:E9. Tại ô F6 hãy nhập vào công thức mảng sau: (A5:A23 đặt tên là Date; B5:B23 tên là Category và C5:C23 đặt tên là Amount)

{=SUM(($E6=Date)*(F$5=Category)*Amount)}     à chép công thức cho các ô còn lại

y.     Đếm nhiều điều kiện

 

Đếm xem có bao nhiêu dòng thõa 2 điều kiện là bằng A và 1980.

Dùng hàm SUM:            {=SUM((A1:A8="A")*(B1:B8=1980))}

Dùng IF:                       {=SUM(IF(A1:A8="A",1,0)*IF(B1:B8=1980,1,0))}

Dùng Sumproduct:        =SUMPRODUCT((A1:A8="A")*1,(B1:B8=1980)*1)            (hàm thường)

z.     Đếm số phần tử duy nhất trong danh sách

Phép đếm này sẽ loại ra các phần tử bị trùng trong danh sách chỉ giữ lại một phần tử. Ví dụ đếm trong vùng A1:A8 có bao nhiêu phần tử khác nhau.

Công thức tổng quát:

Dùng Sum:       {=sum(1/countif(vùngđếm, vùngđếm))}

Nếu tập số liệu có chứa ô rỗng thì dùng

                        {=SUM(IF(COUNTIF(vùngđếm, vùngđếm)=0,"",1/COUNTIF(vùngđếm, vùngđếm)))}

Sumproduct:     =sumproduct((1/countif(vùngđếm, vùngđếm))*1)             (công thức thường)  

Ví dụ:

Dùng Sum:       {=SUM(1/COUNTIF(A1:A8,A1:A8))}

Sumproduct:     =SUMPRODUCT((1/COUNTIF(A1:A8,A1:A8))*1)

aa.  Cộng các phần tử trong mảng và không tính nếu phần tử xuẩt hiện lần thứ 2 trở lên.

{=sum(vungso/countif(vungso,vungso))}

Ý tưởng thì giống như trên như ở trên có điều mỗi lần lước qua một phần tử trong mảng ta không tính giá trị là 1 là tính giá trị là chính con số đó.

Sắp xếp hạng liên tục

[=SUM(1/(IF($A$2:$A$13>A2,COUNTIF($A$2:$A$13,$A$2:$A$13),9.999999E+307)))+1}

Vận dụng công thức của SoiBien, chuyển thành hàm sumproduct, khỏi phải Ctr Shift Enter
D5=1+SUMPRODUCT((VungRank>$A2)*(1/COUNTIF(VungRank,VungRank)))
VungRank là vùng có số liệu cần xếp TT.

Top

 

Công thức mảng trả kết quả về nhiều ô

a.     Tạo mảng số nguyên liên tục

Ở phần trên, các bạn chú ý hàm {=ROW(INDIRECT("1:n")} sẽ cho ra 1 dãy số gồm các số nguyên liên tục từ 1 đến n. Và đây cũng chính là công thức mảng giúp bạn nhập số thứ tự vào 1 dãy chọn trước. Ta thử xem hàm này họat động ra sao nhé

Hàm ROW trong Excel trả kết quả về một số hàng. Nếu ta nhập công thức mảng : {=ROW(1:12)} vào một dãy A1:A12 nằm dọc có 12 ô, ta sẽ nhận được một mảng gồm các số nguyên liên tục từ 1 đến 12. Nhưng nếu ta chèn thêm một hàng vào dãy trên nằm ở trên A1, ta sẽ thấy công thức trên trở thành {=ROW(2:13)} và mảng của ta sẽ có 12 số nguyên liên tục từ 2 đến 13.

Do đó, ta phải sử dụng kết hợp với hàm INDIRECT. Hàm INDIRECT lấy đối số là một chuỗi Text. INDIRECT("1:12") sẽ luôn luôn cho kết quả là (1:12), vì Excel không thể điều chỉnh được các tham số chuỗi trong hàm INDIRECT được. Sự kết hợp này luôn đảm bảo cho hàm {=ROW(INDIRECT("1:12")} cho kết quả là một mảng gốm các số từ 1 đến 12 trong mọi trường hợp.

b.    Chỉ trả về các giá trị dương trong dãy

Ta có một cột số liệu (tên là DATA) có các giá trị âm và dương, và ta muốn trích ra các số dương trong cột số liệu đó (không trích các số 0 và số âm). Để dùng hàm mảng trước tiên bạn chọn một vùng trên bảng tính có kích thước bằng với cột số liệu và nhập công thức sau vào

{=INDEX(Data,SMALL(IF(Data>0,ROW(INDIRECT("1:"&ROWS(Data)))),ROW(INDIRECT("1:"&ROWS(Data)))))}

Nhớ nhấn tổ hợp phím Ctrl+Shift+Enter khi kết thúc. Kết quả như hình cột C ở bên dưới

Kết quả trong cột C chưa hoàn hảo vì có các lỗi #NUM, do ta chưa kiểm tra lỗi trước khi xuất kết quả. Công thức sau sẽ giải quyết ổn thoã:

Excel 2007 thì dùng:

{=IFERROR(INDEX(Data,SMALL(IF(Data>0,ROW(INDIRECT("1:"&ROWS(Data)))),
ROW(INDIRECT("1:"&ROWS(Data))))),"")}

Muốn tính tương thích cao với các phiên bản cũ thì dùng công thức sau:

{=IF(ISERR(SMALL(IF(Data>0,ROW(INDIRECT("1:"&ROWS(Data)))),
ROW(INDIRECT("1:"&ROWS(Data))))),"",INDEX(Data,SMALL(IF(Data>0,
ROW(INDIRECT("1:"&ROWS(Data)))),ROW(INDIRECT("1:"&ROWS(Data))))))}

c.     Trả về các ô Nonblank trong dãy

Có dãy số liệu tên là DATA, trong đó có chứa các blank (ô trống).  Chúng ta dùng các công thức sau:

Excel 2007:

{=IFERROR(INDEX(Data,SMALL(IF(Data<>"",ROW(INDIRECT("1:"&ROWS(Data)))),ROW(INDIRECT("1:"&ROWS(Data))))),"")}

Công thức dưới sẽ tương thích các phiên bản trước:

{=IF(ISERR(SMALL(IF(Data<>"",ROW(INDIRECT("1:"&ROWS(Data)))),ROW(INDIRECT("1:"&ROWS(Data))))),"",
INDEX(Data,SMALL(IF(Data<>"",ROW(INDIRECT("1:"&ROWS(Data)))),ROW(INDIRECT("1:"&ROWS(Data))))))}

Lưu ý chọn trước vùng kết quả tương ứng với kích thước cột dữ liệu và kết thúc công thức bằng tổ hợp phím Ctrl+Shift+Enter.

d.    Đảo thứ tự các ô trong dãy

Ta có một tập số liệu tên là DATA trong một cột của bảng tính, và ta muốn đảo thứ tự sắp xếp của cột số liệu này theo chiều ngược lại. Khi đó bạn hãy xem công thức mảng sau:

{=IF(INDEX(Data,ROWS(data)-ROW(INDIRECT("1:"&ROWS(Data)))+1)="","",
INDEX(Data,ROWS(Data)-ROW(INDIRECT("1:"&ROWS(Data))) +1))}

 

Thứ tự dữ liệu trong cột C đã bị đảo ngược so với cột A. Lưu ý chọn trước vùng kết quả tương ứng với kích thước cột dữ liệu và kết thúc công thức bằng tổ hợp phím Ctrl+Shift+Enter.

Ghi chú: Các ô trong bảng tính khi mới tạo ra sẽ có thuộc tính Blank  (ô trống) (hay Null). Các ô Empty (ô rỗng) là các ô có chứa chuỗi rỗng "". Trong VB (hay VBA) phép so sánh với Nothing là đã bao gồm cả blank và empty.

e.     Sắp xếp các giá trị số trong một dãy động

Ta có một cột chứa các giá trị số trong bảng tính (đặt tên là DATA), bây giờ ta muốn sắp xếp các giá trị này từ lớn xuống nhỏ một cách động với dữ liệu nguồn. Khi đó ta dùng công thức sau:

{=LARGE(Data,ROW(INDIRECT("1:"&ROWS(Data))))}

Công thức trên sẽ bị lỗi #NUM khi trong cột số liệu DATA có các ô trống, để khắc phục ta dùng hàm sau:

Excel 2007:

{=IFERROR(LARGE(Data,ROW(INDIRECT("1:"&ROWS(Data)))),"")}

Công thức dưới sẽ tương thích các phiên bản trước:

{=IF(ISERR(LARGE(Data,ROW(INDIRECT("1:"&ROWS(Data))))),"",LARGE(Data,ROW(INDIRECT("1:"&ROWS(Data)))))}

Muốn sắp xếp theo trình tự từ nhỏ đến lớn thì thay hàm SMALL cho hàm LARGE.

f.      Trả về danh sách các phần tử duy nhất trong một dãy

Ta có một sột dữ liệu tên là DATA có các dữ liệu trùng nhau, công thức sau sẽ giúp trích ra một sách mà mỗi phần tử là duy nhất trong danh sách này.

{=INDEX(data,SMALL(IF(MATCH(data,data,0)=ROW(INDIRECT("1:"&ROWS(data))),MATCH(data,data,0),""),
ROW(INDIRECT("1:"&ROWS(data)))))}

Công thức trên sẽ bị lỗi #NUM nếu cột dữ liệu có các ô trống (blank), công thức sau sẽ giải quyết được lỗi này:

Excel 2007:

{=IFERROR(INDEX(Data,SMALL(IF(MATCH(Data,Data,0)=ROW(INDIRECTd("1:"&ROWS(data))), MATCH(Data,Data,0),""),ROW(INDIRECT("1:"&ROWS(Data))))),"")}

Công thức dưới sẽ tương thích các phiên bản trước:

{=IF(ISERR(INDEX(data,SMALL(IF(MATCH(data,data,0)=ROW(INDIRECT("1:"&ROWS(data))), MATCH(data,data,0),""),ROW(INDIRECT("1:"&ROWS(data)))))),"",

INDEX(data,SMALL(IF(MATCH(data,data,0)=ROW(INDIRECT("1:"&ROWS(data))), MATCH(data,data,0),""),ROW(INDIRECT("1:"&ROWS(data))))))}

g.    Tạo dương lịch

Để tạo ra cuốn lịch tây như ý của mình, sau khi nhập tháng và năm vào ô B2, làm nhãn các ngày trong tuần cho các ô B3:H3. Sau đó chọn các ô B4:H9 và nhập vào công thức mảng:

{=IF(MONTH(DATE(YEAR(B2),MONTH(B2),1))<>MONTH(DATE(YEAR(B2),
MONTH(B2),1)-(WEEKDAY(DATE(YEAR(B2),MONTH(B2),1))-1)+{0;1;2;3;4;5}*7+{1,2,3,4,5,6,7}-1),"",
DATE(YEAR(B2),MONTH(B2),1)-(WEEKDAY(DATE(YEAR(B2),MONTH(B2),1))-1)+{0;1;2;3;4;5}*7+{1,2,3,4,5,6,7}-1)}

Kết thúc công thức nhấn tổ hợp phím Ctrl+Shift+Enter.

Top

 
Free Web Hosting