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

Вход

Регистрация

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

 

= Мир MS Excel/Макрос - сжпробелы + заменить пробелы на абзацы - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Макрос - сжпробелы + заменить пробелы на абзацы
DJ_Marker_MC Дата: Пятница, 07.12.2012, 16:35 | Сообщение № 1
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Всем привет. Ребята, помогите допилить макрос, его действие: находит лишние пробелы в выделенном диапазоне и заменяет их на абзацы.
Хочу дописать msgbox который спросит, хочу ли я заменять единичный пробел на абзац если нет то сжать пробелы и закончить макрос, если же ДА то сжать пробелы и заменить единичный пробел на абзац, вот что есть:

[vba]
Code
Sub Trim_By_Formula() ' применить функцию СЖПРОБЕЛЫ к ячейкам выделенного диапазона
  Dim iCell As Range, rRange As Range
  Set rRange = Intersect(Selection, ActiveSheet.UsedRange)
  Application.ScreenUpdating = False
  For Each iCell In rRange
  With iCell
     If .EntireRow.Height > 0 _
         And Not (.HasFormula) _
         And Not IsDate(.Value) _
         And Not .NumberFormat Like "*" & ":" & "*" Then 'если строка не скрыта и в ячейке не формула, не дата, не время
         .Value = Application.WorksheetFunction.Trim(.Value)
     End If
   
  k = MsgBox("Хотите заменить ПРОБЕЛ на АБЗАЦ?", Buttons:=vbYesNo)
  Caption = k
   
     If k = 6 Then
   
             'chr(10) - это знак абзаца - тут заменяем пробелы на абзацы и выравниваем по центру
             .Replace What:=" ", Replacement:=Chr(10), LookAt:=xlPart, SearchOrder:= _
                     xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
             With Selection
             .HorizontalAlignment = xlCenter
             .VerticalAlignment = xlCenter
             End With
     Else
     End If

  End With
  Next

  Application.ScreenUpdating = True
  rRange.Select
   

  End Sub
[/vba]

Всё бы хорошо только этот msgbox должен выдать запрос лишь один раз, а он выдает мне запрос на попытку корректировки каждой ячейки. Подправьте пожалуйста, чтоб если нажал ДА то это ДА было для всех ячеек, если нет, то сжало во всех ячейках пробелы и стоп.
p.s. - код до меседжбокса не мой, где брал если честно не помню (или тут или на планете)


Сообщение отредактировал marker_mc - Пятница, 07.12.2012, 16:39
 
Ответить
СообщениеВсем привет. Ребята, помогите допилить макрос, его действие: находит лишние пробелы в выделенном диапазоне и заменяет их на абзацы.
Хочу дописать msgbox который спросит, хочу ли я заменять единичный пробел на абзац если нет то сжать пробелы и закончить макрос, если же ДА то сжать пробелы и заменить единичный пробел на абзац, вот что есть:

[vba]
Code
Sub Trim_By_Formula() ' применить функцию СЖПРОБЕЛЫ к ячейкам выделенного диапазона
  Dim iCell As Range, rRange As Range
  Set rRange = Intersect(Selection, ActiveSheet.UsedRange)
  Application.ScreenUpdating = False
  For Each iCell In rRange
  With iCell
     If .EntireRow.Height > 0 _
         And Not (.HasFormula) _
         And Not IsDate(.Value) _
         And Not .NumberFormat Like "*" & ":" & "*" Then 'если строка не скрыта и в ячейке не формула, не дата, не время
         .Value = Application.WorksheetFunction.Trim(.Value)
     End If
   
  k = MsgBox("Хотите заменить ПРОБЕЛ на АБЗАЦ?", Buttons:=vbYesNo)
  Caption = k
   
     If k = 6 Then
   
             'chr(10) - это знак абзаца - тут заменяем пробелы на абзацы и выравниваем по центру
             .Replace What:=" ", Replacement:=Chr(10), LookAt:=xlPart, SearchOrder:= _
                     xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
             With Selection
             .HorizontalAlignment = xlCenter
             .VerticalAlignment = xlCenter
             End With
     Else
     End If

  End With
  Next

  Application.ScreenUpdating = True
  rRange.Select
   

  End Sub
[/vba]

Всё бы хорошо только этот msgbox должен выдать запрос лишь один раз, а он выдает мне запрос на попытку корректировки каждой ячейки. Подправьте пожалуйста, чтоб если нажал ДА то это ДА было для всех ячеек, если нет, то сжало во всех ячейках пробелы и стоп.
p.s. - код до меседжбокса не мой, где брал если честно не помню (или тут или на планете)

Автор - DJ_Marker_MC
Дата добавления - 07.12.2012 в 16:35
Michael_S Дата: Пятница, 07.12.2012, 19:14 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
[vba]
Code
Sub Trim_By_Formula() ' применить функцию СЖПРОБЕЛЫ к ячейкам выделенного диапазона
   Dim iCell As Range, rRange As Range
Set rRange = Intersect(Selection, ActiveSheet.UsedRange)
Application.ScreenUpdating = False    

     k = MsgBox("Хотите заменить ПРОБЕЛ на АБЗАЦ?", Buttons:=vbYesNo)
     Caption = k

         If k = 6 Then

For Each iCell In rRange
With iCell
                 'chr(10) - это знак абзаца - тут заменяем пробелы на абзацы и выравниваем по центру
                 .Replace What:=" ", Replacement:=Chr(10), LookAt:=xlPart, SearchOrder:= _
                         xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
                 With Selection
                 .HorizontalAlignment = xlCenter
                 .VerticalAlignment = xlCenter
                 End With
         Else
      
             If .EntireRow.Height > 0 _
                 And Not (.HasFormula) _
                 And Not IsDate(.Value) _
                 And Not .NumberFormat Like "*" & ":" & "*" Then 'если строка не скрыта и в ячейке не формула, не дата, не время
                 .Value = Application.WorksheetFunction.Trim(.Value)
             End If

         End If

End With
Next

     Application.ScreenUpdating = True
     rRange.Select

End Sub
[/vba]


Сообщение отредактировал Michael_S - Пятница, 07.12.2012, 19:22
 
Ответить
Сообщение[vba]
Code
Sub Trim_By_Formula() ' применить функцию СЖПРОБЕЛЫ к ячейкам выделенного диапазона
   Dim iCell As Range, rRange As Range
Set rRange = Intersect(Selection, ActiveSheet.UsedRange)
Application.ScreenUpdating = False    

     k = MsgBox("Хотите заменить ПРОБЕЛ на АБЗАЦ?", Buttons:=vbYesNo)
     Caption = k

         If k = 6 Then

For Each iCell In rRange
With iCell
                 'chr(10) - это знак абзаца - тут заменяем пробелы на абзацы и выравниваем по центру
                 .Replace What:=" ", Replacement:=Chr(10), LookAt:=xlPart, SearchOrder:= _
                         xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
                 With Selection
                 .HorizontalAlignment = xlCenter
                 .VerticalAlignment = xlCenter
                 End With
         Else
      
             If .EntireRow.Height > 0 _
                 And Not (.HasFormula) _
                 And Not IsDate(.Value) _
                 And Not .NumberFormat Like "*" & ":" & "*" Then 'если строка не скрыта и в ячейке не формула, не дата, не время
                 .Value = Application.WorksheetFunction.Trim(.Value)
             End If

         End If

End With
Next

     Application.ScreenUpdating = True
     rRange.Select

End Sub
[/vba]

Автор - Michael_S
Дата добавления - 07.12.2012 в 19:14
Alex_ST Дата: Пятница, 07.12.2012, 20:34 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
Интересно, почему вопрос по макросу задаётся в ветке "Вопросы..." самостоятельным топиком, а не там, где взят его первоисточник - в "Готовых решениях", топике Макрос "Trim_By_Formula" ?



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеИнтересно, почему вопрос по макросу задаётся в ветке "Вопросы..." самостоятельным топиком, а не там, где взят его первоисточник - в "Готовых решениях", топике Макрос "Trim_By_Formula" ?

Автор - Alex_ST
Дата добавления - 07.12.2012 в 20:34
Serge_007 Дата: Пятница, 07.12.2012, 20:36 | Сообщение № 4
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Могу перенести


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеМогу перенести

Автор - Serge_007
Дата добавления - 07.12.2012 в 20:36
Alex_ST Дата: Пятница, 07.12.2012, 20:39 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

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



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


Сообщение отредактировал Alex_ST - Пятница, 07.12.2012, 20:39
 
Ответить
СообщениеНа твоё усмотрение, Серёга. Тем более, что топик-стартер, похоже, взял оттуда мой изначальный вариант, да и забыл, откуда брал и не посмотрел, что там уже давно всё сильно усовершенствовано.

Автор - Alex_ST
Дата добавления - 07.12.2012 в 20:39
Serge_007 Дата: Пятница, 07.12.2012, 20:45 | Сообщение № 6
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
В данном случае решение принимаешь ты, как правообладатель ®


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеВ данном случае решение принимаешь ты, как правообладатель ®

Автор - Serge_007
Дата добавления - 07.12.2012 в 20:45
Alex_ST Дата: Пятница, 07.12.2012, 20:51 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
Пущай здесь остаётся. Утонет со временем и никто моих давних корявеньких попыток не увидит.
Да и вот такой перл:
[vba]
Code
k = MsgBox("Хотите заменить ПРОБЕЛ на АБЗАЦ?", Buttons:=vbYesNo)
Caption = k
If k = 6 Then
[/vba]вместо простого [vba]
Code
If MsgBox("Хотите заменить ПРОБЕЛ на АБЗАЦ?", vbYesNo)=vbYes Then
[/vba] мне никто приписывать не будет.

Нехай здесь тонет!



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеПущай здесь остаётся. Утонет со временем и никто моих давних корявеньких попыток не увидит.
Да и вот такой перл:
[vba]
Code
k = MsgBox("Хотите заменить ПРОБЕЛ на АБЗАЦ?", Buttons:=vbYesNo)
Caption = k
If k = 6 Then
[/vba]вместо простого [vba]
Code
If MsgBox("Хотите заменить ПРОБЕЛ на АБЗАЦ?", vbYesNo)=vbYes Then
[/vba] мне никто приписывать не будет.

Нехай здесь тонет!

Автор - Alex_ST
Дата добавления - 07.12.2012 в 20:51
DJ_Marker_MC Дата: Пятница, 07.12.2012, 23:39 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Alex_ST, прошу прощение, я правда не мог вспомнить откуда взял макрос.

Michael_S, не работает, выдает ошибку.
 
Ответить
СообщениеAlex_ST, прошу прощение, я правда не мог вспомнить откуда взял макрос.

Michael_S, не работает, выдает ошибку.

Автор - DJ_Marker_MC
Дата добавления - 07.12.2012 в 23:39
Alex_ST Дата: Суббота, 08.12.2012, 23:19 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
marker_mc,
Просто возьмите макрос ОТСЮДА и в конце перед [vba]
Code
.Select
[/vba] (или вместо него, если не хотите чтобы макрос показал с какими ячейками работал) добавьте строку:
[vba]
Code
If MsgBox("Хотите заменить ПРОБЕЛ на АБЗАЦ?", vbYesNo)=vbYes Then .Replace " ", vbLf, xlPart
[/vba]
или, уж если Вам так нравится использовать цифровые значения встроенных констант Excel'я вместо их имён, то такую:
[vba]
Code
If MsgBox("Хотите заменить ПРОБЕЛ на АБЗАЦ?", 4)-7 Then .Replace " ", Chr(10), 2
[/vba]



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


Сообщение отредактировал Alex_ST - Суббота, 08.12.2012, 23:24
 
Ответить
Сообщение marker_mc,
Просто возьмите макрос ОТСЮДА и в конце перед [vba]
Code
.Select
[/vba] (или вместо него, если не хотите чтобы макрос показал с какими ячейками работал) добавьте строку:
[vba]
Code
If MsgBox("Хотите заменить ПРОБЕЛ на АБЗАЦ?", vbYesNo)=vbYes Then .Replace " ", vbLf, xlPart
[/vba]
или, уж если Вам так нравится использовать цифровые значения встроенных констант Excel'я вместо их имён, то такую:
[vba]
Code
If MsgBox("Хотите заменить ПРОБЕЛ на АБЗАЦ?", 4)-7 Then .Replace " ", Chr(10), 2
[/vba]

Автор - Alex_ST
Дата добавления - 08.12.2012 в 23:19
DJ_Marker_MC Дата: Воскресенье, 09.12.2012, 23:50 | Сообщение № 10
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
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 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
       
      'vbLf = Chr(10) = пробел
      If MsgBox("Хотите заменить ПРОБЕЛ на АБЗАЦ?", vbYesNo) = vbYes Then .Replace " ", vbLf, xlPart
      .Select
      .HorizontalAlignment = xlCenter
      .VerticalAlignment = xlBottom
      .VerticalAlignment = xlCenter
      End With
      Application.ScreenUpdating = True: Application.EnableEvents = True
End Sub
[/vba]


Сообщение отредактировал marker_mc - Воскресенье, 09.12.2012, 23:54
 
Ответить
Сообщение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 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
       
      'vbLf = Chr(10) = пробел
      If MsgBox("Хотите заменить ПРОБЕЛ на АБЗАЦ?", vbYesNo) = vbYes Then .Replace " ", vbLf, xlPart
      .Select
      .HorizontalAlignment = xlCenter
      .VerticalAlignment = xlBottom
      .VerticalAlignment = xlCenter
      End With
      Application.ScreenUpdating = True: Application.EnableEvents = True
End Sub
[/vba]

Автор - DJ_Marker_MC
Дата добавления - 09.12.2012 в 23:50
Alex_ST Дата: Понедельник, 10.12.2012, 08:45 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
marker_mc,
1. А зачем Вы сначала текст в ячейках опускаете при помощи .VerticalAlignment = xlBottom , а потом сразу же поднимаете на середину при помощи .VerticalAlignment = xlCenter ?
2. Вы макрос будете применять только в данном конкретном документе, а не положите его в Personal и не сделаете для его вызова кнопочку?
Ну, тогда можно и выравнивание оставить в нём.
Но если всё-таки делать его универсальным, то [vba]
Code
    .HorizontalAlignment = xlCenter
     .VerticalAlignment = xlCenter
[/vba]лучше всё-таки из него убрать.
Да хоть в отдельный макрос в одну строчку с кнопкой для его вызова на панели управления [vba]
Code
Sub Text_Center(): Selection.VerticalAlignment = xlCenter: End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщениеmarker_mc,
1. А зачем Вы сначала текст в ячейках опускаете при помощи .VerticalAlignment = xlBottom , а потом сразу же поднимаете на середину при помощи .VerticalAlignment = xlCenter ?
2. Вы макрос будете применять только в данном конкретном документе, а не положите его в Personal и не сделаете для его вызова кнопочку?
Ну, тогда можно и выравнивание оставить в нём.
Но если всё-таки делать его универсальным, то [vba]
Code
    .HorizontalAlignment = xlCenter
     .VerticalAlignment = xlCenter
[/vba]лучше всё-таки из него убрать.
Да хоть в отдельный макрос в одну строчку с кнопкой для его вызова на панели управления [vba]
Code
Sub Text_Center(): Selection.VerticalAlignment = xlCenter: End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 10.12.2012 в 08:45
DJ_Marker_MC Дата: Понедельник, 10.12.2012, 15:25 | Сообщение № 12
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
нет, как раз он будет в Personal, и будет кнопочка)))
 
Ответить
Сообщениенет, как раз он будет в Personal, и будет кнопочка)))

Автор - DJ_Marker_MC
Дата добавления - 10.12.2012 в 15:25
Alex_ST Дата: Понедельник, 10.12.2012, 15:29 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
А... Значит, у Вас все документы, обрабатываемые Excel'ем, имеют "ориентацию" горизонтально по центру? biggrin



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


Сообщение отредактировал Alex_ST - Понедельник, 10.12.2012, 15:30
 
Ответить
СообщениеА... Значит, у Вас все документы, обрабатываемые Excel'ем, имеют "ориентацию" горизонтально по центру? biggrin

Автор - Alex_ST
Дата добавления - 10.12.2012 в 15:29
DJ_Marker_MC Дата: Среда, 12.12.2012, 19:10 | Сообщение № 14
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
нет))) просто данный макрос был нужен для конкретной ситуации, а когда центровка не понадобится я её сделаю просто неактивной и буду юзать в других местах где нужно будет просто например позжимать пробелы
 
Ответить
Сообщениенет))) просто данный макрос был нужен для конкретной ситуации, а когда центровка не понадобится я её сделаю просто неактивной и буду юзать в других местах где нужно будет просто например позжимать пробелы

Автор - DJ_Marker_MC
Дата добавления - 12.12.2012 в 19:10
  • Страница 1 из 1
  • 1
Поиск:

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