Excel formula

TỔNG QUAN BÀI VIẾT

Nhóm hàm hệ thống

Kiểm tra Excel Desktop or online =IFERROR(IF(CELL("filename")="",FALSE,TRUE),FALSE)
Kiểm tra Excel Macro enable or not

=IFERROR(IsMacroEnabled(),FALSE)

Function IsMacroEnabled() As Boolean
    On Error GoTo NoMacro
    Application.EnableEvents = Application.EnableEvents
    IsMacroEnabled = True
    Exit Function
NoMacro:
    IsMacroEnabled = False
End Function

Chọn mã có tên =IFERROR(AND(IsMacroEnabled(),CELL("filename")<>""),FALSE)

Nhóm hàm Excel tĩnh

INDEX and MATCH with multiple criteria INDEX(return_range,MATCH(criteria1&criteria2,range1&range2,1),1)
INDEX(return_range, MATCH(1, INDEX((range1=criteria1) * (range2=criteria2) , 0, 1), 0))
INDEX(return_range, MATCH(1, INDEX((range1=criteria1) * (range2=criteria2) *(range3=criteria3) , 0, 1), 0))
Hàm lấy tên các sheet Set a defined name "SheetNames" in the workbook with the formula: =TRANSPOSE(REPLACE(GET.WORKBOOK(1),1,FIND("]",GET.WORKBOOK(1)),""))
You then just use the formula "=SheetNames" to generate the spill array.
Hàm nối chuỗi theo điều kiện =TEXTJOIN(", ", TRUE, IF(A1:A10=5, B1:B10, ""))
Hàm lấy giá trị cột bằng chữ =CHAR(64 + COLUMN())
Công thức định dạng màu xen kẽ trong bảng =AND(MOD(ROW();2)=1;NOT(ISBLANK($A20)))
Hàm trả về tên sheet =MID(CELL("filename",A1),FIND("]",CELL("filename",A1))+1,255)
Hàm lấy giá trị ô liền bên trái không phụ thuộc vào tọa độ ô (dùng trong chức năng Evaluate) =OFFSET(INDIRECT(CELL("address")),0,-1)
Hàm số kết hợp với SUMIFS để tạo SUM nhiều điều kiện =SUM(SUMIFS(NS[NS KQKD],
NS[MÃ KM],TEXTSPLIT($B24,";"),
NS[THÁNG],I$19
))

Nhóm hàm Excel mảng động

Hàm FILTER với wildcart =FILTER(A5:B10, ISNUMBER(SEARCH(B1,A5:A10)))
Hàm FILTER từ nhiều điều kiện =FILTER(resultCol, BYROW(conditionCol, LAMBDA(row, SUM(--ISNUMBER(SEARCH(TEXTSPLIT(LOWER(condition), ";"), LOWER(row))))>0)))
Hàm FILTER lọc theo tỷ trọng =FILTER(B3:B16, C3:C16 >= 10% * SUM(C3:C16))
Hàm FILTER lọc theo ký tự bắt đầu =FILTER(B2:C100, ISNUMBER(SEARCH(LEFT(E1, LEN(E1)-1), A2:A100)))
Hàm nối bảng dọc =INDEX(Range,SEQUENCE(ROWS(Range)),{2})
=LET(a,Range,INDEX(a,SEQUENCE(ROWS(Range)),{2}))
=LET(a,A1:B2,b,ROWS(a),INDEX(a,SEQUENCE(b),{1,2,3}))
=LET(a,"*",b,A1:A2,c,ROWS(a),d,ROWS(b),e,c+d,IF(SEQUENCE(e)<=c,INDEX(a,SEQUENCE(c),{1}),INDEX(b,SEQUENCE(e)-c,{1})))
Hàm lọc giá trị có trong dãy A nhưng không có trong dãy B =LET(a,range1,FILTER(a,ISNA(MATCH(a,range2, 0)))
=LET(a,RangeA,b,RangeB,LET(c,XLOOKUP(a,b,b,TRUE),FILTER(a,c=TRUE)))
Hàm nối bảng ngang

=LET(a,RNG1,b,RNG2,c,COLUMNS(a),d,COLUMNS(b),e,c+d,r,ROWS(a),IF(SEQUENCE(1,e)<=c,INDEX(a,SEQUENCE( r),SEQUENCE(1,c)), INDEX(b,SEQUENCE(r ),SEQUENCE(1,e)-c)))

Hoặc đặt hàm LAMBDA
HMerge =LAMBDA(d_1,d_2,LET(c_1,COLUMNS(d_1),c_2,COLUMNS(d_2),c_0,c_1+c_2,r,ROWS(d_1),IF(SEQUENCE(1,c_0)<=c_1,INDEX(d_1,SEQUENCE( r),SEQUENCE(1,c_1)),INDEX(d_2,SEQUENCE(r ),SEQUENCE(1,c_0)-c_1))))

và công thức =HMerge(HMerge(HMerge(B3:C5,E3:G5),HMerge(I3:K5,M3:O5)),HMerge(Q3:S5,A2:C4))

Hàm Lambda nối 3 mảng hoặc nhiều hơn

Đặt hàm LAMBDA
Append =LAMBDA(a,b,IF(SEQUENCE(ROWS(a)+ROWS(b))<=ROWS(a),INDEX(a,SEQUENCE(ROWS(a)),{1,2}), INDEX(b,SEQUENCE(ROWS(a)+ROWS(b))-ROWS(a),{1,2})))

Và công thức
=Append(Append(Data1,Data2),Data3)

Hàm tách cột =INDEX(B10#, 0, 2)
trong đó B10# là ví dụ bảng cần tách, 0 là ví dụ chỉ số dòng, 2 là ví dụ chỉ số cột
Hàm kết hợp để reverse một bảng =LET(a,RNG,INDEX(a,SEQUENCE(ROWS(a),1,ROWS(a),-1)))
Hàm trả vè số dòng tối đa từ một bảng =LET(a,Range,FILTER(a,ROW(a)<MaxRows+ROW(INDEX(a,1,1))))
Hàm loại dòng tiêu đề =LET(a,UNIQUE(Range#),INDEX(a, SEQUENCE(ROWS(a)-1, 1, 2), SEQUENCE(1, COLUMNS(a))))
Hàm tách một chuỗi có nhiều phần tử được ngăn cách bởi dấu ; =FILTERXML("<t><s>" & SUBSTITUTE(A1, ";", "</s><s>") & "</s></t>", "//s[position()>0]")
Hàm tạo số thứ tự chiều dọc =SEQUENCE(ROWS(Rng),1,1,1)
Hàm tạo số thứ tự chiều ngang =SEQUENCE(1,COLUMNS(Rng),1,1)
Hàm liệt kê các giá trị trùng trong dãy =LET(a,Rng,FILTER(UNIQUE(a),COUNTIF(a,UNIQUE(a))>1))
Chia dữ liệu trong một vùng thành nhiều cột, mỗi cột chứa tối đa maxRows dòng. COL2RNG=LAMBDA(data,maxRows,LET(flat,TOCOL(data,1),cnt,ROWS(flat),cols,CEILING(cnt/maxRows,1),idx,SEQUENCE(maxRows,cols,1,1),IF(idx>cnt,"",INDEX(flat,idx))))

Cách dùng (ví dụ)

  1. Dán công thức trên vào Name Manager đặt tên ví dụ SPILL_BY_ROWS (không bắt buộc).
    Hoặc gọi trực tiếp bằng cách kết thúc LAMBDA bằng (...params...) như ví dụ dưới.

  2. Gọi LAMBDA trực tiếp trong ô (ví dụ dữ liệu ở A1:A100, max mỗi cột 10 dòng):

Hàm tính tổng dồn tích =SCAN(0,SumRange,LAMBDA(tổng,x,tổng+x))
Hàm XLOOKUP nhiều phần tử =LET(
   lookupArr, TEXTSPLIT(A1,";"),
   result, XLOOKUP(lookupArr,A:A,B:B,"N/A"),
   TEXTJOIN("; ",TRUE,result)
)
Công thức này dùng để “trải phẳng” (flatten) dữ liệu văn bản nhiều cấp thành một cột duy nhất, đồng thời giữ nguyên thứ tự ban đầu. =TEXTSPLIT(TEXTJOIN(";",,C19:C121),";")

Hàm Lambda

FILTERS (phiên bản 1 điều kiện)

*  = bất kỳ chuỗi ký tự nào
?  = một ký tự bất kỳ
~* = ký tự * thật
~? = ký tự ? thật

=LAMBDA(array, by_array, criteria, [if_empty],
  LET(
    include,
      MAP(by_array, LAMBDA(x, --(SUM(COUNTIF(x, criteria))>0))),
    FILTER(array, include, IF(ISOMITTED(if_empty), "", if_empty))
  )
)

INSTRING

=LAMBDA(String,Keyword,LET(     k,TEXTSPLIT(Keyword,";"),     SUM(--ISNUMBER(SEARCH(TRIM(k),String)))>0 ))

=LAMBDA(String,Keyword,IFERROR(LET(
    k,TEXTSPLIT(Keyword,";"),
    SUM(--ISNUMBER(SEARCH(TRIM(k),String)))>0
),FALSE))

PICKCOLS

Hàm PICKCOLS là một hàm LAMBDA dùng để trích xuất một hoặc nhiều cột từ vùng dữ liệu động (dynamic array) theo tên cột, mà không cần chỉ định thủ công vị trí cột.

=LAMBDA(data,cols,LET(h,TAKE(OFFSET(data,-1,0),1),CHOOSECOLS(data,XMATCH(cols,h))))

Hàm IFNULL

IFNULL=LAMBDA(x,value_if_null,IF(OR(ISBLANK(x),x=""),value_if_null,x))

Hàm BETWEEN

BETWEEN=LAMBDA(x,min,max,AND(x>=min,x<=max))

GETCOLS: Hàm dùng để trích xuất các cột từ bảng dữ liệu dựa trên tên tiêu đề cột

=LAMBDA(data_table,headers_in_arrow_bracket,CHOOSECOLS(data_table, XMATCH(headers_in_arrow_bracket, TAKE(data_table,1))))

=LET(table,A1:E4,CHOOSECOLS(table, XMATCH({"code","quantity","amount"},table))

Hàm rút gọn của IFERROR IF0=LAMBDA(x, IFERROR(x, 0))
Hàm lấy địa chỉ dữ liệu để truy vấn RNG=LAMBDA(x,SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(FORMULATEXT(x),"!","$"),"'",""),"=N(","["),")","]"))

Hàm trả về danh sách tháng

ngay_hom_nay as date
so_thang_truoc as number
so_thang_sauy as number
 
=LAMBDA(ngay_hom_nay,so_thang_truoc,so_thang_sau,
LET(
startMonth, EDATE(ngay_hom_nay,-so_thang_truoc),
totalMonth, so_thang_truoc + so_thang_sau + 1,
dsThang, EDATE(startMonth,SEQUENCE(totalMonth,,0)),
"T"&TEXT(dsThang,"YYMM")
))

ENCO =LAMBDA(text,TEXTJOIN("",TRUE,CHAR(CODE(MID(text,ROW(INDIRECT("1:"&LEN(text))),1))+3)))
ZOCO =LAMBDA(text,TEXTJOIN("",TRUE,CHAR(CODE(MID(text,ROW(INDIRECT("1:"&LEN(text))),1))-3)))
XLOOKUPH =LAMBDA(lookup_text,lookup_array,return_array,if_error,LET(arr,TRIM(TEXTSPLIT(lookup_text,";")),res,XLOOKUP(arr,lookup_array,return_array,if_error),TEXTJOIN("; ",TRUE,res)))
Col2Rng =LAMBDA(data,maxRows,LET(flat,TOCOL(data,1),cnt,ROWS(flat),cols,CEILING(cnt/maxRows,1),idx,SEQUENCE(maxRows,cols,1,1),IF(idx>cnt,"",INDEX(flat,idx))))
ExtractText =LAMBDA(txt,key,LET(a,TEXTSPLIT(txt,";"),k,TEXTBEFORE(a,"="),v,TEXTAFTER(a,"="),r,XLOOKUP(key,k,v,""),IFERROR(--r,r)))
ExtractText (nếu rỗng trả về 0) =LAMBDA(txt,key,LET(a,TEXTSPLIT(txt,";"),k,TEXTBEFORE(a,"="),v,TEXTAFTER(a,"="),r,XLOOKUP(key,k,v,""),IF(r="",0,IFERROR(--r,r))))
Cộng chuỗi theo chiều ngang SUMCOL=LAMBDA(range,BYCOL(range,LAMBDA(c,SUM(c))))
Cộng chuỗi theo chiều dọc SUMROW=LAMBDA(range,BYROW(range,LAMBDA(r,SUM(r))))
Lấy giá trị số cuối cùng trong dãy (bỏ qua 0 và ô rỗng)

LASTNUM=LAMBDA(range, TAKE(FILTER(range,(range<>0)*(range<>"")),-1))

FIRSTNUM=LAMBDA(range, TAKE(FILTER(range,(range<>0)*(range<>"")),1))

Bộ hàm đại số đầy đủ

SUMROW=LAMBDA(range,BYROW(range,SUM))

SUMCOL=LAMBDA(range,BYCOL(range,SUM))

AVERAGEROW=LAMBDA(range,BYROW(range,AVERAGE))

AVERAGECOL=LAMBDA(range,BYCOL(range,AVERAGE))

MAXROW=LAMBDA(range,BYROW(range,MAX))

MAXCOL=LAMBDA(range,BYCOL(range,MAX))

MINROW=LAMBDA(range,BYROW(range,MIN))

MINCOL=LAMBDA(range,BYCOL(range,MIN))

COUNTROW
=LAMBDA(range,BYROW(range,COUNT))

COUNTCOL=LAMBDA(range,BYCOL(range,COUNT))

COUNTAROW=LAMBDA(range,BYROW(range,COUNTA))

COUNTACOL=LAMBDA(range,BYCOL(range,COUNTA))

APPLYROW=LAMBDA(range,func,BYROW(range,func))

APPLYCOL=LAMBDA(range,func,BYCOL(range,func))

Hàm có điều kiện theo hàng / cột

SUMIFROW
=LAMBDA(range,cond_range,cond,
    BYROW(range,LAMBDA(r,
        SUM(IF(cond_range=cond,r))
    ))
)

SUMIFCOL
=LAMBDA(range,cond_range,cond,
    BYCOL(range,LAMBDA(c,
        SUM(IF(cond_range=cond,c))
    ))
)

COUNTIFROW
=LAMBDA(range,cond,
    BYROW(range,LAMBDA(r,
        COUNTIF(r,cond)
    ))
)

COUNTIFCOL
=LAMBDA(range,cond,
    BYCOL(range,LAMBDA(c,
        COUNTIF(c,cond)
    ))
)

Xử lý mảng thông minh

UNIQUECOUNTROW
=LAMBDA(range,
    BYROW(range,LAMBDA(r,COUNTA(UNIQUE(r))))
)

UNIQUECOUNTCOL
=LAMBDA(range,
    BYCOL(range,LAMBDA(c,COUNTA(UNIQUE(c))))
)

TOPNROW
=LAMBDA(range,n,
    BYROW(range,LAMBDA(r,LARGE(r,n)))
)

TOPNCOL
=LAMBDA(range,n,
    BYCOL(range,LAMBDA(c,LARGE(c,n)))
)

BOTTOMNROW
=LAMBDA(range,n,
    BYROW(range,LAMBDA(r,SMALL(r,n)))
)

BOTTOMNCOL
=LAMBDA(range,n,
    BYCOL(range,LAMBDA(c,SMALL(c,n)))
)

Hàm Pseudo-GROUPBY (nhóm + tính tổng)

GROUPSUM
=LAMBDA(keys,values,
    LET(
        u,UNIQUE(keys),
        sums,MAP(u,LAMBDA(k,SUM(FILTER(values,keys=k)))),
        HSTACK(u,sums)
    )
)

Hàm APPLY nâng cấp (cực mạnh)

APPLYROW
=LAMBDA(range,func,BYROW(range,func))

APPLYCOL
=LAMBDA(range,func,BYCOL(range,func))

APPLY
=LAMBDA(range,func,MAP(range,func))

PIVOT 2 chiều bằng công thức

🎯 Dùng khi có:

  • row_keys → Nhóm theo dòng

  • col_keys → Nhóm theo cột

  • values → Giá trị cần tính tổng

=PIVOTSUM(A2:A100,B2:B100,C2:C100)
 

👉 Trả về bảng pivot hoàn chỉnh (có header).

PIVOTSUM
=LAMBDA(row_keys,col_keys,values,
    LET(
        r,UNIQUE(row_keys),
        c,UNIQUE(col_keys),
        body,
            MAKEARRAY(
                ROWS(r),
                COLUMNS(c),
                LAMBDA(i,j,
                    SUMIFS(
                        values,
                        row_keys,INDEX(r,i),
                        col_keys,INDEX(c,j)
                    )
                )
            ),
        VSTACK(
            HSTACK("",c),
            HSTACK(r,body)
        )
    )
)

GROUPBY nhiều điều kiện

🎯 Dùng khi có 2–3 cột nhóm

=GROUPSUM2(A2:A100,B2:B100,C2:C100)
 

👉 Trả về:

| key1 | key2 | sum |

GROUPSUM2
=LAMBDA(key1,key2,values,
    LET(
        combo,UNIQUE(HSTACK(key1,key2)),
        sums,
            MAP(
                TAKE(combo,,1),
                TAKE(combo,,2),
                LAMBDA(k1,k2,
                    SUMIFS(values,key1,k1,key2,k2)
                )
            ),
        HSTACK(combo,sums)
    )
)

GROUPSUM3 (3 điều kiện)

GROUPSUM3
=LAMBDA(key1,key2,key3,values,
    LET(
        combo,UNIQUE(HSTACK(key1,key2,key3)),
        sums,
            MAP(
                TAKE(combo,,1),
                TAKE(combo,,2),
                TAKE(combo,,3),
                LAMBDA(k1,k2,k3,
                    SUMIFS(values,key1,k1,key2,k2,key3,k3)
                )
            ),
        HSTACK(combo,sums)
    )
)

GROUPBY đa năng (chuyên nghiệp nhất)

GROUPBY
=LAMBDA(keys,values,
    LET(
        u,UNIQUE(keys),
        sums,
            MAP(
                u,
                LAMBDA(k,
                    SUM(FILTER(values,keys=k))
                )
            ),
        HSTACK(u,sums)
    )
)

Hàm đánh số thứ tự theo nhóm

=LET(b,range,
    prev,VSTACK("",TAKE(b,ROWS(b)-1)),
    grp,SCAN(0,SEQUENCE(ROWS(b)),
        LAMBDA(a,i,
            IF(INDEX(b,i)=INDEX(prev,i),a,a+1))),
    idx,MAP(SEQUENCE(ROWS(b)),
        LAMBDA(i,
            COUNTIF(INDEX(b,1):INDEX(b,i),INDEX(b,i)))),
    grp&"."&idx)

PowerQuery

Công thức MCODE lấy giá trị trong bảng DataTable đưa vào làm tham số trong PowerQuery Excel.CurrentWorkbook(){[Name="ten_bang"]}[Content]{0}[ten_cot]   (trong đó 0 là số thứ tự dòng, bắt đầu từ dòng số 0)
   

Ký hiệu Regex thường dùng

 
Regex Ý nghĩa
. Bất kỳ ký tự nào
\d Chữ số (0-9)
\D Không phải số
\w Chữ, số, dấu gạch dưới
\W Không phải \w
\s Khoảng trắng
\S Không phải khoảng trắng
^ Bắt đầu chuỗi
$ Kết thúc chuỗi
+ 1 hoặc nhiều lần
* 0 hoặc nhiều lần
? 0 hoặc 1 lần
{n} Đúng n lần
{n,m} Từ n đến m lần
(...) Nhóm
| Hoặc
[ABC] A hoặc B hoặc C
[^ABC] Không phải A, B, C
   

 

×