بیل اغلب مجبور است اطلاعات را در یک کاربرگ وارد کند تا بتواند آن را برای شرکت خود پردازش کند. در وضعیت Bills، یکی از اولین اقداماتی که او باید انجام دهد حذف تمام کاراکترهای ASCII 8 بیتی است که ممکن است در داده های وارد شده باشد. این شخصیت ها نیازی به جایگزینی با چیزی ندارند. آنها فقط باید حذف شوند تا فقط کاراکترهای ASCII 7 بیتی باقی بمانند. بیل متعجب است که آیا راه آسانی برای انجام این کار وجود دارد، شاید با یک نوع ماکرو.
بسته به ویژگی های داده ای که با آن شروع می کنید، چند راه وجود دارد که می توانید به این مشکل نزدیک شوید. با فرض اینکه شما فقط کاراکترهای 8 بیتی در کاربرگ خود دارید، تنها کدهای کاراکتری که می توانند برای کاراکترها استفاده شوند 0 تا 255 است. اگر می خواهید داده های خود را فقط به کاراکترهای 7 بیتی محدود کنید، این بدان معناست که شما فقط چیزهایی می خواهید. در محدوده کد کاراکتر از 0 تا 127. بنابراین، می توانید از یک ماکرو برای جستجوی آسان هر کاراکتر در محدوده 128 تا 255 استفاده کنید و به سادگی آنها را حذف کنید. این ماکرو از این رویکرد استفاده می کند:
Sub Remove8Bit1()
Cells.Select
For i = 128 To 255
X = Chr(i)
Selection.Replace What:=X, Replacement:="", _
LookAt:=xlPart, SearchOrder:=xlByRows, _
MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Next
End Sub
این رویکرد فقط مقادیری را در کاربرگ شما پیدا می کند که در محدوده 8 بیتی هستند. هیچ چیزی را که در محدوده 8 بیتی است که در واقع توسط یک فرمول ایجاد شده است، لمس نمی کند. (در بیشتر موارد نباید مشکلی ایجاد شود. اگر مشکلی است، راه حل مناسب اصلاح فرمول هایی است که نتایج توهین آمیز ایجاد می کند.)
اگر داده های شما حاوی کاراکترهای یونیکد هستند، می خواهید از روش دیگری استفاده کنید. از نظر فنی، کاراکترهای یونیکد کاراکترهای 8 بیتی نیستند. آنها کاراکترهای 16 بیتی هستند و می توانند مقادیر کد کاراکتری در محدوده 0 تا 65535 داشته باشند. از آنجایی که می خواهید هر چیزی با مقدار بیش از 127 را نادیده بگیرید، استفاده از رویکرد مبتنی بر جستجو که قبلاً مورد بحث قرار گرفت، دشوار می شود - در نهایت به جای تنها 128، بیش از 65000 جستجو انجام می دهید.
یک روش بهتر این است که به سادگی به تمام کاراکترها در تمام سلول های انتخاب شده نگاه کنید و اگر کد کاراکتر آنها بیش از 127 است، آنها را نادیده بگیرید. این رویکرد در کلان زیر است:
Sub Remove8Bit2()
Dim rngCell As Range
Dim intChar As Integer
Dim strCheckString As String
Dim strCheckChar As String
Dim intCheckChar As Integer
Dim strClean As String
For Each rngCell In Selection
strCheckString = rngCell.Value
strClean = ""
For intChar = 1 To Len(strCheckString)
strCheckChar = Mid(strCheckString, intChar, 1)
intCheckChar = Ascw(strCheckChar)
If intCheckChar < 128 Then
strClean = strClean & strCheckChar
End If
Next intChar
rngCell.Value = strClean
Next rngCell
End Sub
توجه داشته باشید که ماکرو به جای تابع سنتی Asc از تابع Ascw استفاده می کند تا به مقادیر یونیکد نگاه کند.