Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Макрос "Trim_By_Formula" - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: _Boroda_, китин  
Мир MS Excel » Вопросы и решения » Готовые решения » Макрос "Trim_By_Formula" (Применить функцию СЖПРОБЕЛЫ к ячейкам выделенного диапазона)
Макрос "Trim_By_Formula"
Alex_ST Дата: Среда, 15.08.2012, 13:52 | Сообщение № 21
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Quote (KuklP)
range может разделиться на несколько areas
А-а-а! Точно! Понял.
Quote (KuklP)
Сегодня, 12:35 опять зеленка с тегами в сообщении
Это у тебя глюк - у меня всё в цветах и красках.
А ты попробуй войди в режим редактирования того поста и посмотри, какие там тэги стоят?



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
Quote (KuklP)
range может разделиться на несколько areas
А-а-а! Точно! Понял.
Quote (KuklP)
Сегодня, 12:35 опять зеленка с тегами в сообщении
Это у тебя глюк - у меня всё в цветах и красках.
А ты попробуй войди в режим редактирования того поста и посмотри, какие там тэги стоят?

Автор - Alex_ST
Дата добавления - 15.08.2012 в 13:52
nerv Дата: Среда, 15.08.2012, 14:04 | Сообщение № 22
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Quote (KuklP)
Саша, ты что по Лешиному коду не видишь? А по моему?

Ваши коды делают разное.


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
Сообщение
Quote (KuklP)
Саша, ты что по Лешиному коду не видишь? А по моему?

Ваши коды делают разное.

Автор - nerv
Дата добавления - 15.08.2012 в 14:04
KuklP Дата: Среда, 15.08.2012, 14:18 | Сообщение № 23
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
То Алексей: "vba""code"..."/code""/vba" - вместо кавычек квадратные скобки.
То Саша: в чем ты увидел разницу?


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728


Сообщение отредактировал KuklP - Среда, 15.08.2012, 14:21
 
Ответить
СообщениеТо Алексей: "vba""code"..."/code""/vba" - вместо кавычек квадратные скобки.
То Саша: в чем ты увидел разницу?

Автор - KuklP
Дата добавления - 15.08.2012 в 14:18
Alex_ST Дата: Среда, 15.08.2012, 14:25 | Сообщение № 24
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Испугал ты меня, Серёга, про Areas.
Я код-то подправил, но старый не стёр.
Сравнил работу "в разных позах". Никакой разницы.
Посмотрел внимательно и понял, что т.к. у меня идёт цикл по каждой ячейке, а не применение трима сразу к диапазону, то ареасами можно не париться.



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеИспугал ты меня, Серёга, про Areas.
Я код-то подправил, но старый не стёр.
Сравнил работу "в разных позах". Никакой разницы.
Посмотрел внимательно и понял, что т.к. у меня идёт цикл по каждой ячейке, а не применение трима сразу к диапазону, то ареасами можно не париться.

Автор - Alex_ST
Дата добавления - 15.08.2012 в 14:25
KuklP Дата: Среда, 15.08.2012, 14:32 | Сообщение № 25
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Леш, а ты заполни 10000 строк * 30 столбцов значениями. И где-то в средине влепи формулу. Потом сравни по скорости.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеЛеш, а ты заполни 10000 строк * 30 столбцов значениями. И где-то в средине влепи формулу. Потом сравни по скорости.

Автор - KuklP
Дата добавления - 15.08.2012 в 14:32
nerv Дата: Среда, 15.08.2012, 14:36 | Сообщение № 26
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Quote (KuklP)
То Алексей: "vba""code"..."/code""/vba" - вместо кавычек квадратные скобки.

1. должны быть квадратные скобки. Правильный синтаксис [vba][code][/code][/vba], где между code ... code - код
2. пробелы / табуляции калечит ucoz

Quote (KuklP)
То Саша: в чем ты увидел разницу?

Где у тебя обработка переносов строк?

UPD: все понял, но она не совсем точна (если не ошибаюсь)


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba


Сообщение отредактировал nerv - Среда, 15.08.2012, 14:46
 
Ответить
Сообщение
Quote (KuklP)
То Алексей: "vba""code"..."/code""/vba" - вместо кавычек квадратные скобки.

1. должны быть квадратные скобки. Правильный синтаксис [vba][code][/code][/vba], где между code ... code - код
2. пробелы / табуляции калечит ucoz

Quote (KuklP)
То Саша: в чем ты увидел разницу?

Где у тебя обработка переносов строк?

UPD: все понял, но она не совсем точна (если не ошибаюсь)

Автор - nerv
Дата добавления - 15.08.2012 в 14:36
KuklP Дата: Среда, 15.08.2012, 14:47 | Сообщение № 27
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Леш, я не поленился и выполнил свой совет:
cells: 88,625s
areas: 1,578125s
разница не очевидна? Код был такой:

[vba]
Code
Sub TrimSpaces1()
        Dim a As Range, t!
        t = Timer
        For Each a In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants).Cells
            a = Application.Trim(a)
        Next
        Debug.Print Timer - t
End Sub
[/vba]

[vba]
Code
Sub TrimSpaces()
        Dim a As Range, t!
        t = Timer
        For Each a In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants).Areas
            a = Application.Trim(a)
        Next
        Debug.Print Timer - t
End Sub
[/vba]
Саня, тут:
[vba]
Code
.Global = True: .MultiLine = True
.Pattern = "^[ " & Chr(160) & "]+": txt = .Replace(txt, "")  'с начала каждой строки
.Pattern = "\s+$": txt = .Replace(txt, "")' в конце каждой строки
[/vba]
Ниже показал, как у меня выглядит мой код.
К сообщению приложен файл: 5629390.gif (21.5 Kb)


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728


Сообщение отредактировал KuklP - Среда, 15.08.2012, 14:50
 
Ответить
СообщениеЛеш, я не поленился и выполнил свой совет:
cells: 88,625s
areas: 1,578125s
разница не очевидна? Код был такой:

[vba]
Code
Sub TrimSpaces1()
        Dim a As Range, t!
        t = Timer
        For Each a In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants).Cells
            a = Application.Trim(a)
        Next
        Debug.Print Timer - t
End Sub
[/vba]

[vba]
Code
Sub TrimSpaces()
        Dim a As Range, t!
        t = Timer
        For Each a In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants).Areas
            a = Application.Trim(a)
        Next
        Debug.Print Timer - t
End Sub
[/vba]
Саня, тут:
[vba]
Code
.Global = True: .MultiLine = True
.Pattern = "^[ " & Chr(160) & "]+": txt = .Replace(txt, "")  'с начала каждой строки
.Pattern = "\s+$": txt = .Replace(txt, "")' в конце каждой строки
[/vba]
Ниже показал, как у меня выглядит мой код.

Автор - KuklP
Дата добавления - 15.08.2012 в 14:47
nerv Дата: Среда, 15.08.2012, 14:54 | Сообщение № 28
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

кажется так (могу ошибаться, т.к. в данный момент голова соображает не очень)

[vba]
Code
With CreateObject("VBScript.RegExp")
     .MultiLine = True
     .Global = True
      
     .Pattern = "^[\xA0 ]+|[\xA0 ]+$"
     x = .Replace(x, "")
      
     .Pattern = "\x20{2,}|\xA0+"
     x = .Replace(x, " ")
End With
[/vba]


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
Сообщениекажется так (могу ошибаться, т.к. в данный момент голова соображает не очень)

[vba]
Code
With CreateObject("VBScript.RegExp")
     .MultiLine = True
     .Global = True
      
     .Pattern = "^[\xA0 ]+|[\xA0 ]+$"
     x = .Replace(x, "")
      
     .Pattern = "\x20{2,}|\xA0+"
     x = .Replace(x, " ")
End With
[/vba]

Автор - nerv
Дата добавления - 15.08.2012 в 14:54
Alex_ST Дата: Среда, 15.08.2012, 15:09 | Сообщение № 29
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Серёга, ну я же не дебил совсем чтобы утверждать, что перебор ячеек по одной не намного дольше "массивных" операций.
Я просто совсем забыл, что Replace можно применять к диапазону точно так же, как и Application.Trim cry
Тогда, конечно, получится намного быстрее.

Только мне бы по окончанию работы макроса хотелось бы выделить обработанные им ячейки (так нагляднее).
А как просто сделать Select для всех диапазонов, входящих в Area я что-то не соображу с ходу sad



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеСерёга, ну я же не дебил совсем чтобы утверждать, что перебор ячеек по одной не намного дольше "массивных" операций.
Я просто совсем забыл, что Replace можно применять к диапазону точно так же, как и Application.Trim cry
Тогда, конечно, получится намного быстрее.

Только мне бы по окончанию работы макроса хотелось бы выделить обработанные им ячейки (так нагляднее).
А как просто сделать Select для всех диапазонов, входящих в Area я что-то не соображу с ходу sad

Автор - Alex_ST
Дата добавления - 15.08.2012 в 15:09
KuklP Дата: Среда, 15.08.2012, 15:21 | Сообщение № 30
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Леш, я ничего и не имел ввиду такого:-) Просто подумал, что ты поленишься.
Quote
А как просто сделать Select для всех диапазонов, входящих в Area
- наверное наоборот - для всех area входящих в диапазон:-)
А выделить обработанные areas можно с помощью Union. Или сразу одним махом присвоить set r=....specialcells(2), а потом r.select.
Саня, я мож и дебил, но см. скрин другого моего поста в этой теме. Так может быть, если жаба отключена?
К сообщению приложен файл: 1147541.gif (19.3 Kb) · 5180466.gif (25.4 Kb)


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728


Сообщение отредактировал KuklP - Среда, 15.08.2012, 15:38
 
Ответить
СообщениеЛеш, я ничего и не имел ввиду такого:-) Просто подумал, что ты поленишься.
Quote
А как просто сделать Select для всех диапазонов, входящих в Area
- наверное наоборот - для всех area входящих в диапазон:-)
А выделить обработанные areas можно с помощью Union. Или сразу одним махом присвоить set r=....specialcells(2), а потом r.select.
Саня, я мож и дебил, но см. скрин другого моего поста в этой теме. Так может быть, если жаба отключена?

Автор - KuklP
Дата добавления - 15.08.2012 в 15:21
nerv Дата: Среда, 15.08.2012, 16:11 | Сообщение № 31
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

tongue

1. Убедись, что js включен в найстроках.
2. Перезагрузи страницу
3. Скинь код "нормального" поста в txt
4. Скинь код "зеленого" поста в txt
5. Почисти куки / кеш
6. Приберись в квартире (optional)

p.s.: чтобы скинуть код поста, надо зайти в режим редактирования поста


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba


Сообщение отредактировал nerv - Среда, 15.08.2012, 16:13
 
Ответить
Сообщениеtongue

1. Убедись, что js включен в найстроках.
2. Перезагрузи страницу
3. Скинь код "нормального" поста в txt
4. Скинь код "зеленого" поста в txt
5. Почисти куки / кеш
6. Приберись в квартире (optional)

p.s.: чтобы скинуть код поста, надо зайти в режим редактирования поста

Автор - nerv
Дата добавления - 15.08.2012 в 16:11
Alex_ST Дата: Среда, 15.08.2012, 17:26 | Сообщение № 32
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Quote (KuklP)
наверное наоборот - для всех area входящих в диапазон:-)
ну, вообще-то вхождение тут "друг в друга" (не пойми превратно biggrin )
Range -> Areas -> Range
F1: Areas Collection - a collection of the areas, or contiguous blocks of cells, within a selection. There’s no singular Area object; individual members of the Areas collection are Range objects. The Areas collection contains one Range object for each discrete, contiguous range of cells within the selection. If the selection contains only one area, the Areas collection contains a single Range object that corresponds to that selection.
А вот так, похоже, получилось совсем не плохо:[vba]
Code
Sub Trim_By_Formula()   ' применить функцию СЖПРОБЕЛЫ к видимым ячейкам выделенного диапазона
    If TypeName(Selection) <> "Range" Then Exit Sub
    'If Not TypeOf Selection Is Range Then Exit Sub
    Dim rRange As Range, rAreas As Areas
    With ActiveSheet.UsedRange
       Set rAreas = Intersect(Selection, .SpecialCells(xlCellTypeVisible), .SpecialCells(xlCellTypeConstants)).Areas
    End With
    If rAreas Is Nothing Then Exit Sub
    Application.ScreenUpdating = False
    For Each rRange In rAreas
       With rRange
          .Value = Replace(.Value, Chr(160), " ")      ' Chr(160) - неразрывный пробел
          .Value = Application.WorksheetFunction.Trim(.Value)      ' СЖПРОБЕЛЫ
          .Value = Replace(.Value, " " & Chr(10), Chr(10))      ' пробел перед LF
          .Value = Replace(.Value, Chr(10) & " ", Chr(10))      ' пробел после LF
       End With
    Next rRange
    Application.ScreenUpdating = True
    rAreas.Parent.Select
End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
Quote (KuklP)
наверное наоборот - для всех area входящих в диапазон:-)
ну, вообще-то вхождение тут "друг в друга" (не пойми превратно biggrin )
Range -> Areas -> Range
F1: Areas Collection - a collection of the areas, or contiguous blocks of cells, within a selection. There’s no singular Area object; individual members of the Areas collection are Range objects. The Areas collection contains one Range object for each discrete, contiguous range of cells within the selection. If the selection contains only one area, the Areas collection contains a single Range object that corresponds to that selection.
А вот так, похоже, получилось совсем не плохо:[vba]
Code
Sub Trim_By_Formula()   ' применить функцию СЖПРОБЕЛЫ к видимым ячейкам выделенного диапазона
    If TypeName(Selection) <> "Range" Then Exit Sub
    'If Not TypeOf Selection Is Range Then Exit Sub
    Dim rRange As Range, rAreas As Areas
    With ActiveSheet.UsedRange
       Set rAreas = Intersect(Selection, .SpecialCells(xlCellTypeVisible), .SpecialCells(xlCellTypeConstants)).Areas
    End With
    If rAreas Is Nothing Then Exit Sub
    Application.ScreenUpdating = False
    For Each rRange In rAreas
       With rRange
          .Value = Replace(.Value, Chr(160), " ")      ' Chr(160) - неразрывный пробел
          .Value = Application.WorksheetFunction.Trim(.Value)      ' СЖПРОБЕЛЫ
          .Value = Replace(.Value, " " & Chr(10), Chr(10))      ' пробел перед LF
          .Value = Replace(.Value, Chr(10) & " ", Chr(10))      ' пробел после LF
       End With
    Next rRange
    Application.ScreenUpdating = True
    rAreas.Parent.Select
End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 15.08.2012 в 17:26
KuklP Дата: Среда, 15.08.2012, 17:28 | Сообщение № 33
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Да Саш, потестил твой код на том же примере, что предлагал Алексею. Твой короче, но по времени немного проигрывает моему. Тестил только на скорость, не на качество. И в таком контексте его вообще(ни твой, ни мой) использовать не стоит. Он с треском проигрывает даже коду Леши. С areas не работает. Но как пример использования regexp, очень даже подходяще.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеДа Саш, потестил твой код на том же примере, что предлагал Алексею. Твой короче, но по времени немного проигрывает моему. Тестил только на скорость, не на качество. И в таком контексте его вообще(ни твой, ни мой) использовать не стоит. Он с треском проигрывает даже коду Леши. С areas не работает. Но как пример использования regexp, очень даже подходяще.

Автор - KuklP
Дата добавления - 15.08.2012 в 17:28
KuklP Дата: Среда, 15.08.2012, 18:34 | Сообщение № 34
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Quote (Alex_ST)
ну, вообще-то вхождение тут "друг в друга" (не пойми превратно )
Леш, давай вместе:-) У меня твой код спотыкается на каждой строке в предложенном тебе примере. Вариант(дешево и сердито):
[vba]
Code
Sub Trim_By_Formula()   ' применить функцию СЖПРОБЕЛЫ к видимым ячейкам выделенного диапазона
        If TypeName(Selection) <> "Range" Then Exit Sub
        'If Not TypeOf Selection Is Range Then Exit Sub
        Dim rRange As Range, r As Range
        With ActiveSheet.UsedRange
            Set r = Intersect(Selection, .SpecialCells(xlCellTypeVisible), .SpecialCells(xlCellTypeConstants))
        End With
        Application.ScreenUpdating = False
        With r
            .Replace Chr(160), " ", xlPart' Нефиг это в цикле делать!
            For Each rRange In .Areas
                rRange.Value = Application.Trim(rRange.Value)      ' СЖПРОБЕЛЫ
            Next
            .Replace " " & Chr(10), Chr(10), xlPart      ' пробел перед LF
            .Replace Chr(10) & " ", Chr(10), xlPart       ' пробел после LF
            .Select
        End With
        Application.ScreenUpdating = True
End Sub
[/vba]
Леш, так это отработало на моем примере(10000*30) за 3,453125 сек. Это не 88(причем без замены начальных и конечных пробелов).


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728


Сообщение отредактировал KuklP - Среда, 15.08.2012, 18:44
 
Ответить
Сообщение
Quote (Alex_ST)
ну, вообще-то вхождение тут "друг в друга" (не пойми превратно )
Леш, давай вместе:-) У меня твой код спотыкается на каждой строке в предложенном тебе примере. Вариант(дешево и сердито):
[vba]
Code
Sub Trim_By_Formula()   ' применить функцию СЖПРОБЕЛЫ к видимым ячейкам выделенного диапазона
        If TypeName(Selection) <> "Range" Then Exit Sub
        'If Not TypeOf Selection Is Range Then Exit Sub
        Dim rRange As Range, r As Range
        With ActiveSheet.UsedRange
            Set r = Intersect(Selection, .SpecialCells(xlCellTypeVisible), .SpecialCells(xlCellTypeConstants))
        End With
        Application.ScreenUpdating = False
        With r
            .Replace Chr(160), " ", xlPart' Нефиг это в цикле делать!
            For Each rRange In .Areas
                rRange.Value = Application.Trim(rRange.Value)      ' СЖПРОБЕЛЫ
            Next
            .Replace " " & Chr(10), Chr(10), xlPart      ' пробел перед LF
            .Replace Chr(10) & " ", Chr(10), xlPart       ' пробел после LF
            .Select
        End With
        Application.ScreenUpdating = True
End Sub
[/vba]
Леш, так это отработало на моем примере(10000*30) за 3,453125 сек. Это не 88(причем без замены начальных и конечных пробелов).

Автор - KuklP
Дата добавления - 15.08.2012 в 18:34
Alex_ST Дата: Среда, 15.08.2012, 21:28 | Сообщение № 35
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Quote (KuklP)
У меня твой код спотыкается на каждой строке
Странно... У меня всё работает.
Правда, я обычно применяю не сокращённую запись Application.Trim , а полную: Application.WorksheetFunction.Trim, т.к. у меня самого при сокращенной форме иногда начинает спотыкаться.
Завтра на работе помучаю в разных позах твой пример (дома не могу).



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
Quote (KuklP)
У меня твой код спотыкается на каждой строке
Странно... У меня всё работает.
Правда, я обычно применяю не сокращённую запись Application.Trim , а полную: Application.WorksheetFunction.Trim, т.к. у меня самого при сокращенной форме иногда начинает спотыкаться.
Завтра на работе помучаю в разных позах твой пример (дома не могу).

Автор - Alex_ST
Дата добавления - 15.08.2012 в 21:28
KuklP Дата: Четверг, 16.08.2012, 00:11 | Сообщение № 36
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Да Application.Trim как раз работает на ура. Вот это:
[vba]
Code
With rRange  
           .Value = Replace(.Value, Chr(160), " ")      ' Chr(160)
[/vba] для диапазона не работает. Так можно обработать строковое значение, но не диапазон. А вот так работает:
[vba]
Code
With r  
             .Replace Chr(160), " ", xlPart
[/vba] Это встроенный метод для диапазона(ctrl+h).


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеДа Application.Trim как раз работает на ура. Вот это:
[vba]
Code
With rRange  
           .Value = Replace(.Value, Chr(160), " ")      ' Chr(160)
[/vba] для диапазона не работает. Так можно обработать строковое значение, но не диапазон. А вот так работает:
[vba]
Code
With r  
             .Replace Chr(160), " ", xlPart
[/vba] Это встроенный метод для диапазона(ctrl+h).

Автор - KuklP
Дата добавления - 16.08.2012 в 00:11
Alex_ST Дата: Четверг, 16.08.2012, 08:56 | Сообщение № 37
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Да, Серёга, ты абсолютно прав!
Я упёрся в функцию VBA Replace , а про метод диапазона Replace совсем забыл angry

В итоге у тебя получилась процедура вполне компактная и шустрая.
Спасибо, Серёга! Кладу её к себе в Personal в замен старой.

Только я у себя ещё добавил отключение/включение событий чтобы другие макросы не реагировали на замены:[vba]
Code
Sub Trim_By_Formula()   ' применить функцию СЖПРОБЕЛЫ к видимым ячейкам выделенного диапазона
    If TypeName(Selection) <> "Range" Then Exit Sub
    'If Not TypeOf Selection Is Range Then Exit Sub
    Dim rRng As Range, rSubRng As Range
    With ActiveSheet.UsedRange
       Set rRng = Intersect(Selection, .SpecialCells(xlCellTypeVisible), .SpecialCells(xlCellTypeConstants))
    End With
    Application.ScreenUpdating = False: Application.EnableEvents = False
    With rRng
       .Replace Chr(160), " ", xlPart   ' Chr(160) - неразрывный пробел
       For Each rSubRng In .Areas
          rSubRng.Value = Application.Trim(rSubRng.Value)   ' СЖПРОБЕЛЫ
       Next
       .Replace " " & Chr(10), Chr(10), xlPart   ' пробел перед LF
       .Replace Chr(10) & " ", Chr(10), xlPart  ' пробел после LF
       .Select
    End With
    Application.ScreenUpdating = True: Application.EnableEvents = True
End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Четверг, 16.08.2012, 09:08
 
Ответить
СообщениеДа, Серёга, ты абсолютно прав!
Я упёрся в функцию VBA Replace , а про метод диапазона Replace совсем забыл angry

В итоге у тебя получилась процедура вполне компактная и шустрая.
Спасибо, Серёга! Кладу её к себе в Personal в замен старой.

Только я у себя ещё добавил отключение/включение событий чтобы другие макросы не реагировали на замены:[vba]
Code
Sub Trim_By_Formula()   ' применить функцию СЖПРОБЕЛЫ к видимым ячейкам выделенного диапазона
    If TypeName(Selection) <> "Range" Then Exit Sub
    'If Not TypeOf Selection Is Range Then Exit Sub
    Dim rRng As Range, rSubRng As Range
    With ActiveSheet.UsedRange
       Set rRng = Intersect(Selection, .SpecialCells(xlCellTypeVisible), .SpecialCells(xlCellTypeConstants))
    End With
    Application.ScreenUpdating = False: Application.EnableEvents = False
    With rRng
       .Replace Chr(160), " ", xlPart   ' Chr(160) - неразрывный пробел
       For Each rSubRng In .Areas
          rSubRng.Value = Application.Trim(rSubRng.Value)   ' СЖПРОБЕЛЫ
       Next
       .Replace " " & Chr(10), Chr(10), xlPart   ' пробел перед LF
       .Replace Chr(10) & " ", Chr(10), xlPart  ' пробел после LF
       .Select
    End With
    Application.ScreenUpdating = True: Application.EnableEvents = True
End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 16.08.2012 в 08:56
Alex_ST Дата: Понедельник, 11.02.2013, 12:02 | Сообщение № 38
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Ещё чуть навёл красоты:[vba]
Код
Sub Trim_By_Formula()   ' применить функцию СЖПРОБЕЛЫ к видимым ячейкам выделенного диапазона
    Dim rRng As Range, rSubRng As Range
    Set rRng = Intersect(ActiveWindow.RangeSelection.SpecialCells(xlCellTypeVisible), ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants))
    If rRng Is Nothing Then Exit Sub
    Application.ScreenUpdating = False: Application.EnableEvents = False
    With rRng
       .Replace Chr(160), " ", xlPart   ' Chr(160) - неразрывный пробел
       For Each rSubRng In .Areas
          rSubRng.Value = Application.Trim(rSubRng)   ' СЖПРОБЕЛЫ
       Next
       .Replace " " & Chr(10), Chr(10), xlPart   ' пробел перед LF
       .Replace Chr(10) & " ", Chr(10), xlPart  ' пробел после LF
       .Select
    End With
    Application.ScreenUpdating = True: Application.EnableEvents = True
End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеЕщё чуть навёл красоты:[vba]
Код
Sub Trim_By_Formula()   ' применить функцию СЖПРОБЕЛЫ к видимым ячейкам выделенного диапазона
    Dim rRng As Range, rSubRng As Range
    Set rRng = Intersect(ActiveWindow.RangeSelection.SpecialCells(xlCellTypeVisible), ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants))
    If rRng Is Nothing Then Exit Sub
    Application.ScreenUpdating = False: Application.EnableEvents = False
    With rRng
       .Replace Chr(160), " ", xlPart   ' Chr(160) - неразрывный пробел
       For Each rSubRng In .Areas
          rSubRng.Value = Application.Trim(rSubRng)   ' СЖПРОБЕЛЫ
       Next
       .Replace " " & Chr(10), Chr(10), xlPart   ' пробел перед LF
       .Replace Chr(10) & " ", Chr(10), xlPart  ' пробел после LF
       .Select
    End With
    Application.ScreenUpdating = True: Application.EnableEvents = True
End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 11.02.2013 в 12:02
Мир MS Excel » Вопросы и решения » Готовые решения » Макрос "Trim_By_Formula" (Применить функцию СЖПРОБЕЛЫ к ячейкам выделенного диапазона)
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!