Найти замену греческих символов в Excel с помощью макроса VBA - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь создать макрос VBA, чтобы помочь мне очистить описания компонентов электроники в ведомости материалов Excel. Удаляет лишние пробелы с помощью Trim и сокращает несколько длинных слов. Однако я не могу понять, как правильно найти / заменить греческий символ, такой как Омега. Кодовые номера символов не работают. Я не уверен, неправильно ли я использую ChrW или в чем проблема.

На другом форуме мне предложили добавить в код MatchByte: = True , но, похоже, это не помогает и не мешает.

Путем долгих экспериментов я нашел решение части этой проблемы. Оказывается, что знак µ - MICRO SIGN (код символа Unicode и ASCII (шестнадцатеричный) 00B5, а также код символа ASCII (десятичный) 181) прекрасно работает, когда вы просто вставляете его символ в код поиска / замены VBA. Затем макрос находит / заменяет его идеально.

Я озадачен относительно того, почему греческие символы mu, omega и rho не работают таким образом.

μ - ГРЕЧЕСКОЕ МАЛЕНЬКОЕ ПИСЬМО MU (код символа Unicode (hex) 03B C)

Ω - ГРЕЧЕСКИЙ КАПИТАЛЬНЫЙ ПИСЬМО OMEGA (Код символа Unicode (hex) 03A9)

Ω - ЗНАК ОМ ( Код символа Unicode (шестнадцатеричный) 2126)

ρ - ГРЕЧЕСКОЕ МАЛЕНЬКОЕ ПИСЬМО RHO (Код символа Unicode (шестнадцатеричный) 03C1)

Sub DescriptionFix()
'
' DescriptionFix Macro
' Shortens Description by replacing long words and removes excess spaces from the Description Column
' Select a column or a portion of a column to run this macro on
'
    Dim r As Range

    With Application.WorksheetFunction
    For Each r In Intersect(Selection, ActiveSheet.UsedRange)
        r.Value = .Trim(r.Value)
    Next r
    Selection.Replace What:="RESISTOR", Replacement:="RES", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

    Selection.Replace What:="ChrW(2126)", Replacement:="OHM", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, MatchByte:=True, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="ChrW(03A9)", Replacement:="OHM", LookAt:= _
        xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

    Selection.Replace What:="TRANSISTOR", Replacement:="TRANS", LookAt:= _
        xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="CRYSTAL", Replacement:="XTAL", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="CAPACITOR", Replacement:="CAP", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="µ", Replacement:="u", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

    Selection.Replace What:="ChrW(03BC)", Replacement:="u", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        MatchByte:=True, ReplaceFormat:=False
    Selection.Replace What:="ChrW(03C1)", Replacement:="p", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        MatchByte:=True, ReplaceFormat:=False

    Selection.Replace What:="TANTALUM", Replacement:="TANT", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="CERAMIC", Replacement:="CER", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="INDUCTOR", Replacement:="IND", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="FERRITE", Replacement:="FERR", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="GREEN", Replacement:="GRN", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="BLACK", Replacement:="BLK", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="YELLOW", Replacement:="YEL", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="VOLTAGE", Replacement:="VOLT", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="REGULATOR", Replacement:="REG", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="CONNECTOR", Replacement:="CONN", LookAt:=xlPart _
        , SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="TRANSFORMER", Replacement:="XFMR", LookAt:= _
        xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    End With
End Sub

1 Ответ

2 голосов
/ 27 февраля 2020
  1. Не используйте кавычки вокруг кодов символов (т.е. используйте ChrW(03C1) вместо "ChrW(03C1)", иначе вы буквально ищете строку ChrW(03C1), а не символ, который она представляет

  2. VBA ожидает, что код будет десятичным, а не шестнадцатеричным (т.е. ChrW(937) вместо ChrW(03A9)

  3. Если вам необходимо преобразовать коды из шестнадцатеричного в десятичное Вы можете использовать любой из нескольких конвертеров или справочных таблиц онлайн. Что-то вроде https://unicodelookup.com/

...