Xóa ngày trong chuỗi văn bản (Microsoft Excel)
Karan có rất nhiều dữ liệu dạng văn bản trong một sổ làm việc. Một số dữ liệu dạng văn bản có chứa ngày tháng. Cô ấy cần một cách để xóa bất kỳ ngày nào, nhưng vẫn để lại bất kỳ văn bản nào khác có thể nằm trong một ô. Ví dụ: những gì bắt đầu là “15/4/16 kiểm tra chạy thành công” hoặc “kiểm tra chạy vào ngày 15/04/16” sẽ là, sau khi xóa, “
kiểm tra đã chạy thành công” và “kiểm tra đã chạy”.
Nếu ngày của bạn luôn theo một mẫu đơn giản, bạn có thể sử dụng hàm SUBSTITUTE để xóa chúng. Ví dụ: nếu ngày luôn bao gồm một tháng có một chữ số và một ngày có hai chữ số, bạn có thể sử dụng cách sau để xóa nó:
=SUBSTITUTE(A1,MID(A1,SEARCH("?/??/??",A1),7),)
Có rất nhiều vấn đề với một công thức như vậy. Đầu tiên, nó trả về giá trị lỗi nếu không có ngày trong ô A1 hoặc nếu ngày trong ô A1 chỉ có một ngày có một chữ số. Hơn nữa, nếu ngày có tháng hai chữ số, thì nó sẽ giữ nguyên chữ số đầu tiên đó (với điều kiện ngày sử dụng ngày có hai chữ số) hoặc trả về giá trị lỗi (nếu ngày sử dụng ngày có một chữ số).
Nếu ngày của bạn xuất hiện ở đầu hoặc cuối văn bản trong một ô, bạn có thể sử dụng một loại công thức khác:
=IFERROR( IF( VALUE( LEFT( A1, 1)) > 0, RIGHT( A1, LEN(A1) - 7), ""), LEFT( A1, FIND( "/", A1) - 2))
Vấn đề với cách tiếp cận này là nó cũng yêu cầu mẫu chính xác M / DD / YY hoặc MM / D / YY. Do đó, nó thể hiện các vấn đề tương tự như công thức trước.
Một cách tiếp cận linh hoạt hơn là sử dụng macro để tìm kiếm ngày và sau đó xóa nó khỏi chuỗi. Macro ví dụ sau đây xem xét các hình nón của một ô và chia nó thành các “từ” bằng cách sử dụng hàm Split. Sau đó, nó bắt đầu ghép các từ lại với nhau, miễn là từ đó không phải là ngày tháng.
Function RemoveDates(ByVal vC As String) Dim arr As Variant Dim s As String Dim i As Integer RemoveDates = "" If vC > "" Then arr = Split(vC, " ") For i = LBound(arr) To UBound(arr) If Not IsDate(arr(i)) Then s = s & arr(i) & " " End If Next i RemoveDates = Left(s, Len(s) - 1) End If End Function
Bạn sử dụng macro như một hàm do người dùng định nghĩa trong trang tính của mình, như sau:
=RemoveDates(A1)
Hạn chế duy nhất của macro này là nếu bạn có nhiều khoảng trắng giữa các từ, những khoảng trắng đó sẽ bị xóa trong quá trình thay thế. Nếu đây là một vấn đề lớn đối với bạn, bạn có thể cân nhắc dựa vào một biểu thức chính quy trong macro của mình, như thế này:
Function RemoveDates(MyRange As Range) As String Dim sRaw As String Dim sPattern As String Dim regEx As New RegExp sRaw = MyRange.Value sPattern = "[0-9]{1,2}[-.\\/][0-9]{1,2}[-.\\/][0-9]{2}" With regEx .Global = True .MultiLine = True .IgnoreCase = False .pattern = sPattern End With If regEx.Test(sRaw) Then RemoveDates = regEx.Replace(sRaw, "") Else RemoveDates = "Not matched" End If Set regEx = Nothing End Function
Hàm này được sử dụng trong trang tính của bạn giống như hàm do người dùng định nghĩa trước đó:
=RemoveDates(A1)
Đối với một số người, việc sử dụng các cụm từ thông dụng có vẻ giống như một nghệ thuật đen, nhưng cách sử dụng cụ thể này khá đơn giản. Mẫu (được lưu trữ trong biến sPattern) cho biết rằng một hoặc hai chữ số theo sau là ký tự chia (dấu gạch ngang, dấu chấm, dấu gạch chéo ngược hoặc dấu gạch chéo ngược) theo sau bởi một hoặc hai chữ số khác theo sau là một ký tự chia khác theo sau hai chữ số được coi là ngày. Nếu tìm thấy kết quả khớp như vậy trong ô, nó sẽ bị xóa.
Để sử dụng cách tiếp cận cà phê espressions thông thường, bạn cần đảm bảo rằng bạn bao gồm một tham chiếu đến thư viện sau trong Trình chỉnh sửa Visual Basic (chọn Tham khảo từ trình đơn Công cụ):
Microsoft VBScript Regular Expressions 5.5
Bạn cũng nên lưu ý rằng hàm trả về “Không khớp” nếu ngày tháng không nằm trong ô bạn tham chiếu.
_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 (7768) áp dụng cho Microsoft Excel 2007, 2010, 2013 và 2016.