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

Вход

Регистрация

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

 

= Мир MS Excel/Макрос "Trim_By_Formula" - Мир MS Excel

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

2003
Макрос Trim_By_Formula применяет функцию листа СЖПРОБЕЛЫ к ячейкам выделенного диапазона.
В результате из текстовых значений ячеек удаляются все лидирующие, финиширующие пробелы.
Каждый из многократно повторяющихся пробелов внутри текста ячейки заменяется на единичный пробел.
Скрытые (невидимые) ячейки и ячейки, содержащие формулы, дату и время макросом игнорируются.
[vba]
Код
Sub Trim_By_Formula()   ' применить функцию СЖПРОБЕЛЫ к ячейкам выделенного диапазона
     If TypeName(Selection) <> "Range" Then Exit Sub
     Dim iCell As Range, rRange As Range
     With ActiveSheet.Cells
        Set rRange = Intersect(Selection, ActiveSheet.UsedRange, .SpecialCells(xlCellTypeVisible), .SpecialCells(xlCellTypeConstants))
     End With
     If rRange Is Nothing Then Exit Sub
     Application.ScreenUpdating = False
     For Each iCell In rRange
        With iCell
           If Not IsDate(.Value) And Not .NumberFormat Like "*" & ":" & "*" Then    'если  в ячейке не дата и не время
              .Value = Application.WorksheetFunction.Trim(.Value)
           End If
        End With
     Next
     Application.ScreenUpdating = True
     rRange.Select
End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеМакрос Trim_By_Formula применяет функцию листа СЖПРОБЕЛЫ к ячейкам выделенного диапазона.
В результате из текстовых значений ячеек удаляются все лидирующие, финиширующие пробелы.
Каждый из многократно повторяющихся пробелов внутри текста ячейки заменяется на единичный пробел.
Скрытые (невидимые) ячейки и ячейки, содержащие формулы, дату и время макросом игнорируются.
[vba]
Код
Sub Trim_By_Formula()   ' применить функцию СЖПРОБЕЛЫ к ячейкам выделенного диапазона
     If TypeName(Selection) <> "Range" Then Exit Sub
     Dim iCell As Range, rRange As Range
     With ActiveSheet.Cells
        Set rRange = Intersect(Selection, ActiveSheet.UsedRange, .SpecialCells(xlCellTypeVisible), .SpecialCells(xlCellTypeConstants))
     End With
     If rRange Is Nothing Then Exit Sub
     Application.ScreenUpdating = False
     For Each iCell In rRange
        With iCell
           If Not IsDate(.Value) And Not .NumberFormat Like "*" & ":" & "*" Then    'если  в ячейке не дата и не время
              .Value = Application.WorksheetFunction.Trim(.Value)
           End If
        End With
     Next
     Application.ScreenUpdating = True
     rRange.Select
End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 30.08.2010 в 11:49
KuklP Дата: Воскресенье, 12.08.2012, 20:21 | Сообщение № 2
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Леш, как-то я не обращал внимания на тему... Когда-то на форуме(не помню где) я предложил такую конструкцию:
[vba]
Code
Public Sub www()
      ActiveSheet.UsedRange.SpecialCells(2).Value = Application.Trim(ActiveSheet.UsedRange.SpecialCells(2).Value)
End Sub
[/vba]
Она делала для темы все как надо, однако твой тезка Казанский резонно предположил, что SpecialCells(2) может состоять из нескольких диапазонов. Тогда моя конструкция просто запортит данные. И предложил свой вариант:
[vba]
Code
Sub TrimSpaces()
      Dim a As Range
      For Each a In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants).Areas
          a = Application.Trim(a)
      Next
End Sub
[/vba]
Так гораздо быстрей, чем если перебирать по одной ячейке. Пример прилагаю.
PS А зачем ты пропускал даты и время? Я в пример специально в А1 поставил дату-время.
К сообщению приложен файл: Application_Tri.xls (37.5 Kb)


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


Сообщение отредактировал KuklP - Воскресенье, 12.08.2012, 20:21
 
Ответить
СообщениеЛеш, как-то я не обращал внимания на тему... Когда-то на форуме(не помню где) я предложил такую конструкцию:
[vba]
Code
Public Sub www()
      ActiveSheet.UsedRange.SpecialCells(2).Value = Application.Trim(ActiveSheet.UsedRange.SpecialCells(2).Value)
End Sub
[/vba]
Она делала для темы все как надо, однако твой тезка Казанский резонно предположил, что SpecialCells(2) может состоять из нескольких диапазонов. Тогда моя конструкция просто запортит данные. И предложил свой вариант:
[vba]
Code
Sub TrimSpaces()
      Dim a As Range
      For Each a In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants).Areas
          a = Application.Trim(a)
      Next
End Sub
[/vba]
Так гораздо быстрей, чем если перебирать по одной ячейке. Пример прилагаю.
PS А зачем ты пропускал даты и время? Я в пример специально в А1 поставил дату-время.

Автор - KuklP
Дата добавления - 12.08.2012 в 20:21
Alex_ST Дата: Вторник, 14.08.2012, 23:04 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Quote (KuklP)
А зачем ты пропускал даты и время?
Серёга, ты обратил внимание, когда пост был мною написан? 2 года назад. Глупый был, не опытный biggrin
Сейчас макрос выглядит несколько по-другому:
[vba]
Code
Sub Trim_By_Formula()   ' применить функцию СЖПРОБЕЛЫ к видимым ячейкам выделенного диапазона
     If TypeName(Selection) <> "Range" Then Exit Sub
     Dim rCell As Range, rRange As Range
     With ActiveSheet.Cells
         Set rRange = Intersect(Selection, ActiveSheet.UsedRange, .SpecialCells(xlCellTypeVisible), .SpecialCells(xlCellTypeConstants))
     End With
     If rRange Is Nothing Then Exit Sub
     Application.ScreenUpdating = False
     For Each rCell In rRange
         With rCell
             .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 rCell
     Application.ScreenUpdating = True
     rRange.Select
End Sub
[/vba]
я сам про этот топик уже забыл давно, поэтому и не подправил sad



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
Quote (KuklP)
А зачем ты пропускал даты и время?
Серёга, ты обратил внимание, когда пост был мною написан? 2 года назад. Глупый был, не опытный biggrin
Сейчас макрос выглядит несколько по-другому:
[vba]
Code
Sub Trim_By_Formula()   ' применить функцию СЖПРОБЕЛЫ к видимым ячейкам выделенного диапазона
     If TypeName(Selection) <> "Range" Then Exit Sub
     Dim rCell As Range, rRange As Range
     With ActiveSheet.Cells
         Set rRange = Intersect(Selection, ActiveSheet.UsedRange, .SpecialCells(xlCellTypeVisible), .SpecialCells(xlCellTypeConstants))
     End With
     If rRange Is Nothing Then Exit Sub
     Application.ScreenUpdating = False
     For Each rCell In rRange
         With rCell
             .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 rCell
     Application.ScreenUpdating = True
     rRange.Select
End Sub
[/vba]
я сам про этот топик уже забыл давно, поэтому и не подправил sad

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

[vba]
Code
If TypeName(Selection) <> "Range" Then Exit Sub
' ===
If Not TypeOf Selection Is Range Then Exit Sub
[/vba]
smile


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


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
Сообщение[vba]
Code
If TypeName(Selection) <> "Range" Then Exit Sub
' ===
If Not TypeOf Selection Is Range Then Exit Sub
[/vba]
smile

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

2003
Ну и что ты этим хотел сказать?
ИМХО, это монопенисуально biggrin .
Разница ровно в 1 символ по длине кода. TypeName и TypeOf я применяю рэндомно (какой первым в голову придёт). А на счёт скорости у меня данных нет.
К стати, у меня на рабочем компе несколько сокращённый вариант:
[vba]
Code
Sub Trim_By_Formula()   ' применить функцию СЖПРОБЕЛЫ к видимым ячейкам выделенного диапазона
    If TypeName(Selection) <> "Range" Then Exit Sub
    Dim rCell As Range, rRange As Range
    With ActiveSheet.UsedRange
       Set rRange = Intersect(Selection, .SpecialCells(xlCellTypeVisible), .SpecialCells(xlCellTypeConstants))
    End With
    If rRange Is Nothing Then Exit Sub
    Application.ScreenUpdating = False
    For Each rCell In rRange
       With rCell
          .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 rCell
    Application.ScreenUpdating = True
    rRange.Select
End Sub
[/vba]
Вот если бы ты предложил RegExp вместо Replace и Application.Trim, то, наверное, было бы красиво.
Я, к сожалению, RegExp так толком и не осилил. А ковыряться в чужих не совсем подходящих и переделывать их лень.



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеНу и что ты этим хотел сказать?
ИМХО, это монопенисуально biggrin .
Разница ровно в 1 символ по длине кода. TypeName и TypeOf я применяю рэндомно (какой первым в голову придёт). А на счёт скорости у меня данных нет.
К стати, у меня на рабочем компе несколько сокращённый вариант:
[vba]
Code
Sub Trim_By_Formula()   ' применить функцию СЖПРОБЕЛЫ к видимым ячейкам выделенного диапазона
    If TypeName(Selection) <> "Range" Then Exit Sub
    Dim rCell As Range, rRange As Range
    With ActiveSheet.UsedRange
       Set rRange = Intersect(Selection, .SpecialCells(xlCellTypeVisible), .SpecialCells(xlCellTypeConstants))
    End With
    If rRange Is Nothing Then Exit Sub
    Application.ScreenUpdating = False
    For Each rCell In rRange
       With rCell
          .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 rCell
    Application.ScreenUpdating = True
    rRange.Select
End Sub
[/vba]
Вот если бы ты предложил RegExp вместо Replace и Application.Trim, то, наверное, было бы красиво.
Я, к сожалению, RegExp так толком и не осилил. А ковыряться в чужих не совсем подходящих и переделывать их лень.

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

Quote (Alex_ST)
Ну и что ты этим хотел сказать?

вообще-то, ничего smile Отправил сообщение с утра, за завтраком. Но раз ты завел речь о скорости:

[vba]
Code
Sub io()

     Set cell = ActiveCell
      
     tm = Timer
     For i = 1 To 1000000
         bool = TypeName(cell) = "Range"
     Next
     MsgBox Timer - tm
      
      
     tm = Timer
     For i = 1 To 1000000
         bool = TypeOf cell Is Range
     Next
     MsgBox Timer - tm
      
End Sub
[/vba]

Quote (Alex_ST)
Вот если бы ты предложил RegExp вместо Replace и Application.Trim

\s+ заменить на пробел


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


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
Сообщение
Quote (Alex_ST)
Ну и что ты этим хотел сказать?

вообще-то, ничего smile Отправил сообщение с утра, за завтраком. Но раз ты завел речь о скорости:

[vba]
Code
Sub io()

     Set cell = ActiveCell
      
     tm = Timer
     For i = 1 To 1000000
         bool = TypeName(cell) = "Range"
     Next
     MsgBox Timer - tm
      
      
     tm = Timer
     For i = 1 To 1000000
         bool = TypeOf cell Is Range
     Next
     MsgBox Timer - tm
      
End Sub
[/vba]

Quote (Alex_ST)
Вот если бы ты предложил RegExp вместо Replace и Application.Trim

\s+ заменить на пробел

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

2003
Quote (nerv)
\s+
это не обработает неразрывные пробелы, но зато убьёт все переносы строк.
А мне нужно лечить текст, а не калечить biggrin



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


Сообщение отредактировал Alex_ST - Среда, 15.08.2012, 12:38
 
Ответить
Сообщение
Quote (nerv)
\s+
это не обработает неразрывные пробелы, но зато убьёт все переносы строк.
А мне нужно лечить текст, а не калечить biggrin

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

2003-2010
Сань, в Лешкиной программе TypeName используется всего один раз, а не 1000000, так что разницы ты не почувствуешь.
Цитата (nerv)
\s+ заменить на пробел
и заменит все переносы строки, зато оставит начальные и конечные пробелы:-(
Такой вариант (мож кто получше паттерн подскажет):
[vba]
Код
Function rgTrim(ByVal txt$) As String
With CreateObject("VBScript.RegExp")
.Global = True: .MultiLine = True
.Pattern = "^[ " & Chr(160) & "]+": txt = .Replace(txt, "")
.Pattern = "\s+$": txt = .Replace(txt, "")
.Pattern = "[ " & Chr(160) & "]+": rgTrim = .Replace(txt$, " ")
End With
End Function
[vba]

Пример использования:
[vba]
Код
Public Sub www()
         For Each c In Selection.SpecialCells(2, 2)
             c.Value = rgTrim$(c.Value)
         Next
End Sub
[/vba]


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


Сообщение отредактировал KuklP - Среда, 15.08.2012, 14:16
 
Ответить
СообщениеСань, в Лешкиной программе TypeName используется всего один раз, а не 1000000, так что разницы ты не почувствуешь.
Цитата (nerv)
\s+ заменить на пробел
и заменит все переносы строки, зато оставит начальные и конечные пробелы:-(
Такой вариант (мож кто получше паттерн подскажет):
[vba]
Код
Function rgTrim(ByVal txt$) As String
With CreateObject("VBScript.RegExp")
.Global = True: .MultiLine = True
.Pattern = "^[ " & Chr(160) & "]+": txt = .Replace(txt, "")
.Pattern = "\s+$": txt = .Replace(txt, "")
.Pattern = "[ " & Chr(160) & "]+": rgTrim = .Replace(txt$, " ")
End With
End Function
[vba]

Пример использования:
[vba]
Код
Public Sub www()
         For Each c In Selection.SpecialCells(2, 2)
             c.Value = rgTrim$(c.Value)
         Next
End Sub
[/vba]

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

2003
Здорово, Серёга!
Обедаем, по форумам шарим? biggrin
Я тоже добрался с бутербродом в левой руке и мышкой в правой.
Твой паттерн получается длиннее чем последовательное применение простых и всем понятных Replace и Application.Trim
Так что, наверное, не имеет смысла и трогать уже имеющийся и многократно проверенный макрос



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

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

Alex_ST, я не понял, что тебе нужно. Сформулируй задачу )

Quote (KuklP)
Сань, в Лешкиной программе TypeName используется всего один раз, а не 1000000, так что разницы ты не почувствуешь.

Не сомневаюсь, но вместе с тем считаю, что правильно проверять тип объекта именно так.

Quote (KuklP)
зато оставит начальные и конечные пробелы:-(

ну, заверни в TRIM smile


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


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
СообщениеAlex_ST, я не понял, что тебе нужно. Сформулируй задачу )

Quote (KuklP)
Сань, в Лешкиной программе TypeName используется всего один раз, а не 1000000, так что разницы ты не почувствуешь.

Не сомневаюсь, но вместе с тем считаю, что правильно проверять тип объекта именно так.

Quote (KuklP)
зато оставит начальные и конечные пробелы:-(

ну, заверни в TRIM smile

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

2003-2010
Привет Леш, Саня, все. Да вроде не длинней. И подозреваю, что работать будет быстрей. Хотя, если бы ты изменил по моему совету cells на areas, это утверждение потребовало бы доказательств:-)


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


Сообщение отредактировал KuklP - Среда, 15.08.2012, 12:53
 
Ответить
СообщениеПривет Леш, Саня, все. Да вроде не длинней. И подозреваю, что работать будет быстрей. Хотя, если бы ты изменил по моему совету cells на areas, это утверждение потребовало бы доказательств:-)

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

2003-2010
Quote (nerv)
ну, заверни в TRIM
а trim уберет неразрывные? А у переносов строки?


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


Сообщение отредактировал KuklP - Среда, 15.08.2012, 12:57
 
Ответить
Сообщение
Quote (nerv)
ну, заверни в TRIM
а trim уберет неразрывные? А у переносов строки?

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

KuklP, если воспользоваться предложенной моей регой + Trim
Quote (Alex_ST)
из текстовых значений ячеек удаляются все лидирующие, финиширующие пробелы.
Каждый из многократно повторяющихся пробелов внутри текста ячейки заменяется на единичный пробел.


Кстати
[vba]
Code
Chr(160) === "\xA0"
[/vba]


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


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba


Сообщение отредактировал nerv - Среда, 15.08.2012, 12:59
 
Ответить
СообщениеKuklP, если воспользоваться предложенной моей регой + Trim
Quote (Alex_ST)
из текстовых значений ячеек удаляются все лидирующие, финиширующие пробелы.
Каждый из многократно повторяющихся пробелов внутри текста ячейки заменяется на единичный пробел.


Кстати
[vba]
Code
Chr(160) === "\xA0"
[/vba]

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

2003-2010
Quote (KuklP)
и заменит все переносы строки


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
Сообщение
Quote (KuklP)
и заменит все переносы строки

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

так что ли?) Я не пойму, что надо )

[vba]
Code
Sub io()
     x = " " & Chr(160) & Chr(160) & vbNewLine & vbLf
      
     With CreateObject("VBScript.RegExp")
         .Pattern = "[\s\xA0]+"
         x = .Replace(x, " ")
     End With
      
     MsgBox Len(x)
End Sub
[/vba]


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


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
Сообщениетак что ли?) Я не пойму, что надо )

[vba]
Code
Sub io()
     x = " " & Chr(160) & Chr(160) & vbNewLine & vbLf
      
     With CreateObject("VBScript.RegExp")
         .Pattern = "[\s\xA0]+"
         x = .Replace(x, " ")
     End With
      
     MsgBox Len(x)
End Sub
[/vba]

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

2003
Quote (KuklP)
А че код так коряво оформляет(форум)?

Мой стартовый пост был оформлен 30.08.2010, а тэга {vba} и реги для его обработки тогда ещё не существовало. Поэтому процедура в том посте заключена в простые одинарные тэги {code}

А по поводу Areas замечание, конечно, правильное, можно будет и подпилить. Но у меня как-то пока ни разу не возникала потребность выделить несколько областей, а потом их почистить от пробелов.
А вообще - не помешает, наверное… Сделаем. Не проблема.



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
Quote (KuklP)
А че код так коряво оформляет(форум)?

Мой стартовый пост был оформлен 30.08.2010, а тэга {vba} и реги для его обработки тогда ещё не существовало. Поэтому процедура в том посте заключена в простые одинарные тэги {code}

А по поводу Areas замечание, конечно, правильное, можно будет и подпилить. Но у меня как-то пока ни разу не возникала потребность выделить несколько областей, а потом их почистить от пробелов.
А вообще - не помешает, наверное… Сделаем. Не проблема.

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

2003
Quote (nerv)
.Pattern = "[\s\xA0]+"

\s - любой пробельный символ кроме неразрывных пробелов, включая табуляцию, перевод строки, возврат каретки, перевод страницы.



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
Quote (nerv)
.Pattern = "[\s\xA0]+"

\s - любой пробельный символ кроме неразрывных пробелов, включая табуляцию, перевод строки, возврат каретки, перевод страницы.

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

аааааааааааа, задача то в чем??? Мне кто-нибудь объяснит? wacko

Quote (Alex_ST)
неразрывных пробелов

[vba]
Code
Chr(160) === "\xA0"
[/vba]


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


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba


Сообщение отредактировал nerv - Среда, 15.08.2012, 13:23
 
Ответить
Сообщениеаааааааааааа, задача то в чем??? Мне кто-нибудь объяснит? wacko

Quote (Alex_ST)
неразрывных пробелов

[vba]
Code
Chr(160) === "\xA0"
[/vba]

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

2003-2010
Леша, вижу ты не понимаешь, о чем я говорю. Когда ты в range указываешь:
.SpecialCells(xlCellTypeConstants), этот самый range может разделиться на несколько areas. Так вот вместо того, чтоб циклить по одной ячейке, за один проход будет обрабатываться целая область. Так гораздо быстрей.


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

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

2003-2010
Quote (nerv)
Мне кто-нибудь объяснит?
Саша, ты что по Лешиному коду не видишь? А по моему? Он убирает лидирующие, замыкающие, множественные пробелы, то же до и после переносов строк, но сами переносы оставляет нетронутыми.


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

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

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