Hàm Lambda Append ở bài 15 chạy đúng và sử dụng gọn, chỉ cần viết công thức =Append(n) là nối n cột thành dòng. Như vậy hàm này không sử dụng linh hoạt cho mọi bảng dữ liệu cần chuyển cột thành dòng, mỗi bảng khác nhau phải viết 1 hàm GetColData và 1 hàm Append cho dữ liệu mới.
Cải tiến lại để có thể dùng 1 hàm cho mọi bảng sữ liệu dạng nhiều cột dữ liệu cần chuyển thành hàng dọc, nhiều cột tiêu đề (cần lấy 1):
1.
Hàm GetColData (lấy bảng 3 cột cho 1 cột dữ liệu bất kỳ) sửa lại
từ
GetMthData =LAMBDA(dta,mths,mth,CHOOSE({1,2,3},INDEX(dta,,2),INDEX(mths,1,mth),INDEX(dta,,mth+2)))
thành
GetColData =LAMBDA(dta,cols,col,t,CHOOSE({1,2,3},INDEX(dta,,t),INDEX(cols,1,col),INDEX(dta,,COLUMNS(dta)-COLUMNS(cols)+col)))
trong đó
- dta = nguyên bảng dữ liệu
- cols = dòng tiêu đề của riêng các cột cần chuyển thành dòng
- col = số thứ tự cột cần lấy trong cols
- t = số thứ tự cột tiêu đề dòng cần lấy (mới thêm)
2. Hàm Append2 đổi tên thành hàm Append3Cols mang ý nghĩa là nối 2 bảng có 3 cột.
3. Hàm Append thay đổi khá nhiều nhưng cùng thuật toán đệ quy:
sửa từ
Append =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))))
thành
Append =LAMBDA(dta,dtahead,n,x,IF(n=2,Append3Cols(GetColData(dta,dtahead,1,x),GetColData(dta,dtahead,n,x)),Append3Cols(Append(dta,dtahead,n-1,x),GetColData(dta,dtahead,n,x))))
- Nhận tất cả tham số từ người dùng, truyền vào hàm GetColData, thay vì gắn cứng tham số trong hàm Append. Điều này làm cho hàm Append có thể dùng nhiều lần cho những bảng dữ liệu khác nhau, số lượng cột khác nhau.
- Tham số dta là nguyên bảng dữ liệu
- dtahead là dòng tiêu đề của những cột chứa dữ liệu muốn chuyển thành dòng
- n = số cột cần lấy,
- x = số thứ tự cột tiêu đề muốn lấy (chỉ lấy 1)
4. Cách viết công thức
N3 =Append(Data2,Data2[[#Headers],[Store 1]:[Store 9]],4,2)
Lấy 4 cột (từ Sore 1 đến Store 4) và lấy cột tiêu đề 2 (Category)
Nếu cột thứ nhất (tiêu đề dòng) là 1 validation chọn từ list {Type, Category, Product} và số cột cần chuyển thành dòng gắn vào 1 ô, thì viết thành công thức:
Title là range 1 dòng 3 cột chứa 3 mục chọn tiêu đề dòng

__________________________
FIle đính kèm có sheet so sánh hàm Lambda và Power query:
- Power query chỉ có thể chuyển tất cả cột thành dòng, không có tùy chọn lấy chỉ 1 số cột, không tùy chọn tiêu đề dòng
- Dữ liệu rỗng sẽ bị Power query bỏ qua, còn hàm Lambda chuyển thành số 0 và vẫn hiển thị 1 dòng.
