Определить недопустимые символы в текстовой ячейке - PullRequest
1 голос
/ 04 ноября 2008

Я недавно унаследовал макрос VBA, к которому необходимо добавить логику проверки. Мне нужно иметь возможность определить, являются ли какие-либо символы в текстовой ячейке не символами ASCII (т. Е. Имеют двоичное значение> 0x7F). Ячейки могут содержать некоторые значения управления кареткой (особенно перевод строки), которые необходимо сохранить (поэтому функция CLEAN не работает для этой проверки). Я пробовал функцию IsText, но обнаружил, что она будет интерпретировать последовательности символов UTF-8 как допустимый текст (который мне не нужен).

Мне не нужно на самом деле манипулировать строкой, я просто хочу показать ошибку пользователю, который запускает макрос, чтобы сообщить ему, что в конкретной ячейке есть недопустимые (не ASCII) символы.

Ответы [ 3 ]

4 голосов
/ 05 ноября 2008

Если вы хотите технически чистый подход, вы можете попробовать регулярное выражение. Добавьте ссылку на VBA в библиотеку сценариев Microsoft и попробуйте этот код. Это выглядит немного сложным, но вы будете поражены тем, что могут делать регулярные выражения, и у вас будет ценный инструмент для будущего использования.

Function IsTooHigh(c As String) As Boolean

Dim RegEx As Object
Set RegEx = CreateObject("vbscript.regexp")
With RegEx
 .Global = True
 .MultiLine = True
 .Pattern = "[^\x00-\x7F]"
End With

IsTooHigh = RegEx.Test(c)

End Function

Эта функция выдает TRUE, если какой-либо символ в строке c не находится (^) в диапазоне от 0 (x00) до 127 (x7F).

Вы можете использовать Google для «регулярного выражения» и всего, что вам нужно, и получить ответ практически на любом языке, поскольку, как и в SQL, шаблоны регулярных выражений кажутся независимыми от языка.

2 голосов
/ 04 ноября 2008

Команда asc (символьная) преобразует символ в его значение ASCII.

hex (asc (символ)) преобразует символ в значение HEX.

Как только вы это сделаете, вы можете легко сделать несколько сравнений, чтобы определить, являются ли данные неверными, и при необходимости выбросить ошибки.

Вот пример кода: http://www.freevbcode.com/ShowCode.asp?ID=4486

0 голосов
/ 09 ноября 2008
Function IsGoodAscii(aString as String) as Boolean
Dim i as Long
Dim iLim as Long
i=1
iLim=Len(aString)

While i<=iLim
    If Asc(Mid(aString,i,1))>127 then
        IsGoodAscii=False
        Exit Function
    EndIf
    i=i+1   
Wend

IsGoodAscii=True
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...