Pieter có rất nhiều ô trong cột A chứa văn bản. Cụ thể, mỗi ô chứa một số câu văn bản. Anh ấy muốn tách các câu thành các ô riêng lẻ. Anh ấy biết mình có thể sử dụng công cụ Text to Columns, nhưng điều đó không hoàn toàn hữu ích vì các câu có thể kết thúc bằng các dấu câu khác nhau và một số dấu câu có thể được sử dụng ở giữa câu. (Chẳng hạn như một dấu chấm sau một tiêu đề như Ông hoặc Bà) Pieter tự hỏi liệu có cách nào tốt hơn để chia các câu thành các ô khác nhau.

Để hoàn thành nhiệm vụ này theo cách thủ công, bạn có thể thực hiện một số cách.

Trước tiên, bạn có thể sử dụng cột trợ giúp để làm việc với dữ liệu của mình. Ví dụ: bạn có thể đặt công thức này vào ô B1:

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"Mr.", "Mr#"), "Mrs.", "Mrs#"), "Ms.", "Ms#")

Sau đó, sao chép công thức xuống bất kỳ ô nào cần thiết. Những gì bạn kết thúc là các chức danh thông thường của bạn (Ông, Bà và Bà) được thay thế bằng một chuỗi ký tự duy nhất (Ông #, Bà # và Bà #). Sao chép kết quả của cột B trở lại cột B dưới dạng giá trị (vì vậy công thức bị loại bỏ), rồi sử dụng Văn bản thành Cột trên cột B. Cuối cùng, sử dụng Tìm và Thay thế để thay đổi tất cả các phiên bản của ký tự # thành dấu chấm.

Hạn chế của điều này là công thức chỉ tính đến ba mục đích sử dụng phổ biến trong khoảng thời gian, nơi bạn có thể cần thực sự xử lý thêm một số. Ví dụ: câu của bạn có thể có tiêu đề như Tiến sĩ hoặc các chỉ số xác thực như Ph.D. hoặc Esq. Danh sách các từ viết tắt theo chu kỳ như vậy có thể khá dài. Trong những trường hợp đó, bạn có thể thực hiện các thay đổi theo cách thủ công theo cách này:

  1. Sử dụng Tìm và Thay thế để tìm kiếm tất cả các dấu chấm trong văn bản của bạn, thay thế các dấu chấm không phải ở đầu câu bằng ký tự đánh dấu (# trong kỹ thuật trên).

  2. Sử dụng công cụ Text to Columns để tách các câu.

  3. Sử dụng Tìm và Thay thế để thay đổi tất cả các trường hợp của ký tự đánh dấu trở lại một dấu chấm.

Một lần nữa, nếu bạn có nhiều khoảng thời gian không kết thúc câu, quá trình này có thể mất khá nhiều thời gian để hoàn thành.

Tất nhiên, những cách tiếp cận này giải quyết những gì thực sự là một chủ đề phức tạp.

Câu hỏi thực sự là làm thế nào để định nghĩa một câu? Trong tiếng Anh, chỉ có ba dấu câu kết thúc một câu — dấu chấm, dấu chấm than và dấu chấm hỏi. Tuy nhiên, có những biến thể và ngoại lệ đối với điều này. Ví dụ: một câu có thể kết thúc bằng dấu ngoặc kép, nhưng dấu ngoặc kép đó sẽ luôn có một trong ba dấu chấm kết thúc ở phía trước. Ngoài ra, một dấu chấm có thể được sử dụng để đánh dấu một chữ viết tắt, như đã được lưu ý.

Nếu bạn bắt đầu sử dụng Tìm và Thay thế để giải quyết tất cả các dấu câu và ngoại lệ này, thì bạn có thể nhanh chóng gặp phải một loạt các bước phức tạp. Tốt hơn là bạn nên thử thực hiện việc phân tách bằng macro. Đây là một trong những sẽ xử lý hầu hết các câu và chữ viết tắt đúng cách:

Sub SplitSentences()

Dim c As Range     Dim sException(8) As String     Dim sReplacement(8) As String     Dim sTerm(6) As String     Dim sTemp As String     Dim J As Integer     Dim sExp As Variant

' These are the valid ways for a sentence to end     sTerm(1) = ". "

sTerm(2) = "! "

sTerm(3) = "? "

sTerm(4) = "." & Chr(34)

sTerm(5) = "!" & Chr(34)

sTerm(6) = "?" & Chr(34)



' These are the exceptions to the rule     ' of a period ending a sentence     sException(1) = "Mr."

sException(2) = "Mrs."

sException(3) = "Ms."

sException(4) = "Dr."

sException(5) = "Esq."

sException(6) = "Ph.D."

sException(7) = "a.m."

sException(8) = "p.m."



' Set up the replacements for the exceptions     For J = 1 To 8         sReplacement(J) = Replace(sException(J), ".", "[{}]")

Next J

For Each c In Selection         sTemp = c.Value

' Convert all the exceptions         For J = 1 To 8             sTemp = Replace(sTemp, sException(J), sReplacement(J))

Next J

' Demarcate sentences with a tab         For J = 1 To 6             sTemp = Replace(sTemp, sTerm(J), Trim(sTerm(J)) & Chr(9))

Next J

' Split sentences into an array         sExp = Split(sTemp, Chr(9))

For J = 0 To UBound(sExp)

' Replace the code for valid periods             sExp(J) = Replace(sExp(J), "[{}]", ".")

' Place sentences into adjacent cells on row             c.Offset(0, J).Value = Trim(sExp(J))

Next J     Next c End Sub

Lưu ý rằng các phần cuối câu có thể chấp nhận được được ghi chú trong mảng sTerm và các chữ viết tắt được chấp nhận nằm trong mảng sException. Nếu văn bản của bạn có thể có các chữ viết tắt khác, thì bạn sẽ muốn mở rộng mảng sException để bao gồm các chữ viết tắt đó.

Macro bước qua bất kỳ ô nào bạn đã chọn và thay thế tất cả các ngoại lệ được chấp nhận. Sau đó, nó thay thế tất cả các kết thúc câu có thể chấp nhận được bằng kết thúc đó theo sau là ký tự tab.

Sau đó, nó tách các câu ra dựa trên vị trí của ký tự tab. Cuối cùng, nó khôi phục tất cả các khoảng thời gian hợp lệ có trong chữ viết tắt và đặt các câu trên các ô liền kề trong cùng một hàng.

Lưu ý rằng macro thay thế bất kỳ thứ gì có trong các ô đã chọn và tuy nhiên, cần có nhiều ô ở bên phải vùng chọn để lưu trữ các câu. Bởi vì điều này, bạn có thể muốn đảm bảo rằng bạn lưu trang tính ban đầu của mình trước khi chọn một phạm vi ô và chạy macro.

Cuối cùng, bạn có thể muốn lưu ý rằng macro không hoàn hảo. Từ quan điểm của một nhà ngữ pháp học, việc viết tắt để kết thúc một câu là hoàn toàn có thể chấp nhận được. Khi điều này xảy ra, dấu câu thích hợp cho biết dấu chấm cuối cùng trong chữ viết tắt cũng đóng vai trò là dấu chấm kết thúc cho câu, như trong hai câu ngắn sau:

Sheila earned her Ph.D. She was very happy.

Bây giờ, hãy xem xét câu đơn sau:

Sheila earned her Ph.D. from an Ivy League school.

Khi bạn so sánh hai ví dụ (hai câu với câu đơn), không có cách nào để phân biệt, theo chương trình, giữa nếu Ph.D. kết thúc một câu hoặc nếu nó xảy ra ở giữa câu mà không kiểm tra xem từ sau có bắt đầu bằng chữ hoa hay dấu ngoặc kép theo sau là chữ hoa hay không. Điều này có thể trở nên khá phức tạp rất nhanh chóng. Thêm vào đó, điều này áp dụng cho tất cả các từ viết tắt, không chỉ Ph.D. Thay vì cố gắng dự đoán và đối phó với tất cả các lần xuất hiện như vậy, macro được lưu ý ở trên thậm chí không cố gắng phân biệt liệu một chữ viết tắt có kết thúc một câu hay không — nó chỉ đơn giản coi tất cả các chữ viết tắt như thể chúng xuất hiện ở giữa câu.

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

Mẹo này (12549) áp dụng cho Microsoft Excel 2007, 2010, 2013, 2016, 2019 và Excel trong Office 365.