Обнаружение нестандартных символов - PullRequest
0 голосов
/ 26 декабря 2018

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

Некоторые из них здесь, но есть много имен пользователей, которые содержат символы

  • ♫ muz ♫
  • BOSS?
  • ч❤️
  • имя☝

и т. Д.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Анализ стандартных и нестандартных символов с помощью Byte Массив

В этом примере используется строка первой строки OP "muz" переменной s, назначенная для Byteмассив, который позволяет анализировать каждый код символа, представленный двумя байтами на символ.Эта 2-байтовая архитектура позволяет обнаруживать нестандартные символы, получать их десятичные или шестнадцатеричные значения (~~> ср. ChrW и AscW функция).Кроме того, этот пример изолирует стандартные символы в конечной переменной s.Не стесняйтесь изменять код в любом желаемом направлении: -)

Подсказка

Очень полезный сайт для поиска нестандартных символов прямым вводом можно найти по адресу https://unicode -table.com / ru / blocks /

Sub DedectNonStandardSymbols()
' Meth: analyze a Byte-array consisting of 2 bytes with a pair of character codes;
'       e.g. code sequence 96 followed by 0 represents the standard character "a"
' Note: VBA handles strings in Unicode encoded as UTF-16, so
'       each ‘character’ of the string corresponds at least to a 16 bit WORD (2 bytes) of memory.
' Hint: For details about Windows' Little Endian architecture
'       where the lowest significant byte appears first in memory, followed by the most significant byte at the next address.
'       see http://support.microsoft.com/kb/102025
  Dim by() As Byte, by2() As Byte, s As String
  Dim i&, ii&, dec&
' build example string (cf. 1st example string in OP)
  s = ChrW(&H266B) & "muz" & ChrW(&H266B)     ' beamed eighth notes surrounding the standard characters "muz"
' get byte sequences
  by = s: ReDim by2(0 To UBound(by))
' loop through array and detect non standard characters
  For i = LBound(by) To UBound(by) Step 2
      dec = by(i + 1) * 16 * 16 + by(i)       ' 2nd word (byte)
      Debug.Print i / 2 + 1, by(i) & ", " & by(i + 1), _
            "dec " & dec & "/hex &H" & WorksheetFunction.Dec2Hex(Format(dec, "0")), _
            "=> """ & ChrW(dec) & """" & IIf(by(i + 1) = 0, "", " (non-standard char)")
      If by(i + 1) = 0 Then
         by2(ii) = by(i): by2(ii + 1) = 0: ii = ii + 2
      End If
  Next i
  ReDim Preserve by2(0 To ii - 1)
  s = by2
  Debug.Print "String without non-standard chars: """ & s & """"
End Sub

Пример вывода в прямом окне VBE

 1            107, 38       dec 9835/hex &H266B         => "?" (non-standard char)
 2            109, 0        dec 109/hex &H6D            => "m"
 3            117, 0        dec 117/hex &H75            => "u"
 4            122, 0        dec 122/hex &H7A            => "z"
 5            107, 38       dec 9835/hex &H266B         => "?" (non-standard char)
 String without non-standard chars: "muz"
0 голосов
/ 26 декабря 2018

Лучший метод состоит в проверке каждого символа в строке, чтобы можно было исключить любые символы или символы, которые не ожидаются.Вот код для простой функции, которая проверяет, содержит ли строка ТОЛЬКО строчные или прописные буквы (без пробелов или специальных символов / символов).

Public Function IsValidName(Name As String) As Boolean

    Dim ValidCharacters As String, Position As Integer, Character As String

    'STEP 1: set up valid characters for string
    ValidCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

    'STEP 2: start position at first character
    Position = 1

    While Position <= Len(Name)
        'Get single character from current position in Name
        Character = Mid(Name, Position, 1)

        'Locate the position of the character in the ValidCharacters string
        '   If InStr() returns 0, then the character was not found in the string
        If InStr(ValidCharacters, Character) = 0 Then
            IsValidName = False
            Exit Function
        End If

        'Increment position
        Position = Position + 1
    Wend

    'STEP 3: all characters were found in ValidCharacters string - return TRUE
    IsValidName = True
End Function

Вы также можете изменить функцию для анализа любых символов вимя и вернуть только действительные символы.Смотрите функцию ниже:

Public Function ParseName(Name As String) As String

    Dim ValidCharacters As String, Position As Integer, Character As String, ValidName As String

    'STEP 1: set up valid characters for string
    ValidCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

    'STEP 2: start position at first character
    Position = 1

    While Position <= Len(Name)
        'Get single character from current position in Name
        Character = Mid(Name, Position, 1)

        'Locate the position of the character in the ValidCharacters string
        '   If InStr() is NOT 0, then the character was found and can be added to the ValidName
        If InStr(ValidCharacters, Character) <> 0 Then
            ValidName = ValidName & Character
        End If

        'Increment position
        Position = Position + 1
    Wend

    'STEP 3: all characters were found in ValidCharacters string - return TRUE
    ParseName = ValidName
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...