Страницы: 1
RSS
Аналог Application.Trim
 
Мяв.
Для работы кода требуется функционал Application.Trim, но Application.Trim использовать нельзя.
Я написал аналог, но, мне кажется, что получилась пушка слишком крупного калибра. Может в закутках VBA найдется калибр поменьше?
Код
Sub test()
    txt = "   aa  bb    dd ee   "
    t = AccTrim(txt)
    tt = Application.Trim(txt)
    Debug.Print t
    Debug.Print tt
End Sub
Function AccTrim(txt)
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "( {2,})"
        AccTrim = Trim(.Replace(txt, " "))
    End With
End Function
 
Цитата
RAN написал:
Application.Trim использовать нельзя.
Привет, тёзка.
Правильно ли я понимаю, что VBA где-нибудь в CorelDraw? :)
И это не полный аналог. А так - быстрее, чем встроенными функциями. Ну может разве что через байт массив делать.
 
Do While?
Код
Function Trim_VBA(txt$)
    Dim s$
    s = txt
    Do While InStr(1, s, "  ", 1) <> 0
        s = Replace(s, "  ", " ")
    Loop
    Trim_VBA = Trim(s)
End Function
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
А так
Код
Function AllTrim(iCell As Range) As String
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
        With re
            .Global = True
            .Pattern = "\s+"
            AllTrim = Trim(.Replace(iCell, " "))
        End With
    Set re = Nothing
End Function
 
Нужно для работы Function ФИО_A(Фам_Имя_Отч) As String в Access.
Цитата
Дмитрий(The_Prist) Щербаков написал:
Do While?
Думал, но цикл не глянулся. Хотя, может, и лучше.

Kuzmich, калибр тот же.
Изменено: RAN - 13.02.2020 19:10:56
 
Цитата
RAN написал:
о цикл не глянулся
Вот какие коты нынче капризные :)  Тёзкин код на такой фразе
"   Для работы кода требуется функционал Application.Trim,   но Application.Trim использовать нельзя. Я написал аналог, но, мне кажется, что получилась пушка слишком крупного калибра. Может в закутках VBA найдется калибр поменьше?   "
87 секунд при 100000 повторений
Код Дмитрия - 0,32 :D
 
Уел!  :D
Мне, правда, более 100 повторов не нать, но сдаюсь.
Всем мУрси.
 
И для коллекции - трюк без цикла, позаимствованный из SQL (при условии, что аргумент не содержит chr(1)):
Код
Trim_VBA2 = Replace$(Replace$(Replace$(Trim$(txt), " ", Chr(1) & " "), " " & Chr(1), ""), Chr(1), "")
Изменено: sokol92 - 13.02.2020 20:23:47
Владимир
 
Владимир, мУрси, трюк весьма интересный. Еще бы выяснить, где вообще встречается Chr(1)?
 
На практике я не встречался. В теории знаком по специфической работе метода Range.Replace c этим сиволом. Вместо Chr(1) можно указать любой символ, которого заведомо нет в строке, например, какую-нибудь букву из слоговой письменности канадских аборигенов (правда, сейчас пользователи форума - спецы по этому языку возмутятся :) )
Изменено: sokol92 - 13.02.2020 21:15:44
Владимир
 
Цитата
трюк весьма интересный
В части кода из сообщения #8 у меня одного пусто?
 
Владимир, спасибо. Интересное решение
 
То, что
Цитата
sokol92 написал:
Вместо Chr(1) можно указать любой символ
понятно. Заинтересовал именно Chr(1)

Kuzmich, думаю нет. Проблема старая...
это выглядит так
Trim_VBA2 = Replace$(Replace$(Replace$(Trim$(txt), " ", Chr(1) & " "), " " & Chr(1), ""), Chr(1), "")
Модераторам. Большая просьба не оформлять это кодом. Ибо код в 1 строку виден далеко не всем.
Изменено: RAN - 13.02.2020 23:16:24
 
RAN,
Спасибо Андрей!
 
Владимир это решение продвигает, как минимум второй раз, но тогда оно было не замечено общественностью. Что касаемо Chr(1) , то появление от 1 до 7  кране мало вероятно, но еще менее вероятно Chr(0)
По вопросам из тем форума, личку не читаю.
 
Был код в сообщении #13, сам видел, прошло полчаса и пропал. Как так?
 
Был не код, а текст. А потом его оформили кодом. Вот он и пропал у Вас. У меня всё отображается нормальное.
 
Владимир, спасибо, интересное решение.
 
Спасибо, друзья!
Владимир
 
До кучи. Если будет очень много данных, и нужно будет очень быстро обрабатывать их. Заодно там же решения на регулярках.
«Бритва Оккама» или «Принцип Калашникова»?
 
RAN, из моей темы по ссылке от bedvit'а самое шустрое штатное (без сторонних библиотек) решение (быстрее Application.Trim):
Код
Sub TrimByRef(iVal)
Static RE As RegExp
 
If RE Is Nothing Then Set RE = New RegExp: RE.Global = True: RE.Pattern = " {2,}"
iVal = RE.Replace(Trim(iVal), " ")
End Sub
Там же есть решение от самого bedvit'а, уделывающее всех (собсна, как обычно   :D  ), но требующее стороннюю библиотеку
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Static RE
Только вот коты статику не любят - им бы что подинамичнее :)  Опять же буковок много писать...
 
Цитата
Андрей VG: коты статику не любят - им бы что подинамичнее
будут скоростью расплачиваться  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Да почему не любят? Вот только смысл?
По существующему каналу связи запрос обновляется за минуту - две. И лишняя пара секунд погоды не делает.
Страницы: 1
Наверх