Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 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 - 9 Фев 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 Фев 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 Фев 2019 11:25:44
 
vikttur, могу быть неправ, но Application.WorksheetFunction.Trim = WorksheetFunction.Trim, но Application.Trim = Trim <> WorksheetFunction.Trim (а значит не чистит пробелы внутри слов).
В любом случае, предпочитаю указывать WorksheetFunction, если использую функцию листа — для точности.
Изменено: Jack Famous - 11 Фев 2019 11:29:05
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
vikttur написал:
Application.WorksheetFunction.Trim
Application.Trim
WorksheetFunction.Trim
Код
Application.WorksheetFunction.Trim 
это расширенная запись для
Код
WorksheetFunction.Trim 
Application.Trim 
Удаляет из строки все пробелы из текста, кроме одинарных пробелов между словами.
Код
Trim 'без Application
Возвращает строку без начальных пробелов и конечных пробелов  
Изменено: Inexsu - 11 Фев 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 Фев 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 Фев 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 Фев 2019 16:01:00
Владимир
 
sokol92, ну лично я таких зверей не использую. Меньше знаешь — крепче спишь  :D
А за пример, спасибо)
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
Страницы: 1
Читают тему (гостей: 1)
Наверх