Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2010, 00:51   #1
Smaragdov
Пользователь
 
Регистрация: 30.11.2009
Сообщений: 13
По умолчанию Аналог "правильного" trim() и регулярные выражения в VBA

Товарищи, если не трудно, подскажите полному чайнику, есть ли в VBA штатный аналог функции trim(), аналогичный оному в языке PHP?
Дело в том, что trim() в VBA удаляет только концевые пробелы, а символы табуляции и переносы строк игнорирует, что не есть хорошо...

Нужна функция, которая бы удаляла вначале и в конце строки:
  • " " (ASCII 32 (0x20)), символ пробела.
  • "\t" (ASCII 9 (0x09)), символ табуляции.
  • "\n" (ASCII 10 (0x0A)), символ перевода строки.
  • "\r" (ASCII 13 (0x0D)), символ возврата каретки.
  • "\0" (ASCII 0 (0x00)), NUL-байт.
  • "\x0B" (ASCII 11 (0x0B)), символ вертикальной табуляции.

И еще один вопрос.
Не получается найти, как использовать в VBA регулярные выражения для поиска и замены.
Надо заменить повторяющиеся пробельные символы. Было бы удобно воспользоваться регулярным выражением:
$s =~ s/\s+/ /g;
... но вместо этого приходится "городить огород" с циклом... Как-то это неправильно...
А как задействовать механизм рег.выражений, никак не найду...

Заранее благодарю!
Smaragdov вне форума Ответить с цитированием
Старый 04.09.2010, 01:03   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я только про регулярные пример приведу:
Код:
http://www.sql.ru/forum/actualthread.aspx?bid=46&tid=677591
Как из текстовой строки удалить все сиволы и оставить только цифры? на VBA
==
Function ClearName(ByVal strText As String, ByVal strPattern As String) As String
    Dim RegExp As Object
    Set RegExp = CreateObject("vbscript.regexp")
    With RegExp
        .Pattern = strPattern
        .Global = True
        ClearName = .Replace(Trim(strText), "")
    End With
End Function

Sub Test()
    MsgBox ClearName("gyes573jd83j09 ~!@#)", "[^0-9,]")
End Sub
или вот ещё:
Код:
Function NumbersOnly(srcStr As String) As String
Dim objRegEx As Object
Set objRegEx = CreateObject("VBScript.RegExp")
    With objRegEx
        .Global = True
        .Pattern = "\D"
        NumbersOnly = .Replace(srcStr, vbNullString)
    End With
Set objRegEx = Nothing
End Function
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 04.09.2010 в 01:05.
Hugo121 вне форума Ответить с цитированием
Старый 04.09.2010, 02:54   #3
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

Цитата:
Сообщение от Smaragdov Посмотреть сообщение
Товарищи, если не трудно, подскажите полному чайнику, есть ли в VBA штатный аналог функции trim(), аналогичный оному в языке PHP?
Дело в том, что trim() в VBA удаляет только концевые пробелы, а символы табуляции и переносы строк игнорирует, что не есть хорошо...

Нужна функция, которая бы удаляла вначале и в конце строки:
  • " " (ASCII 32 (0x20)), символ пробела.
  • "\t" (ASCII 9 (0x09)), символ табуляции.
  • "\n" (ASCII 10 (0x0A)), символ перевода строки.
  • "\r" (ASCII 13 (0x0D)), символ возврата каретки.
  • "\0" (ASCII 0 (0x00)), NUL-байт.
  • "\x0B" (ASCII 11 (0x0B)), символ вертикальной табуляции.

И еще один вопрос.
Не получается найти, как использовать в VBA регулярные выражения для поиска и замены.
Надо заменить повторяющиеся пробельные символы. Было бы удобно воспользоваться регулярным выражением:
$s =~ s/\s+/ /g;
... но вместо этого приходится "городить огород" с циклом... Как-то это неправильно...
А как задействовать механизм рег.выражений, никак не найду...

Заранее благодарю!
Если код в Excel, то гораздо быстрее это можно сделать так:

Код:
    With Application
        Mystring = .Trim(.Clean(Mystring))
    End With
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN
KL (XL) вне форума Ответить с цитированием
Старый 04.09.2010, 03:20   #4
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

Как-то так:

Код:
Function CompleteTrim(srcStr As String) As String
    Dim objRegEx As Object
    Set objRegEx = CreateObject("VBScript.RegExp")
        With objRegEx
            .Global = True
            .Pattern = "\s+"
            CompleteTrim = Trim(.Replace(srcStr, " "))
        End With
    Set objRegEx = Nothing
End Function
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN

Последний раз редактировалось KL (XL); 04.09.2010 в 03:22.
KL (XL) вне форума Ответить с цитированием
Старый 04.09.2010, 19:24   #5
Smaragdov
Пользователь
 
Регистрация: 30.11.2009
Сообщений: 13
По умолчанию

Огромное спасибо за ответы! Выручили!
Буду экспериментировать с предложенными решениями...

Однако... Как-то это несерьезно, чтобы для применения регулярных выражений надо было писать свою функцию, а не использовать стандартное средство языка...
Пока только плююсь на этот VBA: синтаксис совершенно непонятный, встроенный Help тоже жуток, нет регулярных выражений, и т.д. и т.п. (((

Коли уж создал тему, то хочу задать в ней же еще пару чайниковских вопросов.

1)
Проверяю в цикле значения элементов массива cDbArr().
Нужно пометить всю строку голубым фоном ячеек, если было заказано оптовое (более и равно пяти) количество единиц товара.
Проверяю:
Код:
If (j = 12 And Val(cDbArr(12)) >= 5) Then
      Range(Cells(i + startRow + 1, 1), Cells(i + startRow + 1, UBound(cDbArr))).Interior.ColorIndex = 8
End If
где:
j – это текущий индекс элемента массива cDbArr()

Далее проверяются значения в других элементах массива, например, почтовый индекс получателя (он должен состоять только из 6 цифр). Т.к. не нашел, как использовать рег.выражения, написал такое "извратное" условие для проверки, что в строке только цифры:
Код:
If (j = 6 And (Len(cDbArr(j)) <> 6 Or UCase(cDbArr(j)) <> LCase(cDbArr(j)))) Then
    ' если почтовый индекс не указан ИЛИ НАПИСАН НЕПРАВИЛЬНО, то помечать ячейку индекса красным цветом
    Cells(i + startRow + 1, j + 1).Interior.ColorIndex = 3 ' красный фон
Однако, не работает...
Фон ошибочной ячейки в уже выделенной голубым цветом строке, не меняется на красный. Вся строка остается голубой.
Что я делаю неправильно?


2)
Второй вопрос.
Как проще всего удалить почтовый индекс и город из строки с почтовым адресом, если они уже указаны в других полях этой же записи?
Допустим, имеем:
cDbArr(5) = "Саратов";
cDbArr(6) = "410009";
cDbArr(7) = "410009, г. Саратов, ул. Рябиновская, д.1/91.";

Надо чтобы в cDbArr(7) была просто строка "ул. Рябиновская, д.1/91.".
Разбивать строку на слова по пробелу или знаку препинания, переводить в нижний регистр, и сравнивать с соответствующими полями, запоминать позиции начала и конца подстроки в cDbArr(7), а затем вырезать их? Может, есть способ попроще?

Заранее благодарю!
Smaragdov вне форума Ответить с цитированием
Старый 04.09.2010, 19:42   #6
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Цитата:
Пока только плююсь на этот VBA: синтаксис совершенно непонятный
Аналогично...когда начал PHP изучать. Ничего, привык.)
Просто у каждого языка свои особенности.
Русский на китайский тоже не очень похож, и то что у них одним иероглифом пишется, у нас надо кучу букв написать.
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499

Последний раз редактировалось VictorM; 04.09.2010 в 19:44.
VictorM вне форума Ответить с цитированием
Старый 04.09.2010, 20:10   #7
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Цитата:
Далее проверяются значения в других элементах массива, например, почтовый индекс получателя (он должен состоять только из 6 цифр). Т.к. не нашел, как использовать рег.выражения, написал такое "извратное" условие для проверки, что в строке только цифры:
Код:

If (j = 6 And (Len(cDbArr(j)) <> 6 Or UCase(cDbArr(j)) <> LCase(cDbArr(j)))) Then
' если почтовый индекс не указан ИЛИ НАПИСАН НЕПРАВИЛЬНО, то помечать ячейку индекса красным цветом
Cells(i + startRow + 1, j + 1).Interior.ColorIndex = 3 ' красный фон

Однако, не работает...
Код:
If j = 6 And cDbArr(6) Like "######" Then

  Cells(i + startRow + 1, j + 1).Interior.ColorIndex = 3

End If
Вопрос 2
Я думаю улица всегда присутствует.
Код:
If InStr(1, cDbArr(7), cDbArr(5), vbTextCompare) > 0 And InStr(1, cDbArr(7), cDbArr(6), vbTextCompare) > 0 Then
rr = Split(cDbArr(7), "ул", -1)
cDbArr(7) = "ул" & rr(1)
End If
Анализ,обработка данных Недорого

Последний раз редактировалось doober; 04.09.2010 в 20:15.
doober вне форума Ответить с цитированием
Старый 04.09.2010, 20:27   #8
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

Цитата:
Сообщение от doober Посмотреть сообщение
Я думаю улица всегда присутствует
Ага, но в разных агрегатных состояниях: проспект, проезд, переулок, шоссе, площадь...
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN
KL (XL) вне форума Ответить с цитированием
Старый 04.09.2010, 21:03   #9
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Точно,об этом и не подумал,тогда заменить на запятую и клеить 2 последнихА лучше посмотреть оригинал
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 05.09.2010, 18:08   #10
Smaragdov
Пользователь
 
Регистрация: 30.11.2009
Сообщений: 13
По умолчанию

Цитата:
Сообщение от VictorM Посмотреть сообщение
Аналогично...когда начал PHP изучать. Ничего, привык.)
Просто у каждого языка свои особенности.
Русский на китайский тоже не очень похож, и то что у них одним иероглифом пишется, у нас надо кучу букв написать.
После Perl(a) язык PHP показался весьма понятным и логичным.
Но теперь, когда внезапно потребовался VBA, просто туплю не по-детски...
Начальство орет "быстрей-быстрей!", а времени на обучение нет - приходится разрываться между своими непосредственными обязанностями сисадмина, и кучей других, совершенно "левых" вещей, типа дизайна и подготовки выставок...
Smaragdov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поддерживает ли VBA регулярные выражения? Suppir Microsoft Office Word 19 04.09.2011 00:19
Есть в VBA аналог "repeat until keypressed" (из Pascal) ? (-) novak_26 Microsoft Office Excel 3 28.02.2010 19:02
Аналог функции "Сохранить как->Веб-страница, полностью" beemoto Работа с сетью в Delphi 1 23.11.2009 17:12
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04