Всем привет. Ребята, помогите допилить макрос, его действие: находит лишние пробелы в выделенном диапазоне и заменяет их на абзацы. Хочу дописать 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. - код до меседжбокса не мой, где брал если честно не помню (или тут или на планете)
Всем привет. Ребята, помогите допилить макрос, его действие: находит лишние пробелы в выделенном диапазоне и заменяет их на абзацы. Хочу дописать 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
Сообщение отредактировал marker_mc - Пятница, 07.12.2012, 16:39
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]
[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
Интересно, почему вопрос по макросу задаётся в ветке "Вопросы..." самостоятельным топиком, а не там, где взят его первоисточник - в "Готовых решениях", топике Макрос "Trim_By_Formula" ?
Интересно, почему вопрос по макросу задаётся в ветке "Вопросы..." самостоятельным топиком, а не там, где взят его первоисточник - в "Готовых решениях", топике Макрос "Trim_By_Formula" ?Alex_ST
На твоё усмотрение, Серёга. Тем более, что топик-стартер, похоже, взял оттуда мой изначальный вариант, да и забыл, откуда брал и не посмотрел, что там уже давно всё сильно усовершенствовано.
На твоё усмотрение, Серёга. Тем более, что топик-стартер, похоже, взял оттуда мой изначальный вариант, да и забыл, откуда брал и не посмотрел, что там уже давно всё сильно усовершенствовано.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Пятница, 07.12.2012, 20:39
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]
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
marker_mc, 1. А зачем Вы сначала текст в ячейках опускаете при помощи .VerticalAlignment = xlBottom , а потом сразу же поднимаете на середину при помощи .VerticalAlignment = xlCenter ? 2. Вы макрос будете применять только в данном конкретном документе, а не положите его в Personal и не сделаете для его вызова кнопочку? Ну, тогда можно и выравнивание оставить в нём. Но если всё-таки делать его универсальным, то [vba]
[/vba]лучше всё-таки из него убрать. Да хоть в отдельный макрос в одну строчку с кнопкой для его вызова на панели управления [vba]
Code
Sub Text_Center(): Selection.VerticalAlignment = xlCenter: End Sub
[/vba]
marker_mc, 1. А зачем Вы сначала текст в ячейках опускаете при помощи .VerticalAlignment = xlBottom , а потом сразу же поднимаете на середину при помощи .VerticalAlignment = xlCenter ? 2. Вы макрос будете применять только в данном конкретном документе, а не положите его в Personal и не сделаете для его вызова кнопочку? Ну, тогда можно и выравнивание оставить в нём. Но если всё-таки делать его универсальным, то [vba]
нет))) просто данный макрос был нужен для конкретной ситуации, а когда центровка не понадобится я её сделаю просто неактивной и буду юзать в других местах где нужно будет просто например позжимать пробелы
нет))) просто данный макрос был нужен для конкретной ситуации, а когда центровка не понадобится я её сделаю просто неактивной и буду юзать в других местах где нужно будет просто например позжимать пробелыDJ_Marker_MC