Hàm LAMBDA trong Excel 365

Liên hệ QC

Hàm LAMBDA trong Excel 365​


Chào các bạn. Mình xin giới thiệu hàm mới được đưa vào Excel 365 phiên bản thử nghiệm beta channel, sẽ đưa vào Excel 365 chính thức trong tương lai gần. Hàm LAMBDA dùng để xây dựng hàm tự tạo (UDF) bằng công thức, qua đó rút ngắn công thức phức tạp sử dụng nhiều lần.
Cú pháp:
Mã:
=LAMBDA([parameter1, parameter2, …,] calculation)
Các tham số parameter1, 2... là tùy chọn, có thể đến 253 tham số, calculation là biểu thức cần tính toán (thân hàm tự tạo). Có thể nhập công thức này trên sheet nhưng đơn giản nhất là tạo Name: bấm Ctrl-Alt-F3 để tạo name mới, đặt tên hàm vào ô Name, chọn phạm vi, comment (comment này sẽ là hướng dẫn khi gõ công thức), nhập công thức vào refer to. Hàm LAMBDA cho phép gọi đệ quy mà không bị lỗi tham chiếu vòng.
- Ví dụ 1: tạo hàm Add1 có tác dụng đơn giản tăng 1 vào biến: đặt Name=Add1, Refer to =LAMBDA(x,x+1). Trên sheet ta nhập công thức =Add1(A1);
- Ví dụ 2 minh họa đệ quy, xây dựng hàm FIBO trả về số hạng thứ n của dãy Fibonacci (F(1)=F(2)=1, F(n+2)=F(n+1)+F(n)): đặt name=FIBO, Refer to điền công thức:
=LAMBDA(n, IF(n<3,1,FIBO(n-1)+FIBO(n-2)))
- Ví dụ 3: mình xây dựng hàm giải phương trình bậc 2 nhận 3 tham số a, b, c. Nếu a=0 thì hàm trả về lỗi #NUM (không rõ có hàm nào trả về lỗi này không nên mình gọi hàm SQRT(-1)), nếu delta<0 sẽ trả về lỗi #N/A, còn lại sẽ trả về hai nghiệm:
Mã:
=LAMBDA(a,b,c,IF(a=0,SQRT(-1),LET(d,b*b-4*a*c,IF(d<0,NA(),({-1,1}*SQRT(d)-b)/2/a))))
Công thức trên sử dụng hàm LET để không phải tính lại d (delta) nhiều lần để tăng tốc độ (nghe nói vậy). {-1,1} là mảng để tính toán x1, x2 trả về 2 ô cùng dòng, nếu muốn trả về 2 ô cùng cột thì thay bằng {-1;1}
Cách sử dụng: nhập công thức vào A1 = GPTB2(1,2,0), A1 và B1 sẽ chứa 2 nghiệm.
 

File đính kèm

  • LAMBDA_Formula.xlsx
    9.7 KB · Đọc: 82
Chỉnh sửa lần cuối bởi điều hành viên:
Bạn cần giải thích ý nghĩa của Lambda trogn ngữ cảnh lập trình.
Biết căn bản ý nghĩa của từ này thì sẽ dễ hiểu cách sử dụng.
 
Em không chuyên nên không thể giải thích được. Em chỉ hiểu là trong lập trình hàm, biểu thức lambda tương tự như một phép biến đổi, nhận các tham số đầu vào rồi trả lại kết quả. Hàm (phép biến đổi) này có thể sử dụng làm tham số cho hàm khác.
 
Em không chuyên nên không thể giải thích được. Em chỉ hiểu là trong lập trình hàm, biểu thức lambda tương tự như một phép biến đổi, nhận các tham số đầu vào rồi trả lại kết quả. Hàm (phép biến đổi) này có thể sử dụng làm tham số cho hàm khác.
Đại khái thì bạn có thể tạm giải thích như vậy. Nếu bạn nào khác muốn hiểu sâu hơn ở điểm nào thì sẽ đặt câu hỏi vào điểm ấy, và từ câu hỏi ấy bạn sẽ tự tìm ra cách trả lời.
 
Em không chuyên nên không thể giải thích được. Em chỉ hiểu là trong lập trình hàm, biểu thức lambda tương tự như một phép biến đổi, nhận các tham số đầu vào rồi trả lại kết quả. Hàm (phép biến đổi) này có thể sử dụng làm tham số cho hàm khác.
LAMDA trong như lập trình hàm không tên - hàm trực tiếp, cho tính toán trực tiếp
Thường được sử dụng dùng 1 lần trực tiếp. Trong 1 số ngôn ngữ lập trình có kiểu LAMDA này
 
Mình đang xài office 365 mới thử Gõ =LAMBDA mà không thấy Hàm chắc đang thử nghiệm thời gian sau mới có quá

Office 365 rất nhiều cái hay mà chưa khám phá ra vì người sử dụng nó còn quá ít ... vài năm nữa chắc xài nhiều họ sẻ khám phá ra nhiều cái hay
 
Mình đang xài office 365 mới thử Gõ =LAMBDA mà không thấy Hàm chắc đang thử nghiệm thời gian sau mới có quá

Office 365 rất nhiều cái hay mà chưa khám phá ra vì người sử dụng nó còn quá ít ... vài năm nữa chắc xài nhiều họ sẻ khám phá ra nhiều cái hay
Bạn đăng ký Office insider (trong File - Account), chọn Beta channel rồi cập nhật là có.
 
Trước hết, phải xác định lại Lambda là λ (1 ký tự Hy lạp như anpha, béta, gamma, epsilon) tương đương phụ âm L của mẫu tự la tinh, chứ không phải điệu nhảy lam ba da
Thử ứng dụng hàm Lambda rộng hơn: Tính tổng theo danh mục và sắp xếp theo cột tổng của dữ liệu bất kỳ
Cách sử dụng giống như hàm tư tạo bằng VBA
Nếu kết quả mảng thì chỉ cần công thức tại 1 ô duy nhất
Name:
Mã:
SumSort =LAMBDA(a,num,c,SORT(CHOOSE({1,2},UNIQUE(a),SUMIF(a,UNIQUE(a),num)),2,c))
Ý nghĩa:
a = cột tiêu chí cần tính tổng sau khi lọc duy nhất
num = cột số liệu cần tính tổng
c = 1 hoặc -1 là tham số sắp xếp tăng dần hay giảm dần của hàm SORT
choose({1,2}, giá trị 1, giá trị 2) là 2 côt kết quả: 1 cột là danh mục duy nhất, 1 cột là kết quả sumif theo danh mục.

1. Tổng doanh số bán:
- theo nhóm mặt hàng (tăng dần, giảm dần)

1616750141914.png

- theo mặt hàng

1616750203705.png

2. Tính tổng lương theo phòng ban, theo công trình

1616750447348.png
 

File đính kèm

  • Lambda Function 01.xlsx
    17.7 KB · Đọc: 74
Lần chỉnh sửa cuối:
Hàm LAMBDA lồng nhau
Với hàm SumSort ở bài #8, nếu muốn trích những dòng đã tính toán bởi SumSort với giá trị lớn hơn 1 số N, mà không muốn phá hàm cũ, ta có thể tạo hàm mới lồng hàm cũ vào trong:
Mã:
SumFilterAmt =LAMBDA(a,num,c,numcri,FILTER(SumSort(a,num,c),INDEX(SumSort(a,num,c),,2)>numcri))

Với dữ liệu của file bài
#8, có thể test:
K10 =SumFilterAmt(Sales[Mặt hàng],Sales[Thành tiền],1,L8)
Với L8 là tham số lọc giá trị

1616834476100.png

Nếu muốn rộng hơn, lọc lớn hơn hay nhỏ hơn tuỳ ý, thì thêm 1 đối số:


Mã:
SumFilterAmt =LAMBDA(a,num,c,numcri,cri,FILTER(SumSort(a,num,c),
IF(cri=">",INDEX(SumSort(a,num,c),,2)>numcri,INDEX(SumSort(a,num,c),,2)<numcri)))

1616835108948.png

Nếu K8 là 1 validation chọn giữa < và > thì gọn hơn nữa: Chỉ cần sửa K8 và/ hoặc L8 là công thức chạy lại

1616835264642.png
 
Lần chỉnh sửa cuối:
Hàm Lambda lồng và đệ quy

Giả sử có bảng dữ liệu theo cột như sau:

1618651967974.png

Giờ ta muốn:
1. Lấy dữ liệu theo tháng (có thể dùng let hoặc Index), ở đây tôi viết Index nhưng lồng vào Lambda
Mã:
GetColData =LAMBDA(dta,cn,mth,CHOOSE({1,2},INDEX(dta,,cn),INDEX(dta,,mth+2)))

1618652415846.png

2. Chuyển dữ liệu thành hàng dọc, muốn lấy bao nhiêu tháng tuỳ ý
2.1. Bước 1:
Viết hàm lấy dữ liệu 1 tháng bất kỳ có 1 cột thông số tháng đó

Mã:
GetMthData =LAMBDA(dta,mths,mth,CHOOSE({1,2,3},INDEX(dta,,2),
INDEX(mths,1,mth),INDEX(dta,,mth+2)))

1618652854367.png

2.2. Bước 2:
Viết hàm nối 2 bảng cùng cấu trúc (3 cột) (hàm Append2)
Mã:
Append2 =LAMBDA(data1,data2,IF(SEQUENCE(ROWS(data1)+ROWS(data2))<=ROWS(data1), 
CHOOSE({1,2,3},INDEX(data1,,1),INDEX(data1,,2),INDEX(data1,,3)),
CHOOSE({1,2,3},INDEX(data2,SEQUENCE(ROWS(data1)+ROWS(data2))- ROWS(data1),1),
INDEX(data2,SEQUENCE(ROWS(data1)+ROWS(data2))-ROWS(data1),2),
INDEX(data2,SEQUENCE(ROWS(data1)+ROWS(data2))-ROWS(data1),3))))

2.3. Bước 3:
Viết hàm đệ quy lấy n tháng (hàm Append)
- Nếu lấy 2 tháng (n=2) thì dùng hàm bước 2 Append2 nối 2 bảng tháng 1 và 2, mỗi tháng lấy bằng hàm ở bước 1 GetMthData
- Nếu n> 2: Dùng hàm bước 2, nối Append của n-1, và hàm GetMthData của tháng n
Mã:
=LAMBDA(n,IF(n=2,Append2(GetMthData(Data,Data[[#Headers],[Tháng 1]:[Tháng 12]],1),
GetMthData(Data,Data[[#Headers],[Tháng 1]:[Tháng 12]],n)),
Append2(Append(n-1),GetMthData(Data,Data[[#Headers],[Tháng 1]:[Tháng 12]],n))))

Kết quả: Giống như dùng power query - Unpivot, nhưng thuận tiện hơn là muốn lấy bao nhiêu cột cũng được (từ 2 đến 12)

1618653457695.png
 

File đính kèm

  • Lambda002.xlsx
    17.3 KB · Đọc: 34
Lần chỉnh sửa cuối:
trước tết có ngồi cafe với NDU và nói về hàm này . về gõ lamda không có tưởng là chưa cập nhật nên thôi
ai ngờ bản 365 cho enterprise là không có hàm này. chỉ có bản family hoặc personal mới có.
mới mua bản này 1 năm có liền
1618987696989.png
 
trước tết có ngồi cafe với NDU và nói về hàm này . về gõ lamda không có tưởng là chưa cập nhật nên thôi
ai ngờ bản 365 cho enterprise là không có hàm này. chỉ có bản family hoặc personal mới có.
mới mua bản này 1 năm có liền
Có rồi thì nghiên kíu và chia sẻ nha chị ơi
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom