Code tốt

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

   

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

Hàm lấy địa chỉ dữ liệu để truy vấn RNG=LAMBDA(x,SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(FORMULATEXT(x),"!","$"),"'",""),"=N(","["),")","]"))
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)))
XLOOKUPS =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))))
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)
    )
)

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)
   

Code VBA

 

×