Проблема в том, что VBA Editor не отображает большинство символов UNICODE.В частности, его способность отображать символы ограничена символами на кодовой странице Windows (8-байтовые символы).
Он может манипулировать старшими символами, но они не будут отображаться в ближайшем окне (илиокна сообщений, в этом отношении).
Я не уверен, почему вы считаете необходимым удалить эти символы, но:
Вы можете определить ошибочные символы, отображая каждый символ по одномувремя и преобразование как в стандартный код символа, так и в код символа Unicode.
В Excel вы можете выполнить:
A1: your_text_string
B2: =MID($A$1,ROWS($1:1),1)
C2: =CODE(B2)
D2: =UNICODE(B2)
Выберите B2: D2 и заполните, насколько это необходимо.
Вы можете сделать что-то подобное в VBA.
Ваша текстовая строка содержит символ Unicode ZWJ (zero-width-joiner), для которого десятичный код равен 8205. Таким образом, хотя это прекрасно работает наВаш рабочий лист преобразуется в ?
в редакторе VBA.
Если вам необходимо удалить их, вы можете сделать это на рабочем листе с помощью
=SUBSTITUTE(A1,UNICHAR(8205),"")
или эквивалентного емуVBAкод:
replace([a1],chrw(8205),"")
Если вы не знакомы, порекомендуйте поиск в Интернете ZWJ, функцию VBA ChrW
и функцию Excel UNICHAR
.
Если это не изолированныйнапример, но вам нужно иметь подпрограмму для удаления любых символов, которые не могут быть отображены редактором VBA, вы можете попробовать это:
Option Explicit
Function removeChars(s As String)
Dim i As Long, l As Long, sTemp As String
Dim ch As String
For i = 1 To Len(s)
ch = Mid(s, i, 1)
If AscW(ch) <= 255 Then
sTemp = sTemp & ch
End If
Next i
removeChars = sTemp
End Function
И, чтобы показать, что это работает, вот скриншоты MsgBox
сгенерировано из необработанного текста и текста, созданного с помощью removeChars
UDF выше:


Я не знаю, будет ли это быстрее, но вот еще один UDF, использующий регулярные выражения, который также может делать то же самое:
Option Explicit
Function removeChars(s As String)
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
.Pattern = "[^\x00-\xFF]+"
.Global = True
removeChars = .Replace(s, "")
End With
End Function
Этот последний UDF может быть ускоренбит с помощью раннего связывания, и, если у вас есть много строк для обработки, делая это в массивах VBA.