Страницы: 1
RSS
TRIM CLEAN для VBA
 
Доброго времени суток,

Задача использовать f(x) Clean Trim для VBA.
Поправте макрос пожалуйста. В идеале, макрос должен выполнить задачи f(x) clean & trim как Application.WorksheetFunction для указанного диапозона Column("A:F")
Код
Sub Test_1()
For Each cell In Selection
    cell.Value = Application.WorksheetFunction.Trim(cell.Value)
'нужно указать диапозон Column("A:F")
   Next  
End Sub

Всем спасибо кто откликнется.
 
Код
Sub Test_1()
  With Intersect(Range("A:F"), ActiveSheet.UsedRange)
    .Value = Application.Trim(.Value)
  End With
End Sub
 
Попробуйте:
Код
Sub Test_2()
    With ThisWorkbook.ActiveSheet.UsedRange
    'ili
    'With ThisWorkbook.Sheets("Kakoy-to List").UsedRange
        For Each cell In .Columns("A:F")
            With Application.WorksheetFunction
                cell.Value = .Trim(.Clean(cell.Value))
            End With
        Next
    End With
End Sub
 
Всем спасибо!
Наколдовал тут вот такое.
Код
Sub clean_trim()
'disable all screen updates
Application.ScreenUpdating = False
Application.DisplayStatusBar = False

'f(x)Trim data, range from A:G columns
With Intersect(Range("A:G"), ActiveSheet.UsedRange)
.Value = Application.Trim(.Value)
    End With
'f(x)Clean data, range from A:G columns   
With Intersect(Range("A:G"), ActiveSheet.UsedRange)
.Value = Application.Clean(.Value)

'f(x) replace char(160) to char (32)
Range("A:G").Replace What:=Chr(160), Replacement:=Chr(32)
    End With
'f(x) clean format for all sheet, culumn Width is 5 and orientation on right
Worksheets("Sheet1").Range("A:G").ClearFormats
Columns("A:G").ColumnWidth = 7#
Columns("A:G").HorizontalAlignment = xlRight        
End sub
Изменено: Alexandr Dumanetskiy - 09.02.2019 17:23:26
 
Зачем функция листа Trim, если есть собственная?
Код
.Value =Trim(.Value)

Зачем два раза одно и то же?
Код
With Intersect(Range("A:G"), ActiveSheet.UsedRange)
    .Value = Application.Clean(.Value)
End With
 
Как я понимаю, Trim и Clean разные задачи выполняют, а так же они отличаюся, f(x) VBA Clean, Trim  ≠  f(x) Sheet Clean, Trim
+ нужно что бы Chr(10) был удален - это может только Clean - если я ничего не путаю или я непонял вашего вопроса. Новичек я - учусь :)
 
Извините, это я недосмотрел.

Если учитесь, учитесь сразу делат отступы и разделение операторов или логических блоков - читать легче.
Вот фрагмент Вашего кода
Код
    'f(x)Trim data, range from A:G columns
    With Intersect(Range("A:G"), ActiveSheet.UsedRange)
        .Value = Application.Trim(.Value)
    End With
        
    'f(x)Clean data, range from A:G columns
    With Intersect(Range("A:G"), ActiveSheet.UsedRange)
        .Value = Application.Clean(.Value)

        'f(x) replace char(160) to char (32)
        Range("A:G").Replace What:=Chr(160), Replacement:=Chr(32)
    End With

With помогает упростить код. Но не только. Этим диапазон размещаем в памяти. После End With память очищается. Зачем два раза?

Application.Trim => Trim
примечание: возможно, для Вашей задачи замена неравносильна, т.к. Trim-VBA удаляет только левые и правые пробелы.
Цитата
нужно что бы Chr(10) был удален - это может только Clean
можно заменой СИМВОЛа(10)
Range("A:G"). Его родитель - активный лист, к родителю под With отношения не имеет.
Код
    With Intersect(Range("A:G"), ActiveSheet.UsedRange)
        'f(x)Trim data, range from A:G columns
        .Value = Trim$(.Value)
        'f(x)Clean data, range from A:G columns
        .Value = Replace(.Value, Chr$(10), "")
    End With

    'f(x) replace char(160) to char (32)
    Range("A:G").Replace What:=Chr$(160), Replacement:=Chr$(32)
   ' или
    With Range("A:G")
        .Value = Replace(.Value, Chr$(160), Chr$(32))
    End With

После завершения обработки включайте обратно отключенне статус-бар и обновление экрана. Автоматически срабатывает не всегда корректно.
 
Привет!
Цитата
Alexandr Dumanetskiy написал:
Наколдовал
Не пишите сложных процедур. Создавая простые (проще некуда), "тупые" функции одного действия, Вы познаете выгоды инкапсуляции, повторного использования кода и избежите рефакторинга и когнитивного стресса.
Скрытый текст
Изменено: Inexsu - 11.02.2019 00:34:06
Сравнение прайсов, таблиц - без настроек
 
Alexandr Dumanetskiy, здравствуйте!. Заменяйте неразрывные пробелы на обычные ПЕРЕД Trim'ом, а не после и используйте WorksheetFunction.Trim, а не Application.Trim
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Код
Application.WorksheetFunction.Trim
Application.Trim
WorksheetFunction.Trim

В чем разница?
 
Привет!
Цитата
Jack Famous написал:
ПЕРЕД Trim'ом, а не после
и кто использовал простые функции, всего лишь, в сообщении 8 заменит:
Код
Range_Clean( _
Range_Trim( 
на
Код
Range_Trim( _
Range_Clean( 
Изменено: Inexsu - 11.02.2019 11:25:44
Сравнение прайсов, таблиц - без настроек
 
vikttur, могу быть неправ, но Application.WorksheetFunction.Trim = WorksheetFunction.Trim, но Application.Trim = Trim <> WorksheetFunction.Trim (а значит не чистит пробелы внутри слов).
В любом случае, предпочитаю указывать WorksheetFunction, если использую функцию листа — для точности.
Изменено: Jack Famous - 11.02.2019 11:29:05
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
vikttur написал:
Application.WorksheetFunction.Trim
Application.Trim
WorksheetFunction.Trim
Код
Application.WorksheetFunction.Trim 
это расширенная запись для
Код
WorksheetFunction.Trim 
Application.Trim 
Удаляет из строки все пробелы из текста, кроме одинарных пробелов между словами.
Код
Trim 'без Application
Возвращает строку без начальных пробелов и конечных пробелов  
Изменено: Inexsu - 11.02.2019 14:54:24
Сравнение прайсов, таблиц - без настроек
 
Цитата
vikttur написал:
В чем разница?
Application.Trim работает с массивом.
(Application.)WorksheetFunction.Trim и (VBA.)Trim не работают с массивом - надо писать циклы.
 
Спасибо.
Application.Trim  - не применял никогда. При обрабтке в коде Trim - и поехали )
О работае с массивами - хорошая информация.
 
Цитата
Inexsu написал:
Возвращает строку без начальных пробелов и конечных пробелов  
да ладно!!!!
По вопросам из тем форума, личку не читаю.
 
Доверяй, но проверяй))
Казанский, БМВ, спасибо за инфу - всё работает:
Код
Sub t()
Dim rng As Range, arr, temp
arr = [a1:a20].Value2
temp = Application.Trim(arr)
Set rng = [c1:c20]: rng.Value2 = "": rng.Value2 = temp
End Sub
вывод: перехожу на Application.Trim ввиду большей универсальности (сжимает пробелы по всей строке и работает с массивами)  :D
Изменено: Jack Famous - 11.02.2019 12:24:37
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
БМВ написал:
да ладно!!!!
У Вас оптический обман :-)
сделал понагляднее
Код
Private Sub App_Trim_test()
    Dim str As String
    str = " 1   1  "
    str = Application.Trim(str)
    str = Replace(str, " ", 2)
Debug.Print str
End Sub
Сравнение прайсов, таблиц - без настроек
 
Inexsu, у меня в Immediate пишет "121", что подтверждает слова БМВ о корректности сжимания всех двойных и ведущих/хвостовых пробелов…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Inexsu написал:
У Вас оптический обман :-)
все возможно
? len(Application.Trim("1     2"))
3
это не 3 это 7 :-)

? len(Application.Trim(" 1   1  "))
3
снова 3, да что ж такое. Ох уж эти оптические обманы.
Изменено: БМВ - 11.02.2019 13:31:27
По вопросам из тем форума, личку не читаю.
 
А вот так:
Код
Private Sub App_Trim_test(Optional ByVal msg As Variant)
    Dim str As String
    str = " 1   1  "
    str = Trim(str)
    str = Replace(str, " ", 2)
Debug.Print str
End Sub
Сравнение прайсов, таблиц - без настроек
 
Ох уж эти оптические иллюзии
str = Trim(str) а я и не вижу, где там Application.Trim который обсуждаем.
Inexsu, Trim VBA функция не трогает внутренние пробелы, но это не тоже что и Аpplication.Trim
По вопросам из тем форума, личку не читаю.
 
Итого:
Trim - удаляет только ведущие и хвостовые пробелы, не трогая внутренние
Application.WorksheetFunction.Trim = WorksheetFunction.Trim - "сжимает" ВСЕ пробелы
Application.Trim - "сжимает" ВСЕ пробелы + работает с массивами (лидер рейтинга)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Чтобы окончательно запутать: ;)


Код
Sub test()
  Dim v
  v = CallByName(Application.WorksheetFunction, "Trim", VbGet, Array("1  2", "3   4  "))
  Debug.Print v(1), Len(v(1)), v(2), Len(v(2))
End Sub
Изменено: sokol92 - 11.02.2019 16:01:00
Владимир
 
sokol92, ну лично я таких зверей не использую. Меньше знаешь — крепче спишь  :D
А за пример, спасибо)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Доброго времени суток, Планетяне!

Всплыл неожиданный баг/фича:
Application.Trim(arr) после применения к одномерному массиву с нижней границей 0 меняет её на 1
Изменено: Jack Famous - 03.06.2019 16:00:41
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Здравствуйте, Алексей! Не неожиданный, я на это намекал в #24 :)  
Владимир
 
Цитата
sokol92: я на это намекал
а я прямо сказал — это ведь удобнее  :D немногие до тестов доходят (вот и я не дошёл, а дойдя - не понял бы, что вы хотели сказать), а увидеть готовый результат тестирования и запомнить - легко  :)
Изменено: Jack Famous - 03.06.2019 16:38:30
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, это еще не все сюрпризы.
Application.Trim и 256 символов в ячейке
 
RAN, благодарю - отписался  ;)

UPD 25/07/2019: тема с "обгоном" штатных Trim
Изменено: Jack Famous - 25.07.2019 09:04:25
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх