Как найти скрытых персонажей в excel - PullRequest
0 голосов
/ 07 марта 2019

Сегодня у меня странная проблема.Текст в Excel не совпадает с текстом программы.

В своей камере я вижу.

[NOM DU GARANT], в любом обществе и в разных странах Канады (aci‍-après le «garant»)

, но когда я загружаюсьэто в переменную в VBA и распечатать его в моем непосредственном окне, я получаю следующее.

? SText

[NOM DU GARANT], независимо от того, является ли он комитетом конституции и регистрации в канадской истории (как таковой может быть «гарант»)»)

Когда я вставил сюда ячейку, вот что я получил.

[NOM DU GARANT], общество в полном составе и регистрации в Канаде (‍‍‍‍‍ci‍‍‍‍‍après le «garant»)

Когда я иду в камеручтобы я мог удалить «скрытые» символы.

Мой вопрос: как я могу найти / удалить / увидеть эти скрытые символы?

Также есть ли способ смягчить эту проблему.Я предполагаю, что эти проблемы происходят от людей, копирующих из французского приложения MS Word и вставляющих в эту ячейку Excel (у меня нет конкретных доказательств, подтверждающих это).

Ответы [ 2 ]

3 голосов
/ 07 марта 2019

Проблема в том, что 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 выше:

enter image description here

enter image description here

Я не знаю, будет ли это быстрее, но вот еще один 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.

1 голос
/ 07 марта 2019

Вы можете распознать ячейки с таким текстом, сравнив Len(Range.Text) и Len(Range.Value2).

Вы можете поэкспериментировать с StrConv(string, vbFromUnicode) и StrConv(string, vbUnicode).

Вы можете очистить его с помощью WorksheetFunction.Clean() (работает только для младших кодов ASCII).
Если очистка неэффективна, я бы попытался выяснить различные коды символов e. г. Debug.Print Asc(Mid(Range.Value2, 1, 1)) и построить более / менее сложную Replace функцию.


Если вы хотите сохранить только предопределенный набор символов, вот простая функция:

Private Function ReducedCharset(ByRef s As String) As String
    Dim i As Long
    Dim c As String
    Dim Temp As String
    Temp = ""
    For i = 1 To Len(s)
        c = Mid(s, i, 1)
        If c Like "[0-9A-Za-z€ÄÖÜßäöü]" Then
            Temp = Temp & c
        End If
    Next i
    ReducedCharset = Temp
End Function
...