hitava

Mẹo Google Sheets · 14 phút đọc

Hàm ARRAYFORMULA trong Google Sheets: một công thức cho cả cột, kết hợp IF, VLOOKUP, SUMIF và sửa lỗi #REF!

ARRAYFORMULA cho một công thức chạy trên cả cột: gõ =ARRAYFORMULA(IF(D2:D=""; ""; D2:D*E2:E)) một lần ở F2 là mọi dòng có số lượng đều ra Thành tiền, kể cả dòng bạn thêm vào ngày mai. Không phải kéo công thức, không sợ ai sửa lệch một ô giữa cột. Bài này đi qua cú pháp, cách bỏ dòng trống, kết hợp với VLOOKUP, XLOOKUP, SUMIF, những hàm không chạy trong ARRAYFORMULA (SUM, AND, OR) và cách thay, lỗi #REF! do mảng bị chặn, so sánh với mảng động của Excel 365 và MAP, BYROW, LAMBDA.

Đăng HiTaVaARRAYFORMULACông thức mảngGoogle SheetsCông thức
So sánh kéo công thức =D2*E2 xuống từng dòng (dòng mới quên kéo) với một công thức =ARRAYFORMULA(IF(D2:D=""; ""; D2:D*E2:E)) ở F2 tự tính Thành tiền 360.000, 170.000, 600.000, 250.000, 340.000

Hàm ARRAYFORMULA là gì, vì sao nên dùng

Bình thường bạn viết =D2*E2 ở F2 rồi kéo xuống, mỗi ô một công thức riêng. Cách này có ba nhược điểm: dòng mới thêm vào thì phải nhớ kéo tiếp, ai đó gõ đè một ô thì cột lệch mà không ai hay, và file có hàng nghìn công thức giống nhau nặng hơn cần thiết.

ARRAYFORMULA bảo Google Sheets tính cả một dải ô thay vì một ô. Bạn viết D2:D*E2:E thay cho D2*E2, Google nhân từng cặp ô cùng dòng và trải kết quả xuống các ô bên dưới. Chỉ ô đầu tiên có công thức; các ô còn lại chỉ hiển thị kết quả.

Viết ở
Một ô duy nhất, thường là dòng đầu của cột
Dòng mới
Tự tính, không cần kéo công thức
Bỏ dòng trống
Bọc IF(cột=""; ""; …)
Lỗi hay gặp
#REF! khi ô bên dưới đã có dữ liệu

Các ví dụ trong bài dùng trang Đơn hàng: A = Mã đơn, B = Ngày, C = Mã hàng, D = Số lượng, E = Đơn giá, F = Thành tiền, và trang Sản phẩm: A = Mã hàng, B = Tên hàng, C = Đơn giá. Công thức viết theo vùng Việt Nam nên đối số cách nhau bằng dấu chấm phẩy.

Cú pháp hàm ARRAYFORMULA

Chỉ một đối số: một phép tính hoặc một hàm, trong đó chỗ nào trước đây là một ô thì nay là một dải ô cùng kích thước.
=ARRAYFORMULA(công_thức_mảng)
A: Mã đơnC: Mã hàngD: Số lượngE: Đơn giá
2HD01SP013120.000
3HD02SP02285.000
4HD03SP015120.000
5HD04SP031250.000
Trang Đơn hàng dùng cho các ví dụ (cột B Ngày không cần cho phép nhân).
Gõ ở F2. Hai dải D2:D5 và E2:E5 phải cùng số dòng.
=ARRAYFORMULA(D2:D5*E2:E5)

Thử lại: F2 = 3 × 120.000 = 360.000, F3 = 2 × 85.000 = 170.000, F4 = 5 × 120.000 = 600.000, F5 = 1 × 250.000 = 250.000. Bấm vào F3, thanh công thức hiện công thức của F2 bằng chữ xám: F3 chỉ là phần kết quả trải xuống, không sửa riêng được.

Mẹo gõ nhanh: đang sửa công thức, bấm Ctrl+Shift+Enter (trên Mac là Cmd+Shift+Enter) thì Google tự thêm ARRAYFORMULA( vào đầu. Hai dải khác số dòng, ví dụ D2:D5*E2:E9, thì công thức báo lỗi vì không ghép được từng cặp.

Hàm nào đã trả về nhiều ô thì không cần ARRAYFORMULA

FILTER, QUERY, SORT, UNIQUE, IMPORTRANGE tự trải kết quả ra nhiều ô. Bọc ARRAYFORMULA bên ngoài chúng không sai nhưng thừa. Cách dùng QUERY có ở bài hàm QUERY trong Google Sheets.

ARRAYFORMULA cho cả cột: kết hợp IF để bỏ dòng trống

Để dòng mới tự tính, dải ô phải để mở: D2:D nghĩa là từ D2 tới hết trang. Nhưng viết =ARRAYFORMULA(D2:D*E2:E) thì mọi dòng trống bên dưới đều hiện số 0 kéo dài tới cuối trang. Bọc IF để dòng chưa có số lượng thì để trống:

Gõ ở F2. Dòng nào cột D trống thì F trống; còn lại nhân như thường.
=ARRAYFORMULA(IF(D2:D=""; ""; D2:D*E2:E))

Thử lại: bạn thêm dòng 6: HD05, SP02, số lượng 4, đơn giá 85.000. Không cần làm gì, F6 hiện ngay 340.000. Dòng 7 trở xuống chưa có số lượng nên trống.

Muốn công thức nằm luôn ở ô tiêu đề (để không ai vô tình xoá F2), ghép tiêu đề với kết quả bằng ngoặc nhọn. Dấu ; trong ngoặc nhọn nghĩa là xếp xuống dòng dưới:

Gõ ở F1: F1 là chữ Thành tiền, từ F2 trở xuống là kết quả. Cách này cũng hợp với trang nhận câu trả lời Google Form, nơi dòng mới được thêm liên tục.
={"Thành tiền"; ARRAYFORMULA(IF(D2:D=""; ""; D2:D*E2:E))}

Thêm điều kiện vào IF như bình thường. Ví dụ đơn từ 5 cái trở lên được giảm 10%:

0,9 viết bằng dấu phẩy vì vùng Việt Nam dùng dấu phẩy làm dấu thập phân. File để vùng Hoa Kỳ thì viết 0.9.
=ARRAYFORMULA(IF(D2:D=""; ""; IF(D2:D>=5; D2:D*E2:E*0,9; D2:D*E2:E)))

Thử lại: HD03 mua 5 cái: 5 × 120.000 × 0,9 = 540.000. HD01 mua 3 cái không đủ mốc: vẫn 360.000. Hai kiểu cột tự tính hay dùng khác:

ViệcCông thức (gõ ở dòng 2)Kết quả ví dụ
Số thứ tự tự đánh=ARRAYFORMULA(IF(A2:A=""; ""; ROW(A2:A)-1))Dòng 2 ra 1, dòng 6 ra 5
Tháng của đơn=ARRAYFORMULA(IF(B2:B=""; ""; TEXT(B2:B; "mm/yyyy")))Ngày 02/10/2026 ra 10/2026
Nối mã và tên=ARRAYFORMULA(IF(A2:A=""; ""; A2:A&" - "&C2:C))HD01 - SP01

Cột B phải là ngày thật thì TEXT mới ra đúng tháng; nếu ra nguyên văn chuỗi bạn gõ, xem cách sửa lỗi ngày tháng trong Google Sheets.

Hàm không chạy trong ARRAYFORMULA: SUM, AND, OR và cách thay

Một số hàm vốn dùng để gộp nhiều ô thành một số: SUM, AVERAGE, MAX, MIN, COUNT, AND, OR, TEXTJOIN. Đặt chúng trong ARRAYFORMULA, chúng vẫn gộp cả cột thành một giá trị duy nhất chứ không tính riêng từng dòng. Công thức không báo lỗi, chỉ ra kết quả sai.

Hai bảng 4 dòng SP01/3, SP02/2, SP01/5, SP03/1: công thức dùng AND cho mọi dòng trống; công thức dùng (C2:C="SP01")*(D2:D>=3) ra tích 1 hoặc 0 và ghi Ưu tiên ở dòng 1 và 3
Cùng điều kiện "SP01 và từ 3 cái": AND gộp cả cột nên sai, phép nhân tính từng dòng nên đúng.

Mẹo: trong Google Sheets, TRUE tính là 1, FALSE là 0. Nhân hai điều kiện thì chỉ ra 1 khi cả hai cùng đúng (giống AND); cộng hai điều kiện thì ra lớn hơn 0 khi ít nhất một cái đúng (giống OR).

Thay AND bằng phép nhân.
=ARRAYFORMULA(IF(C2:C=""; ""; IF((C2:C="SP01")*(D2:D>=3); "Ưu tiên"; "")))

Thử lại: HD01 (SP01, 3 cái): 1 × 1 = 1, ra Ưu tiên. HD02 (SP02, 2 cái): 0 × 0 = 0, để trống. HD03 (SP01, 5 cái): Ưu tiên. HD04 (SP03, 1 cái): trống. Viết bằng AND(C2:C="SP01"; D2:D>=3) thì AND xét cả cột cùng lúc, gặp một FALSE là ra FALSE, nên mọi dòng đều trống.

Thay OR bằng phép cộng: mã là SP01 hoặc SP03.
=ARRAYFORMULA(IF(C2:C=""; ""; IF((C2:C="SP01")+(C2:C="SP03")>0; "Có"; "")))

Thử lại: HD01, HD03 (SP01) và HD04 (SP03) ra Có; HD02 (SP02) trống.

Muốn tính theo từng dòngĐừng viếtViết thế này
Cả hai điều kiện đúngAND(B2:B>0; C2:C>0)(B2:B>0)*(C2:C>0)
Một trong hai đúngOR(B2:B>0; C2:C>0)(B2:B>0)+(C2:C>0)>0
Cộng 3 cột trên cùng dòngSUM(B2:D)B2:B+C2:C+D2:D hoặc BYROW
Số lớn hơn trong 2 cộtMAX(B2:B; C2:C)IF(B2:B>C2:C; B2:B; C2:C)
Những thay thế này đều đặt bên trong ARRAYFORMULA.

Ví dụ cộng doanh số 3 tháng cho từng nhân viên: B, C, D là tháng 7, 8, 9; Lan có 10, 12, 8 (triệu). =ARRAYFORMULA(IF(A2:A=""; ""; B2:B+C2:C+D2:D)) ra 30 ở dòng của Lan. Ô trống được tính là 0 nên nhân viên mới chưa có số tháng 7 vẫn cộng được. Viết SUM(B2:D) trong ARRAYFORMULA thì mọi dòng đều ra tổng của cả bảng.

ARRAYFORMULA với VLOOKUP và XLOOKUP

Tra giá cho cả cột đơn hàng thay vì từng dòng: đưa cả cột mã hàng vào làm giá trị cần tìm. Trang Sản phẩm có SP01 Áo thun 120.000, SP02 Mũ lưỡi trai 85.000, SP03 Giày vải 250.000.

Gõ ở E2 trang Đơn hàng: tự lấy đơn giá theo mã hàng cho mọi dòng.
=ARRAYFORMULA(IF(C2:C=""; ""; IFNA(VLOOKUP(C2:C; 'Sản phẩm'!$A$2:$C$50; 3; FALSE); "Không có mã")))

Thử lại: C2 = SP01 ra 120.000, C3 = SP02 ra 85.000, C5 = SP03 ra 250.000. Gõ nhầm SP09 thì ra "Không có mã". Đổi giá trong trang Sản phẩm là cả cột E đổi theo.

Lấy hai cột cùng lúc (tên hàng và đơn giá) bằng cách đưa danh sách chỉ mục vào ngoặc nhọn. Vùng Việt Nam ghép cột trong ngoặc nhọn bằng dấu gạch chéo ngược:

Kết quả chiếm 2 cột: tên hàng và đơn giá. Hai cột bên phải ô công thức phải trống.
=ARRAYFORMULA(IF(C2:C=""; ""; VLOOKUP(C2:C; 'Sản phẩm'!$A$2:$C$50; {2\3}; FALSE)))

Thử lại: dòng HD02 (SP02) ra Mũ lưỡi trai | 85.000. File để vùng Hoa Kỳ thì viết {2,3}.

XLOOKUP cũng nhận cả cột mã khi nằm trong ARRAYFORMULA, miễn là dải kết quả chỉ có một cột:

Không cần IFNA vì XLOOKUP có sẵn đối số báo khi không tìm thấy.
=ARRAYFORMULA(IF(C2:C=""; ""; XLOOKUP(C2:C; 'Sản phẩm'!$A$2:$A$50; 'Sản phẩm'!$C$2:$C$50; "Không có mã")))

Thử lại: ra cùng kết quả với VLOOKUP ở trên: 120.000, 85.000, 120.000, 250.000. Nếu cho XLOOKUP trả về nhiều cột với nhiều mã cùng lúc, nó chỉ trả về một cột; khi đó dùng VLOOKUP với {2\3} như trên. Các cách dùng khác của XLOOKUP có ở bài hàm XLOOKUP trong Google Sheets.

SUMIF, COUNTIF theo từng dòng bằng ARRAYFORMULA

Khác với SUM, các hàm có điều kiện như SUMIF, COUNTIF, SUMIFS, COUNTIFS nhận cả một cột làm điều kiện và trả về một kết quả cho mỗi điều kiện. Ví dụ cột D trang Sản phẩm là "Đã bán", cộng số lượng từ trang Đơn hàng theo từng mã:

Gõ ở D2 trang Sản phẩm. Mỗi mã hàng mới thêm vào danh sách tự có số đã bán.
=ARRAYFORMULA(IF(A2:A=""; ""; SUMIF('Đơn hàng'!C2:C; A2:A; 'Đơn hàng'!D2:D)))

Thử lại: đơn hàng gồm HD01 SP01 × 3, HD02 SP02 × 2, HD03 SP01 × 5, HD04 SP03 × 1, HD05 SP02 × 4. SP01 = 3 + 5 = 8, SP02 = 2 + 4 = 6, SP03 = 1.

Đánh dấu mã đơn bị gõ trùng bằng COUNTIF, đếm mỗi mã xuất hiện mấy lần trong cả cột:

Gõ ở một cột trống của trang Đơn hàng.
=ARRAYFORMULA(IF(A2:A=""; ""; IF(COUNTIF(A2:A; A2:A)>1; "Trùng"; "")))

Thử lại: cột A là HD01, HD02, HD03, HD02. HD02 đếm được 2 lần nên dòng 3 và dòng 5 hiện Trùng; HD01, HD03 trống. Cách lọc và xoá dòng trùng có ở bài lọc dữ liệu trùng lặp trong Google Sheets. Điều kiện nhiều cột (theo người và theo tháng) viết SUMIFS, COUNTIFS như bài hàm SUMIFS và COUNTIFS, rồi thay ô điều kiện bằng cả cột.

Lỗi #REF! trong ARRAYFORMULA: mảng bị chặn

ARRAYFORMULA cần các ô bên dưới (và bên phải, nếu kết quả nhiều cột) hoàn toàn trống để trải kết quả ra. Chỉ cần một ô trong vùng đó có dữ liệu, kể cả một dấu cách, ô công thức sẽ báo #REF! và cả cột mất kết quả.

Cột Thành tiền: F2 báo #REF! viền đỏ, F5 tô vàng có số 250000 gõ tay; ghi chú kết quả mảng không được mở rộng vì sẽ ghi đè dữ liệu trong F5 và cách sửa là xoá F5 rồi khoá cột F
Một ô gõ tay giữa cột là đủ làm cả cột công thức biến mất.

Di chuột vào ô báo lỗi, Google cho biết kết quả mảng không được mở rộng vì sẽ ghi đè dữ liệu ở ô nào. Bấm vào ô đó, nhấn Delete, cột kết quả hiện lại ngay.

Dấu hiệuNguyên nhânCách sửa
#REF!, báo sẽ ghi đè dữ liệu ở F5Có người gõ tay vào vùng kết quảXoá ô đó, rồi khoá cả cột kết quả
#REF! sau khi dán dữ liệu vàoDán cả cột (gồm cột công thức) từ chỗ khácChỉ dán vào các cột nhập liệu
Ô trông trống mà vẫn #REF!Ô có dấu cách hoặc ký tự không nhìn thấyChọn vùng, nhấn Delete
Báo lỗi kích thước không khớpHai dải khác số dòng: D2:D5 với E2:E9Viết cùng dòng bắt đầu, cùng dòng kết thúc
Ra một giá trị cho mọi dòngDùng SUM, AND, OR bên trongThay bằng phép cộng, phép nhân
File chậm dầnNhiều cột mở tới cuối trang hàng chục nghìn dòng trốngXoá bớt dòng trống thừa cuối trang

Cách chắc nhất để không bị gõ đè là khoá cả cột kết quả (không chỉ ô đầu), cho phép mọi người sửa các cột nhập liệu. Các bước có ở bài cách khoá ô công thức trong Google Sheets.

Tab Leads của mẫu Quản lý Lead & Bán hàng PRO: các cột Mã lead, Ngày tạo, Họ tên, Điện thoại, Email, Tỉnh/Thành, Nguồn, Loại KH, Ngân sách, Phụ trách, Giai đoạn; dòng chú thích chỉ gõ vào cột nền trắng/vàng, cột nền xanh tự tính
Tab Leads trong mẫu Quản lý Lead & Bán hàng PRO: nhân viên chỉ gõ vào cột nền trắng/vàng, cột nền xanh tự tính.

ARRAYFORMULA khác mảng động của Excel 365 thế nào

Excel không có hàm ARRAYFORMULA. Từ Excel 2021 và Microsoft 365, Excel có mảng động: gõ =D2:D6*E2:E6 là kết quả tự tràn xuống, không cần bọc gì. Ý tưởng giống nhau, khác ở vài chỗ:

Google SheetsExcel 2021 / 365Excel 2019 trở về trước
Nhân cả cột=ARRAYFORMULA(D2:D6*E2:E6)=D2:D6*E2:E6 (tự tràn)Chọn vùng, gõ, Ctrl+Shift+Enter
Lỗi khi vùng kết quả bị chặn#REF!#SPILL!Không tràn, phải chọn đủ vùng
Dòng mới tự tínhDải mở D2:D + IF bỏ dòng trốngĐịnh dạng thành Bảng (Table): cột tính toán tự chép cho dòng mớiBảng (Table)
MAP, BYROW, LAMBDACóCó (Microsoft 365)Không

Trang trợ giúp của Google có ghi chú công thức mảng không xuất ra được, nên khi tải file về .xlsx hãy mở thử bằng Excel và kiểm lại các cột dùng ARRAYFORMULA trước khi gửi đi. Những khác biệt khác giữa hai bên có ở bài Google Sheets hay Excel.

MAP, BYROW và LAMBDA: khi ARRAYFORMULA không đủ

Google Sheets có LAMBDA và các hàm đi kèm từ năm 2022. Chúng chạy một công thức cho từng dòng hoặc từng ô, nên bên trong dùng được cả SUM, AND, OR mà không bị gộp cả cột.

BYROW: cộng từng dòng của B:D. Dòng không có số nào thì để trống.
=BYROW(B2:D; LAMBDA(dong; IF(COUNT(dong)=0; ""; SUM(dong))))

Thử lại: dòng của Lan 10, 12, 8 ra 30; dòng trống ra trống. Kết quả giống B2:B+C2:C+D2:D ở trên, nhưng khi có 12 cột tháng thì viết BYROW gọn hơn nhiều.

MAP: lấy từng cặp ô cùng dòng của C và D, nên AND chỉ xét một dòng mỗi lần.
=MAP(C2:C; D2:D; LAMBDA(ma; sl; IF(ma=""; ""; IF(AND(ma="SP01"; sl>=3); "Ưu tiên"; ""))))

Thử lại: ra đúng như cách nhân ở phần trên: HD01 và HD03 là Ưu tiên. MAP, BYROW chậm hơn phép tính thường trên bảng lớn, nên việc nào làm được bằng ARRAYFORMULA với phép cộng, nhân thì cứ dùng ARRAYFORMULA.

Đọc tiếp

Câu hỏi thường gặp về ARRAYFORMULA

Vì sao ARRAYFORMULA hiện số 0 hoặc FALSE kéo dài tới cuối trang?

Vì dải ô mở như D2:D chạy tới hết trang, dòng trống cũng được tính. Bọc IF: =ARRAYFORMULA(IF(D2:D=""; ""; D2:D*E2:E)) để dòng chưa có dữ liệu thì để trống.

ARRAYFORMULA báo #REF! phải làm sao?

Thường là có ô trong vùng kết quả đã có dữ liệu. Di chuột vào ô lỗi để xem ô nào chặn, xoá ô đó bằng phím Delete. Sau đó khoá cả cột kết quả để không ai gõ đè.

Có dùng SUM hay AND bên trong ARRAYFORMULA được không?

Được nhưng sai ý: SUM, AND, OR gộp cả cột thành một giá trị. Muốn tính theo từng dòng, thay AND bằng phép nhân (A2:A>0)*(B2:B>0), OR bằng phép cộng, SUM bằng B2:B+C2:C hoặc BYROW.

ARRAYFORMULA có làm file chậm không?

Một ARRAYFORMULA thường nhẹ hơn hàng nghìn công thức kéo xuống. File chậm khi có nhiều cột mở tới cuối trang mà trang có hàng chục nghìn dòng trống; xoá bớt dòng thừa ở cuối trang là đỡ.

Tại sao gõ vào ô bên dưới công thức ARRAYFORMULA thì cả cột mất?

Ô đó nằm trong vùng kết quả của mảng. Gõ vào là chặn mảng, ô đầu báo #REF!. Muốn nhập tay giá trị khác cho một dòng, thêm điều kiện vào IF hoặc dùng một cột riêng.

Nguồn tham khảo

Mẫu làm sẵn cho việc này

Đọc tiếp

Xem thêm mẹo và video hướng dẫn trên kênh YouTube HiTaVa, hoặc đọc các bài khác trong chủ đề Mẹo Google Sheets.

Cần hỏi thêm?Zalo 0935077673 (Hải Vân)