Công thức Excel: LAMBDA thay thế các ký tự đệ quy
Công thức Excel: LAMBDA thay thế các ký tự đệ quy

Công thức chung
=LAMBDA(str,chars,sub,
  IF(chars="",str,
    ReplaceChars(
      SUBSTITUTE(str,LEFT(chars),sub),
      MID(chars,2,LEN(chars)-1),
      sub
    )
  )
)
Tóm lược

Các Hàm LAMBDA có thể được sử dụng để tạo một hàm tùy chỉnh để thay thế các ký tự. Trong ví dụ được hiển thị, ô C5 chứa hàm LAMBDA tùy chỉnh “ReplaceChars”:

=ReplaceChars(B5,"!@#$%^&*()[]<>-?.,","")

Hàm ReplaceChars được thiết kế để chấp nhận ba tham số đầu vào: str là văn bản để thực hiện thay thế, ký tự là một chuỗi văn bản chứa các ký tự cần thay thế và phụ là ký tự (hoặc các ký tự) để thay thế khi một ký tự được tìm thấy. Trong ví dụ được hiển thị, ReplaceChars được định cấu hình để tìm các ký tự dấu câu được thấy trong đối số thứ hai (ký tự), và thay thế chúng bằng một chuỗi trống (“”). Công thức LAMBDA tùy chỉnh này minh họa một tính năng được gọi là đệ quy, trong đó một hàm gọi chính nó.

Lưu ý: Hàm LAMBDA có sẵn thông qua kênh beta của Excel 365 chỉ có.

Giải trình

Các Hàm LAMBDA có thể được sử dụng để tạo các hàm tùy chỉnh, có thể sử dụng lại trong Excel. Ví dụ này minh họa một tính năng được gọi là đệ quy, trong đó một hàm gọi chính nó. Đệ quy có thể được sử dụng để tạo mã thanh lịch, nhỏ gọn, không thừa. Tuy nhiên, nhược điểm của các hàm LAMBDA đệ quy như hiện nay là chúng không dễ kiểm tra. Điều này là do chúng không thể được gỡ lỗi trực tiếp trên trang tính, vì LAMBDA chung chung (không được đặt tên) chưa có tên và do đó không thể gọi chính nó.

Khi tạo một công thức LAMBDA đệ quy, điều quan trọng cần quan tâm là công thức sẽ “thoát” ra khỏi vòng lặp mà nó thực hiện bằng cách gọi chính nó như thế nào. Một cách tiếp cận phổ biến là làm cạn kiệt một tham số đầu vào mỗi khi công thức tự gọi, sau đó kiểm tra xem đầu vào đã cạn hoàn toàn trước mỗi lần gọi hay chưa và thoát ra nếu có. Bằng cách này, tham số đầu vào hoạt động giống như một bộ đếm, đếm ngược đến không.

Đây là cách tiếp cận được thực hiện trong công thức này – ký tự tham số hoạt động giống như một bộ đếm và một ký tự bị xóa mỗi khi công thức tự gọi nó. Trước cuộc gọi đệ quy, Hàm IF được sử dụng để kiểm tra xem ký tự trống rỗng. Nếu vậy, công thức trả về giá trị hiện tại cho str là kết quả cuối cùng và thoát ra. Nếu không, công thức tự gọi:

=LAMBDA(str,chars,sub,
  IF(chars="",str, // test and exit if needed
    REPLACECHARS( // recurse
      SUBSTITUTE(str,LEFT(chars),sub),
      MID(chars,2,LEN(chars)-1),
      sub
    )
  )
)

Việc thay thế thực tế các ký tự có tên trong ký tự với giá trị là phụ được xử lý bởi Hàm SUBSTITUTE đây:

SUBSTITUTE(str,LEFT(chars),sub)

SUBSTITUTE chỉ có thể thực hiện một lần thay thế tại một thời điểm, đó là lý do tại sao công thức này là đệ quy. Thông số str ban đầu là chuỗi văn bản được cung cấp cho hàm để thay thế ký tự, nhưng lưu ý rằng giá trị này có thể thay đổi mỗi khi hàm gọi chính nó. Nhân vật cần thay thế được cung cấp bởi Hàm LEFT:

LEFT(chars) // get first character of chars

Giá trị sử dụng để thay thế đến từ phụ. Mẹo để hiểu công thức là xem kết quả từ SUBSTITUTE được sử dụng trực tiếp để gọi hàm ReplaceChars và kết quả này trở thành “tiếp theo” str tham số. Ngoài ra, mỗi khi ReplaceChars được gọi, chuỗi ký tự bị cạn kiệt bởi một ký tự với Hàm MIDvà kết quả từ MID trở thành giá trị tiếp theo cho ký tự được sử dụng trong lệnh gọi tới ReplaceChars.

MID(chars,2,LEN(chars)-1) // remove first character of chars

Một lần ký tự đã bị cạn kiệt hoàn toàn (tức là trở thành một chuỗi trống), kiểm tra logic bên trong hàm IF trả về TRUE và công thức trả về giá trị hiện tại của str như một kết quả cuối cùng.

Mở rộng công thức

Các chức năng LAMBDA tùy chỉnh hoạt động giống như các chức năng khác, vì vậy có thể dễ dàng mở rộng chức năng bằng cách làm tổ. Ví dụ: bạn có thể loại bỏ dấu chấm câu và thay thế bằng ký tự khoảng trắng (“”), sau đó dọn dẹp mọi thứ bằng cách lồng các ReplaceChars vào bên trong Hàm TRIM như thế này:

=TRIM(ReplaceChars(B5,"!@#$%^&*()[]<>-?.,"," "))

Hàm TRIM sẽ trả về khoảng trắng ở đầu và cuối, đồng thời chuẩn hóa khoảng trắng giữa các từ thành một khoảng trắng. Điều này sẽ tránh được vấn đề các từ được kết hợp khi chúng chỉ được phân tách bằng dấu câu.

Bạn có thể tìm thêm thông tin chung về chức năng LAMBDA đây.

https://exceljet.net/formula/lambda-replace-characters-recursive