Viết hàm nối mảng (3 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Chừng Tháng 3, tháng 4 gì đấy em có đọc được trên mạng về 14 hàm mới của excel 365 như : Textbefore/ Textafter/ textsplit/ Vstack/Hstack/Torow....
Các hàm sau đây thuộc về Office Insider Beta, phải đăng ký mới có:
- VStack, HStack
- TextBefore, TextAfter
- ToRow, ToCol
- ChooseRows, ChooseCols
- Take, Drop
- Expand
 
Chủ thớt cần được nhắc nhở: "viết hoa cả bài là vi phạm luật diễn đàn"
 
Nếu đã xài 365 thì xài hàm mảng 365. Định dạng table cho 2 vùng có tên Data1 và Data2

=LET(d_1,Data1,d_2,Data2,r_1,ROWS(d_1),r_2,ROWS(d_2),r_0,r_1+r_2,IF(SEQUENCE(r_0)<=r_1,INDEX(d_1,SEQUENCE(r_1),{1,2}),INDEX(d_2,SEQUENCE(r_0)-r_1,{1,2})))

Nếu có hàm VStack thì càng đơn giản:

=VSTACK(Data1,Data2)

View attachment 278832

View attachment 278833

Nối 3, 4 bảng chỉ cần liệt kê

View attachment 278835
Cảm ơn anh
Nếu đã xài 365 thì xài hàm mảng 365. Định dạng table cho 2 vùng có tên Data1 và Data2

=LET(d_1,Data1,d_2,Data2,r_1,ROWS(d_1),r_2,ROWS(d_2),r_0,r_1+r_2,IF(SEQUENCE(r_0)<=r_1,INDEX(d_1,SEQUENCE(r_1),{1,2}),INDEX(d_2,SEQUENCE(r_0)-r_1,{1,2})))

Nếu có hàm VStack thì càng đơn giản:

=VSTACK(Data1,Data2)

View attachment 278832

View attachment 278833

Nối 3, 4 bảng chỉ cần liệt kê

View attachment 278835
Em cảm ơn anh rất nhiều. Anh có thể hướng dẫn thêm trong trường hợp nối 3 bảng thì sử dụng hàm này như thế nào không ah?
 
Anh có thể hướng dẫn thêm trong trường hợp nối 3 bảng thì sử dụng hàm này như thế nào không ah?
Viết 1 hàm Lambda trong name manager như sau:
Mã:
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})))

Viết công thức:

=Append(Append(Data1,Data2),Data3)

Bốn bảng thì lồng thêm ra ngoài.

1657855402590.png

1657855463166.png
 
Viết 1 hàm Lambda trong name manager như sau:
Mã:
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})))

Viết công thức:

=Append(Append(Data1,Data2),Data3)

Bốn bảng thì lồng thêm ra ngoài.

View attachment 278883

View attachment 278884
Em thử rồi hàm Append kết hợp Lambda này nhưng không được anh ạ (https://tinyurl.com/mergetable), nhưng đánh giá hàm LET thì linh hoạt hơn vì trong đó có tham số lựa chọn được cột thứ tự cần hiển thị. Nếu được anh giúp em code nối 3 bảng để em hiểu được quy tắc ạ.
 
Em thử rồi hàm Append kết hợp Lambda này nhưng không được anh ạ (https://tinyurl.com/mergetable), nhưng đánh giá hàm LET thì linh hoạt hơn vì trong đó có tham số lựa chọn được cột thứ tự cần hiển thị. Nếu được anh giúp em code nối 3 bảng để em hiểu được quy tắc ạ.
Bạn cần xác định hàm Lambda có tồn tại trong Excel của bạn hay không.

1657859754074.png

Thứ tự cột cần hiển thị thì Let và Lambda như nhau, chả có "linh hoạt hơn" gì sất.
 
Này thì Let 3 bảng, số lượng cột bất kỳ

Mã:
=LET(d_1,Data1,d_2,Data2,d_3,Data3,c,SEQUENCE(1,COLUMNS(d_1)),r_1,ROWS(d_1),r_2,ROWS(d_2),r_3,ROWS(Data3),
r_0,r_1+r_2+r_3,IF(SEQUENCE(r_0)<=r_1,INDEX(d_1,,c),
IF(SEQUENCE(r_0)<=(r_1+r_2),INDEX(d_2,SEQUENCE(r_0)-r_1,c),
INDEX(d_3,SEQUENCE(r_0)-r_1-r_2,c))))
Tôi ghét dùng Let ở trường hợp này vì không tổng quát. Nhiều hơn 3 bảng thì phải viết lại, càng nhiều bảng công thức càng dài và càng khó kiểm soát.
 
Lần chỉnh sửa cuối:
Nếu Bác dùng hàm FormulaBeautify trong Add-in trong phần tài nguyên Diễn đàn thì hàm sẽ được phân tích dễ đọc, dễ sửa.

Và dùng FormulaMinify để thu gọn hàm.

JavaScript:
=LET(
          d_1,
          Data1,
          d_2,
          Data2,
          d_3,
          Data3,
          c,
          SEQUENCE(
                    1,
                    COLUMNS(d_1)
          ),
          r_1,
          ROWS(d_1),
          r_2,
          ROWS(d_2),
          r_3,
          ROWS(Data3),
          r_0,
          r_1 + r_2 + r_3,
          IF(
                    SEQUENCE(r_0) <= r_1,
                    INDEX(
                              d_1,
                              ,
                              c
                    ),
                    ,
                    IF(
                              SEQUENCE(r_0) <= (r_1 + r_2),
                              INDEX(
                                        d_2,
                                        SEQUENCE(r_0)-r_1,
                                        c
                              ),
                              ,
                              INDEX(
                                        d_3,
                                        SEQUENCE(r_0)-r_1 - r_2,
                                        c
                              )
                    )
          )
)
 
Lần chỉnh sửa cuối:
Nếu Bác dùng hàm FormulaBeautify trong Add-in trong phần tài nguyên Diễn đàn thì hàm sẽ được phân tích dễ đọc, dễ sửa.
Viết trong Notepad ++ cũng được, nhưng tại tánh tôi không thích. (Excel chấp nhận công thức xuống dòng không cần collapse)
 
...
Tôi ghét dùng Let ở trường hợp này vì không tổng quát....
Hai từ: tầm vực.
Tầm vực của Let là công thức. Của Lambda là Workbook. Chính vì chuyện này mà MS không dám đưa thẳng nó ra từ đầu (xem bài tôi nói về "có những cái thảy ra vô tư nhưng có những cái thảy là vô trách nhiệm")

Một trong những điểm mạnh của Lambda là đệ quy. Thời buổi bi giờ query và đệ quy là hướng phát triển của ngôn ngữ.
 
Hai từ: tầm vực.
...
Một trong những điểm mạnh của Lambda là đệ quy. Thời buổi bi giờ query và đệ quy là hướng phát triển của ngôn ngữ.
Chính vì vậy nên bài 25 tôi viết lambda cho 2 bảng, sau đó 3, 4, 5 bảng gì thì lồng hàm. Chứ viết công thức Let thì cứ tăng thêm 1 bảng thì phải viết lại 1 công thức, dài ngoằng.
Tôi còn đang nghĩ cách đệ quy nhưng bài này khó: Chưa biết paramarray phải viết như thế nào.
 
Tôi xem lại thì Excel online có hàm Lambda nhưng không có Name Manager, mặc dù Name đã được tạo trước trên Excel offline, khi mở bằng Excel online thì lỗi #Name?
Có thể viết = LAMBDA( ...)(Data1, Data2) như hình

1657898025185.png

Nếu 3 bảng thì viết lồng như hình sau: (xem trong file online). Nhưng nhìn cũng thấy ghét.

1657898112418.png
 
Web KT

Bài viết mới nhất

Back
Top Bottom