Phil có một loạt các ô chứa văn bản. Một số văn bản quá dài, vì vậy anh ấy cần phải chia nó thành nhiều ô. Ví dụ, nếu một ô có chứa “con cáo nâu nhanh nhẹn” và anh ta cần tách văn bản để không phần nào dài hơn 12 ký tự, Phil có thể dễ dàng thực hiện điều đó. Nhưng anh ấy muốn đảm bảo rằng sự phân tách được thực hiện ở khoảng trống trước ký tự thứ 12, chứ không phải ở ký tự thứ 12 chính xác. Phil không biết làm thế nào để làm điều này.

Bạn có thể nghĩ rằng bạn có thể sử dụng công cụ Văn bản thành Cột trong Excel, nhưng nó không phù hợp cho công việc. Nếu bạn đặt công cụ để tách văn bản dựa trên các dấu phân cách, chẳng hạn như dấu cách, thì bạn sẽ chỉ có một từ duy nhất trong mỗi ô. Nếu bạn đặt công cụ để tách văn bản là “chiều rộng cố định”, thì công cụ này sẽ không chia các từ tại các khoảng trắng; nó chỉ đảm bảo rằng mỗi đoạn là bất kỳ kích thước nào bạn chỉ định.

Bạn có thể sử dụng một công thức để có được kết quả mong muốn, nhưng làm như vậy sẽ dẫn đến các công thức dài đáng kinh ngạc. Ví dụ: nếu văn bản quá dài nằm trong ô A3, công thức sau có thể được sử dụng để tách đoạn đầu tiên của văn bản đó, tại khoảng trắng trước ký tự thứ 12:

=IF(LEN($A3)>12,IF(ISERROR(FIND(" ",MID($A3,12,1)

&MID($A3,11,1)&MID($A3,10,1)&MID($A3,9,1)&MID($A3,8,1)

&MID($A3,7,1)&MID($A3,6,1)&MID($A3,5,1)&MID($A3,4,1)

&MID($A3,3,1)&MID($A3,2,1))),MID($A3,1,1),MID($A3,1, 13-FIND(" ",MID($A3,12,1)&MID($A3,11,1)&MID($A3,10,1)

&MID($A3,9,1)&MID($A3,8,1)&MID($A3,7,1)&MID($A3,6,1)

&MID($A3,5,1)&MID($A3,4,1)&MID($A3,3,1)&MID($A3,2,1))))

,RIGHT($A3,LEN($A3)))

Hãy nhớ — tất cả đây là một công thức duy nhất, chỉ để lấy đoạn đầu tiên. Các công thức để lấy phần thứ hai, thứ ba, thứ tư và sau đó thậm chí còn dài hơn. Rõ ràng, sử dụng một công thức có thể không phải là cách tốt nhất.

Điều này sẽ sử dụng macro. Một macro có thể kiểm tra chuỗi văn bản và dễ dàng cắt nó thành các phần có độ dài mong muốn. Hãy xem xét chức năng do người dùng định nghĩa sau:

Function SplitMe(sSentence As String, iPos As Integer, Optional iLen = 12)

Dim sSegments() As String     Dim iSegments As Integer     Dim sRest As String     Dim sTemp As String     Dim iSpace As Integer     Dim J As Integer

iSegments = 0     sRest = sSentence     sTemp = Left(sRest, iLen + 1)

Do Until Len(sTemp) <= iLen         iSpace = 0         For J = Len(sTemp) To 1 Step -1             If Mid(sTemp, J, 1) = " " And iSpace = 0 Then iSpace = J         Next J         If iSpace > 0 Then             sTemp = Left(sRest, iSpace - 1)

sRest = Mid(sRest, iSpace + 1)

Else             sRest = Mid(sRest, Len(sTemp) + 1)

End If         iSegments = iSegments + 1         ReDim Preserve sSegments(1 To iSegments)

sSegments(iSegments) = sTemp         sTemp = Left(sRest, iLen + 1)

Loop     iSegments = iSegments + 1     ReDim Preserve sSegments(1 To iSegments)

sSegments(iSegments) = sTemp     If iPos <= iSegments Then         SplitMe = sSegments(iPos)

Else         SplitMe = ""

End If End Function

Hàm nhận hai hoặc ba tham số. Tham số đầu tiên là chuỗi được chia nhỏ, thứ hai là đoạn bạn muốn từ chuỗi và tham số thứ ba (và tùy chọn) là độ dài mong muốn của mỗi đoạn. Nếu bạn bỏ qua tham số thứ ba, thì hàm giả sử bạn muốn mỗi đoạn có tối đa 12 ký tự. Ví dụ, giả sử rằng văn bản nằm trong ô A5, phần sau sẽ trả về đoạn thứ hai từ văn bản trong đó mỗi đoạn dài tối đa 12 ký tự:

=SplitMe(A5,2)

Hàm sẽ trả về kết quả tốt, miễn là mỗi từ trong chuỗi văn bản không dài hơn độ dài mục tiêu được chỉ định cho mỗi đoạn. Nếu đúng như vậy, thì bạn sẽ nhận được một số kết quả lạ, bao gồm một số đoạn không chứa đầy đủ các từ.

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (3899) áp dụng cho Microsoft Excel 97, 2000, 2002 và 2003.