Vba excel непечатаемые символы
У меня настоящая борьба, пытающаяся привязать строку к тому, что мне нужно в Outlook VBA. Я пробовал 100 разных вещей со всего Интернета, включая здесь.
Я использую следующее:
Но так как тело письма содержит: C/test C/, переменная (CString) переходит в "тест".
Я попытался использовать вторую переменную с Trim, RTrim, LTrim, Trim $, LTrim $ и RTrim $. Кроме того, я попробовал REPLACE с двойным пространством и одним пространством. Я пробовал функцию TrimAll, которая популярна в Интернете, которая пытается найти разные значения Chr(), а также vbTab и т.д. Ничто из них, похоже, ничего не заменяет.
Строка остается неизменной.
Является ли это проблемой с фиксированной длиной и переменной длиной ("значимой")? Я не нашел способ конвертировать из фиксированной длины в переменную. Прохождение через функцию не сработало.
Есть ли какие-либо советы относительно того, как я могу выйти с "тестом" в результате?
Большое спасибо за Вашу помощь.
Проще говоря: функции обработки строк в VBA действительно работают. Если ваша строка содержит пробелы (в частности, символ с кодовой точкой 32) в начале или конце строки ввода, они будут удалены.
Строки с фиксированной длиной существуют только в том случае, если вы специально объявляете их с помощью специального синтаксиса:
Ни одна из строковых функций VBA не возвращает строки фиксированной длины. Поэтому, если вы не объявили CString как строку с фиксированной длиной, используя вышеуказанные обозначения, это не проблема.
Логически единственной возможностью является то, что персонажи, которые вы считаете пробелами, на самом деле не являются пробелами. Весьма вероятным кандидатом в электронном письме является то, что они являются нераскрывающимися пробелами HTML или кодовой точкой 0xA0 (десятичный 160). Самый простой способ заменить несколько символов в исходной строке - использовать регулярное выражение.
Вот типичная функция обрезки, основанная на регулярном выражении. Два шаблона, построенные ниже,
Если вы хотите найти и удалить дополнительные пробелы, просто добавьте их значения кодовой точки в список в приведенной ниже функции. Например, чтобы рассматривать линейные фиды и возврат каретки как пробелы, которые вы хотите обрезать, добавьте в список кодовые точки 10 и 13.
Функция VBA InStr является одной из наиболее часто используемых функций в VBA. Он используется для нахождения текста внутри строки и действительно отлично справляется с работой.
Тем не менее, она часто используется, чтобы помочь извлечь часть строки, и эту задачу она выполняет плохо.
Если вы обнаружили, что извлечение текста в VBA является болезненным процессом, тогда читайте дальше. Эта статья покажет вам более простой и лучший способ, используя три реальных примера!
Краткое руководство к статье
В следующей таблице приведено краткое руководство к тому, что рассматривается в этой статье.
Краткая справка
Чтобы узнать больше об элементах, упомянутых в статье, перейдите по следующим ссылкам:
- Если вы хотите узнать больше о функциях InStr или InStrRev, пожалуйста, прочитайте Поиск в строке.
- Если вы хотите узнать больше о функциях Mid, Left или Right, посмотрите раздел Извлечение части строки.
- Для получения дополнительной информации о функции Split проверьте Строка в массив, используя Split.
- Оператор Like включен в Сравнение строк с шаблоном
Я использую Debug.Print в моих примерах. Он печатает значения в Immediate Window, которое вы можете просмотреть, нажав Ctrl + G (или выберите View-> Immediate Window)
Введение
В этой статье я собираюсь показать вам лучший способ извлечения символов из строки, чем использование функции VBA InStr с Left, Right или Mid.
Эта статья разбита следующим образом:
- Раздел 1: Как извлечь из строк фиксированного размера.
- Раздел 2: Как извлечь из строк переменного размера.
- Раздел 3: Как извлечь из строки переменного размера, используя функцию Split.
- Разделы с 4 по 6: некоторые примеры из реальной жизни.
Когда VBA InStr, Left, Right и Mid полезны
Если вы хотите проверить, содержит ли строка значение, InStr подходит для этой работы. Если вы хотите сделать простое извлечение, то отлично подойдут Left, Right и Mid.
Использование InStr для проверки, содержит ли строка текст
В следующем примере мы проверяем, содержит ли ФИО «Петрович». Если возвращаемое значение InStr больше нуля, то строка содержит значение, которое мы проверяем.
Извлечение с Left, Right и Mid
Функция Left используется для получения символов слева от строки.
Функция Right используется для получения символов справа от строки.
Функция Mid используется для середины строки. Она такая же, как
Left, за исключением того, что вы даете ему стартовую позицию.
Эти три функции работают нормально, если требуемый текст всегда одинакового размера и в одном и том же месте. Для других сценариев они требуют использования InStr, чтобы найти определенную позицию в строке. Это усложняет их использование.
Используйте Left, Right или Mid, когда символы всегда будут в одной и той же позиции.
Работа со строками различной длины
Brooke Hilt
Pamela Jurado
Zack Kinzel
Eddy Wormley
Kaitlyn Rainer
Jacque Trickett
Kandra Stanbery
Margo Hoppes
Berenice Meier
Garrett Hyre
(Если вам нужен случайный список имен, попробуйте этот генератор случайных имен)
Использование функции VBA InStr с Left
Мы используем функцию VBA InStr, чтобы получить позицию первого пробела. Мы хотим получить все символы до пробела. Мы вычитаем одну из позиции, так как это дает нам позицию последней буквы имени.
Давайте посмотрим на первый пример в приведенном выше коде. Первый пробел находится в позиции 5. Мы вычтем 1, что дает нам позицию 4. Это позиция последней буквы John, т.е.
Затем мы даем 4 функции Left, и она возвращает первые четыре символа, например, «John»
Мы можем выполнить ту же задачу в одной строке, передав возвращаемое значение из InStr в функцию Left.
Использование функции VBA InStr с Right
В этом примере мы получим последнее слово в строке, то есть Smith. Мы можем использовать функцию InStrRev. Это то же самое, что InStr, за исключением того, что поиск выполняется с конца строки.
Важно отметить, что InStrRev дает нам позицию с начала строки. Поэтому нам нужно использовать его немного иначе, чем мы использовали InStr и Left.
Как работает приведенный выше пример:
Использование функции VBA InStr с Mid
В следующем примере мы получим «Henry» из строки. Слово, которое мы ищем, находится между первым и вторым пробелом.
Мы будем использовать функцию Mid здесь.
Как видите, это сложно сделать и требует немного усилий, чтобы выяснить. Нам нужно найти первое место. Тогда нам нужно найти второе место. Затем мы должны вычесть одно из другого, чтобы дать нам количество символов, которые нужно взять.
Если у вас есть строка с большим количеством слов, то это может быть очень сложно. К счастью для нас, гораздо проще было извлечь символы из строки. Это называется функцией Split.
Функция Split
Мы можем использовать функцию Split для выполнения приведенных выше примеров. Функция Split разбивает строку на массив. Тогда мы можем легко получить доступ к каждому элементу.
Давайте попробуем те же три примера еще раз, и на этот раз мы будем использовать Split.
Ого! Какая разница с использованием Split. Как это работает:
- Функция Split разбивает строку везде, где есть пробел.
- Каждый элемент помещается в массив, начиная с нуля.
- Используя номер местоположения, мы можем получить доступ к элементу массива.
В следующей таблице показано, как может выглядеть массив после использования Split.
Примечание: первая позиция в массиве равна нулю. Наличие нулевых массивов является стандартным в языках программирования.
0 | 1 | 2 |
John | Henry | Smith |
В приведенном выше коде мы разделяем строку каждый раз, когда ее используем. Мы также можем разделить строку один раз и сохранить ее в переменной массива. Тогда мы можем получить к нему доступ, когда захотим.
Если вы хотите узнать больше о массивах, я написал о них целую статью под названием «Полное руководство по использованию массивов в Excel VBA».
В следующих разделах мы рассмотрим примеры из реальной жизни. Вы увидите преимущество использования Split вместо функции InStr.
Пожалуйста, не стесняйтесь попробовать это сами. Это отличный способ учиться, и вы можете повеселиться, пытаясь понять их (или, может быть, только у меня так!)
Пример 1: Получение части имени файла
Представьте, что мы хотим извлечь числа из следующих имен файлов
«VB_23476_Val.xls»
«VV_987_Val.txt»
«VZZA_12223_Val.doc»
Это похоже на пример, где мы получаем второй элемент. Чтобы получить значения здесь, мы используем подчеркивание (то есть «_»), чтобы разбить строку. Смотрите пример кода ниже:
В реальном мире вы обычно читаете такие строки из разных ячеек. Допустим, эти имена файлов хранятся в ячейках от А1 до А3. Мы немного изменим приведенный выше код:
Пример 2: диапазон IP-адресов
Пример здесь взят из вопроса на веб-сайте StackOverflow.
У пользователя есть строка с IP-адресом в формате «BE-ABCDDD-DDS 172.16.23.3».
Он хочет, чтобы IP в диапазоне от 172,16 до 172,31 был действительным. Так например:
- «BE-ABCDDD-DDS 172.16.23.3» действителен
- «BE-ABCDDD-DDS 172.25.23.3» действителен
- «BE-ABCDDED-DDS 172.14.23.3» не действителен
- «BE-ABCDDDZZ-DDS 172.32.23.3» не действителен
Вот как бы я это сделал. Сначала я разбил строку по периодам. Число, которое мы ищем, находится между первым и вторым периодом. Поэтому это второй пункт. Когда мы разделяем строку, она помещается на первую позицию в массиве (помните, что массив начинается с нулевой позиции).
Полученный массив будет выглядеть так:
0 | 1 | 2 | 3 |
BE-ABCDDD-DDS 172 | 31 | 23 | 3 |
Код ниже показывает, как это сделать.
Пример 3. Проверьте правильность имени файла
В этом последнем примере мы хотим проверить правильность имени файла. Есть три правила.
- Должно заканчиваться на .pdf
- Он должен содержать АА
- Он должен содержать 1234 после А
В следующих таблицах показаны некоторые допустимые и недействительные элементы:
Сначала мы сделаем это, используя функции InStr и Right.
Этот код очень грязный. К счастью для нас, у VBA есть Сравнение с шаблоном. Мы можем проверить шаблон строки без необходимости искать элементы и позиции и т.д. Мы используем оператор Like в VBA для сопоставления с шаблоном. Пример ниже показывает, как это сделать.
В приведенном выше примере звездочка в шаблоне относится к любому количеству символов.
Давайте разберем этот паттерн * AA * 1234 * .pdf
Чтобы показать, что это работает правильно, давайте попробуем это на всех именах примеров в таблице.
Чтобы узнать больше о сопоставлении с шаблоном и ключевом слове Like, ознакомьтесь с этой публикацией.
Заключение
InStr и InStrRev действительно полезны только для простых задач, таких как проверка наличия текста в строке.
Left, Right и Mid полезны, когда положение текста всегда одинаково.
При попытке проверить формат строки, которая не является фиксированной по размеру, ключевое слово Like (т.е. Сопоставление с образцом) обычно обеспечивает более простое решение.
Предположим, вам нужно удалить все буквенные символы из диапазона в Excel, например, одними данными в ячейке могут быть « Лукас 13654698745 ", И вы хотите, чтобы это было" 13654698745 ”, Как можно быстро удалить все буквенные символы из ячеек? Есть ли какие-нибудь хорошие идеи для решения этой проблемы?
Вкладка Office позволяет редактировать и просматривать в Office с вкладками и значительно упрощает работу . Kutools for Excel решает большинство ваших проблем и увеличивает вашу производительность на 80%- Повторное использование чего угодно: Добавляйте наиболее часто используемые или сложные формулы, диаграммы и все остальное в избранное и быстро используйте их в будущем.
- Более 20 текстовых функций: Извлечь число из текстовой строки; Извлечь или удалить часть текстов; Преобразование чисел и валют в английские слова.
- Инструменты слияния : Несколько книг и листов в одну; Объединить несколько ячеек / строк / столбцов без потери данных; Объедините повторяющиеся строки и сумму.
- Разделить инструменты : Разделение данных на несколько листов в зависимости от ценности; Из одной книги в несколько файлов Excel, PDF или CSV; От одного столбца к нескольким столбцам.
- Вставить пропуск Скрытые / отфильтрованные строки; Подсчет и сумма по цвету фона ; Отправляйте персонализированные электронные письма нескольким получателям массово.
- Суперфильтр: Создавайте расширенные схемы фильтров и применяйте их к любым листам; Сортировать по неделям, дням, периодичности и др .; Фильтр жирным шрифтом, формулы, комментарий .
- Более 300 мощных функций; Работает с Office 2007-2019 и 365; Поддерживает все языки; Простое развертывание на вашем предприятии или в организации.
Удалите все буквенные символы из ячеек с кодом VBA
Удивительный! Использование эффективных вкладок в Excel, таких как Chrome, Firefox и Safari!
Экономьте 50% своего времени и сокращайте тысячи щелчков мышью каждый день!
Сложно удалить буквенные символы с помощью функции в Excel, поэтому вы можете использовать код VBA для решения этой проблемы. Вы можете удалить все буквенные символы с помощью VBA, выполнив следующие действия.
1. Нажмите разработчик>Визуальный Бейсик или нажмите Alt + F11 открыть новый Microsoft Visual Basic для приложений появится окно, щелкните Вставить > Модульи введите следующий код:
VBA: удалить буквенные символы:
3. Затем нажмите кнопку для запуска кода. И всплывающее диалоговое окно для выбора диапазона для работы, см. Снимок экрана:
.
4. Нажмите OK, и все альфа-символы были удалены.
Чтобы удалить все альфа-символы с помощью Kutools for Excel одним щелчком мыши.
Kutools for Excel: с более чем 300 удобными надстройками Excel, которые можно попробовать бесплатно без ограничений в течение 30 дней. Получить сейчас
Пожалуйста, примените эту утилиту, нажав Kutools > Текстовые инструменты в группе редактирования > Удалить символы, см. снимок экрана:
Шаг 1. Выберите диапазон, с которым хотите работать.
Шаг 2. Нажмите Kutools > Текстовые инструменты в группе редактирования > Удалить символы, и отметьте Альфа во всплывающем окне Удалить символы диалог, см. снимок экрана:
Шаг 3. Нажмите Ok or Применить чтобы удалить все альфы в диапазоне.
Эта утилита также может удалять числовые символы, нечисловые символы, непечатаемые символы и т. Д.
Для получения более подробной информации о Удалить символ Kutools for Excel, пожалуйста, посетите: Удалить символы.
Я регулярно работаю с большими объемами данных в Excel, и один из моих шагов в "очистке" заключается в поиске ячеек, которые содержат только непечатаемые символы и очищают их.
Чтобы уточнить, мое определение сопоставимой ячейки для очистки - это любая ячейка, которая при форматировании с черным шрифтом не будет печатать чернила на листе бумаги.
К ним относятся только ячейки:
-
vbNullString, то же значение, что и эта формула: = "" Любой тип пространства (я обнаружил, что есть много разных символов пробела). табуляция Любой тип разрыва строки Любые другие непечатаемые символы
Хороший ответ будет рассмотрен:
-
Рабочие листы могут содержать сотни тысяч строк данных Excel и миллионов ячеек. Соответствующие ячейки, подлежащие очистке, могут содержать несколько непечатаемых символов. Рабочие листы могут содержать большие диапазоны пустых диапазонов. Скорость - большой фактор. Важно сохранить непечатаемые символы, если они находятся внутри ячеек, которые также содержат печатные символы.
То, что я пробовал: вот мой код до сих пор, который сохраняет значения ячейки листа в массиве и прокручивает их один за другим, ища номера символов Юникода 160 или меньше или равные 32, которые охватывают большинство или все не- насколько я могу судить. Он находит только ячейки, равные одному непечатаемому символу (т.е. Он пропускает ячейку, содержащую только два пробела). На моей машине он проходит около 250 000 ячеек в секунду.
спросил(а) 2017-06-19T23:33:00+03:00 4 года, 5 месяцев назадЭто неудобный вопрос для ответа, потому что существует довольно большая разница между пробелом и непечатаемыми символами. Белое пространство - это, в основном, набор символов, которые вы не видите (например, форматирование, пробелы и т.д.), И их можно просто удалить с помощью RegEx . Непечатаемые символы намного сложнее, поскольку они зависят от вашего устройства (так называемый Device Context ), например, экран или принтер, а также шрифт (некоторые значения "видны" одним шрифтом, но не другим).
Если вы действительно хотите получить доступ к списку печатаемых глифов (т.е. Для вашего конкретного устройства и вашего конкретного шрифта), то существуют некоторые Windows APIs которые могут извлечь эту информацию. Ключевой является GetFontUnicodeRanges() . Это неудобно использовать в VBA, потому что он заполняет тип, известный как GLYPHSTRUCTURE. Этот тип содержит массив неизвестного измерения, а в VBA вы не можете читать память в тип данных неизвестного размера - вы не можете переназначить этот тип для чтения в памяти, как только вы знаете размер. Поэтому для получения данных требуется копия итеративной памяти. В приведенном ниже коде показано, как это сделать, но я должен добавить предостережение, что я все еще 32-разрядный, поэтому вам нужно будет использовать эти API для преобразования их в 64-разрядные (довольно простая задача).
Приобретение списка печатаемых глифов
В верхней части модуля вставьте следующие API:
В том же модуле вставьте следующую функцию:
Вам нужно будет добавить свою собственную обработку ошибок, если хотите, и это будет включать тестирование, если возвращаемые значения API равны 0 (означая неудачную функцию).
Тестирование ваших ценностей
Вы заметите переменную с именем rejects . Это просто список печатаемых глифов, которые вам все еще не нужны - в примере кода он представляет собой список пробелов в Юникоде.
скорость
Вы правы, чтобы читать данные в массив, особенно если они имеют значение, которое вы предлагаете в своем посте. Чтобы все работало быстро, я использовал Collection которой содержится каждый печатный глиф и ключ которого является значением юникода, преобразованным в строку. Это не эффективная память, но она будет относительно быстрой.
Читайте также: