Страницы: 1 2 След.
RSS
Макрос удаления лишних пробелов в Excel
 
Добрый день уважаемые знатоки Excel и VBA в частности.
На работе нужен макрос, который бы проверял каждую строчку в столбце I и удалял лишние пробелы в каждой ячейке данного столбца, если они конечно есть.
Вот написал следующий код:
Код
Sub DeleteSpaces()
'Удаляет лишние пробелы в столбце I
Application.ScreenUpdating = False
Dim poz As Range
Dim Ans As Integer
Dim Config As Integer
Config = vbYesNo + vbQuestion + vbDefaultButton2
Ans = MsgBox("Вы действительно хотите удалить лишние пробелы во всех значениях столбца I ?" & Chr(13) & "Данное действие необходимо выполнять при каждом импорте новых значений", Config)
Select Case Ans
    Case vbYes
For Each poz In Range("I1:I2000"
poz.Value = Trim$(poz)
Next poz
 MsgBox "Ошибки успешно исправлены" & Chr(13) & "*лишние пробелы удалены"
 Case vbNo
 End Select
End Sub
Макрос успешно справляется со своей задачей, но работает очень долго, в особенности когда объем файла превышает 100 строк.

Помогите пожалуйста оптимизировать код так, чтобы макрос работал быстрее, если это возможно.
Спасибо.
 
Код
With Range("I1", Cells(Rows.Count, "I").End(xlUp))
    .Value = Evaluate("INDEX(TRIM(" & .Address & "),)")
End With
 
Если не ошибаюсь, то можно еще так:
Код
With Range("I1", Cells(Rows.Count, "I").End(xlUp))
    .Value = Application.Trim(.Value)
End With
В принципе подход тот же.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Казанский, The_Prist, спасибо большое. Как говориться - все гениальное просто !  :)
 
Забыл добавить ложку дегтя в примечание к своему коду. Код Казанского лучше, т.к. обработает любую строку.
Мой код не работает в случае, если длина строки внутри ячейке больше 255 символов.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Добрый день. А можно переделать этот макрос, чтоб он удалял не лишние, а все пробелы в выделенных ячейках?
Изменено: fvg - 10.12.2014 22:57:44
 
Вариант:
Код
Sub DeleteSpace()
Dim rCell As Range
    For Each rCell In Selection
        rCell = Replace(rCell, " ", "")
    Next
End Sub
 
 
Юрий М, все работает, cпасибо большое!  
 
Эээ... А цикл-то зачем? Достаточно
Код
Selection.Replace " ", ""
 
Цитата
The_Prist написал: End With
красавчик Пирст))) помогло мне наконецто, ато целый день мучился))
 
Цитата
camypai написал: красавчик Пирст
Так еще Диму никто не обзывал :D
Я сам - дурнее всякого примера! ...
 
еще вариант макроса ,кнопка vvv
 
Код
Sub vvv()
   Dim z, j&
   z = Range("I1:I" & Range("I" & Rows.Count).End(xlUp).Row).Value
With CreateObject("VBScript.RegExp"): .Pattern = "\s": .Global = True
  For j = 1 To UBound(z)
     If .test(z(j, 1)) Then z(j, 1) = .Replace(z(j, 1), "")
   Next
  Range("I1").Resize(UBound(z), 1).Value = z
End With
End Sub
 
Как удалить пробелы внутри числа (неразрывный пробел) с помощью макроса. Сейчас использую «Найти и Заменить», так как формулу =СЖПРОБЕЛЫ(ПОДСТАВИТЬ(J5;СИМВОЛ(160);"";1))*1 использовать в моем случае не удобно.
 
lazareva!
Посмотрите эту тему
 
Спасибо, Мотя. Пробел забрала, но проблема не решена, сума не считает.
 
Как профессионально решить проблему - я не знаю.
Советую создать новую тему на формуме: она непременно привлечет специалистов.
Примитивный вариант:
1. скопировать столб с данными в "Блокнот",
2. выделить Ваш "пробел",
3. в "Блокноте" в режиме "Заменить" избавиться от него в Ваших данных,
4. из "Блокнота" вернуть данные в Excel.
 
Не, Матреш, будем проще :)
Выделите столбец с корявыми числами - данные - текст по столбцам - ок.
Ну или в окне Immeiate:
Код
[j:j].texttocolumns
Изменено: kuklp - 19.05.2016 16:27:49
Я сам - дурнее всякого примера! ...
 
Спасибо, kuklp, сработало (окно Immeiate)! Остался один вопрос. Данные в документ вносятся каждый день. Что делать после ввода новых данных?
Изменено: lazareva - 19.05.2016 17:41:34
 
Да хоть то же самое. Или можете оформить его макросом, повесить на кнопку:
Код
sub www(): [j:j].texttocolumns: end sub
Я сам - дурнее всякого примера! ...
 
Мне стыдно,что я научилась только копировать макросы, а написать самой трудновато. Немножко потрудившись, вот что получилось. Работает, но мня не устраивает то что надо выделять диапазон перед выполнением макроса. Диапазонов у меня много и они разбросаны. Как сделать так, чтоб он работал в столбце I и столбце J пока не разобралась. Еще нужно учесть, что в этих столбцах будут данные, которые уже прошли через макрос

Код
Sub удалить_неразрывный_пробел()
Dim rCell As Range
    For Each rCell In Selection
        rCell = Replace(rCell, Chr(160), "")
        rCell.TextToColumns
    Next
End Sub
Изменено: lazareva - 20.05.2016 09:35:41
 
Код
Public Sub www()
    With Intersect(ActiveSheet.UsedRange, [i:j])
        .Replace Chr(160), "", 2
        .Replace ",", ".", 2
    End With
End Sub
Я сам - дурнее всякого примера! ...
 
kuklp, большое спасибо! То что надо!
 
Вариант:
Код
Public Sub www()
        Intersect(ActiveSheet.UsedRange, [i:j]).Replace Chr(160), "", 2
        Intersect(ActiveSheet.UsedRange, [i:i]).TextToColumns
        Intersect(ActiveSheet.UsedRange, [j:j]).TextToColumns
End Sub
Я сам - дурнее всякого примера! ...
 
Подскажите, пожалуйста, как переделать код Казанского, чтобы он выполнялся не только в отдельном столбце, а в произвольно выбранном диапазоне?
 
Казанский, The_Prist, Спасибо ОГРОМНОЕ! Очень мне помогли ваши решения.
 
Цитата
Казанский написал:
With Range("I1", Cells(Rows.Count, "I").End(xlUp))
  .Value = Evaluate("INDEX(TRIM(" & .Address & "),)")
End With
Добрый день. Как в данном макросе задать только видимый диапазон ячеек столбца I ? Дело в том, что на столбце A стоит автофильтр и часть строк скрыто, поэтому надо, чтобы обрабатывались только видимые ячейки
 
DARR, у меня получилось так
Код
Sub csg()
Dim iCell As Range
For Each iCell In Range("I1", Cells(Rows.Count, "I").End(xlUp))
   If iCell.EntireRow.Hidden = False Then
      iCell.Value = Application.Trim(iCell.Value)
   End If
 Next
End Sub
 
Так д.б. шустрей:
Код
Sub www()
    Dim a As Range
    For Each a In Range("I1", Cells(Rows.Count, "I").End(xlUp)).SpecialCells(12).Areas
        a.Value = Application.Trim(a.Value)
    Next
End Sub
Я сам - дурнее всякого примера! ...
 
Добавлю, что Application.Trim при применении к массиву равен по скорости применению в прямом цикле, только запись короче
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
kuklp, casag, супер! спасибо!
Страницы: 1 2 След.
Наверх