کاران دارای داده های متنی زیادی در یک ورک بوک است. برخی از آن داده های متنی حاوی تاریخ است. او به راهی برای حذف تاریخ ها نیاز دارد، اما هر متن دیگری را که ممکن است در یک سلول باشد بگذارد. به عنوان مثال، آنچه با عنوان «آزمایش 15/4/16 با موفقیت انجام شد» یا «تست در 15/4/16 انجام شد» شروع می شود، پس از حذف، «تست با موفقیت انجام شد» و «تست در تاریخ اجرا شد».
اگر تاریخ های شما همیشه از یک الگوی ساده پیروی می کنند، می توانید از تابع SUBSTITUTE برای حذف آنها استفاده کنید. به عنوان مثال، اگر تاریخ همیشه از یک ماه تک رقمی و یک روز دو رقمی تشکیل شده است، می توانید از موارد زیر برای حذف آن استفاده کنید:
=SUBSTITUTE(A1,MID(A1,SEARCH("?/??/??",A1),7),)
چنین فرمولی مشکلات متعددی دارد. ابتدا، اگر تاریخ در سلول A1 وجود نداشته باشد یا اگر تاریخ در سلول A1 فقط یک روز تک رقمی داشته باشد، مقدار خطا را برمی گرداند. علاوه بر این، اگر تاریخ دارای یک ماه دو رقمی باشد، آن رقم اول را دست نخورده باقی می گذارد (به شرطی که تاریخ از یک روز دو رقمی استفاده کند) یا مقدار خطا را برمی گرداند (اگر تاریخ از یک روز تک رقمی استفاده کند).
اگر تاریخ شما در ابتدا یا انتهای متن در یک سلول ظاهر می شود، می توانید از نوع دیگری از فرمول استفاده کنید:
=IFERROR( IF( VALUE( LEFT( A1, 1)) > 0, RIGHT( A1, LEN(A1) - 7), ""), LEFT( A1, FIND( "/", A1) - 2))
مشکل این رویکرد این است که به الگوی دقیق M/DD/YY یا MM/D/YY نیز نیاز دارد. بنابراین همان مشکلات فرمول قبلی را نشان می دهد.
یک رویکرد همه کاره تر، استفاده از ماکرو برای جستجوی تاریخ و حذف آن از رشته است. ماکرو مثال زیر به محتوای یک سلول نگاه می کند و با استفاده از تابع Split آن را به "کلمات" تقسیم می کند. سپس شروع به قرار دادن کلمات در کنار هم می کند، تا زمانی که کلمه تاریخ نباشد.
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
شما از ماکرو به عنوان یک تابع تعریف شده توسط کاربر در کاربرگ خود به صورت زیر استفاده می کنید:
=RemoveDates(A1)
تنها اشکال این ماکرو این است که اگر چند فاصله بین کلمات داشته باشید، در فرآیند جایگزینی آن فاصله ها حذف می شوند. اگر این موضوع برای شما مهم است، ممکن است به یک عبارت منظم در ماکرو خود تکیه کنید، مانند این:
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
این تابع در کاربرگ شما مانند تابع تعریف شده قبلی توسط کاربر استفاده می شود:
=RemoveDates(A1)
استفاده از عبارات منظم ممکن است برای برخی مانند یک هنر سیاه به نظر برسد، اما این استفاده خاص نسبتاً ساده است. الگوی (ذخیره شده در متغیر sPattern) می گوید که یک یا دو رقم به دنبال یک کاراکتر تقسیم کننده (خط تیره، نقطه، بک اسلش یا اسلش جلو) به دنبال آن یک یا دو رقم دیگر و به دنبال آن یک کاراکتر تقسیم کننده دیگر و به دنبال آن دو رقم به عنوان یک رقم در نظر گرفته می شود. تاریخ. اگر چنین تطابقی در سلول یافت شود، حذف می شود.
به منظور استفاده از رویکرد بیان منظم، باید مطمئن شوید که یک مرجع به کتابخانه زیر در ویرایشگر ویژوال بیسیک قرار داده اید (مرجع را از منوی ابزار انتخاب کنید):
Microsoft VBScript Regular Expressions 5.5
همچنین باید توجه داشته باشید که اگر تاریخ در سلولی که شما به آن ارجاع می دهید قرار نگرفته باشد، تابع "Not matched" را برمی گرداند.