Vba excel удалить все пробелы в ячейке

Удаление лишних пробелов из строк с помощью кода VBA Excel. Функции LTrim, RTrim, Trim. Встроенная функция рабочего листа и пользовательская функция. Пример.

  • LTrim(строка) — удаление пробелов слева;
  • RTrim(строка) — удаление пробелов справа;
  • Trim(строка) — удаление пробелов слева и справа.

Встроенная функция рабочего листа

Функция VBA Trim удаляет пробелы только по краям строки, не затрагивая двойные, тройные и т.д. пробелы внутри текста. Для удаления всех лишних пробелов следует использовать встроенную функцию Trim рабочего листа Excel.

Синтаксис функции Trim рабочего листа:

WorksheetFunction.Trim(строка)

Пользовательская функция

Можно бороться с лишними пробелами и с помощью пользовательской функции:

Function myTrim(text As String) As String

‘Удаляем пробелы слева и справа строки

  text = Trim(text)

‘Удаляем лишние пробелы внутри строки

    Do While InStr(text, »  «)

      text = Replace(text, »  «, » «)

    Loop

  myTrim = text

End Function

Пример удаления лишних пробелов

Сократим лишние пробелы в одной и той же строке с помощью функции Trim VBA, встроенной функции Trim рабочего листа Excel, пользовательской функции myTrim и сравним результаты.

Sub Primer()

Dim a1 As String

a1 = »  Жили   у     бабуси «

MsgBox Trim(a1) & vbCrLf _

& WorksheetFunction.Trim(a1) _

& vbCrLf & myTrim(a1)

End Sub

Чтобы код примера сработал без ошибок, код пользовательской функции myTrim должен быть добавлен в тот же модуль.

 

pinguindell

Пользователь

Сообщений: 200
Регистрация: 01.01.1970

#1

16.05.2013 09:54:10

Добрый день уважаемые знатоки 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 строк.

Помогите пожалуйста оптимизировать код так, чтобы макрос работал быстрее, если это возможно.
Спасибо.

Прикрепленные файлы

  • Example.xlsm (19.11 КБ)

 

Казанский

Пользователь

Сообщений: 8839
Регистрация: 11.01.2013

#2

16.05.2013 10:05:26

Код
With Range("I1", Cells(Rows.Count, "I").End(xlUp))
    .Value = Evaluate("INDEX(TRIM(" & .Address & "),)")
End With
 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#3

16.05.2013 10:19:37

Если не ошибаюсь, то можно еще так:

Код
With Range("I1", Cells(Rows.Count, "I").End(xlUp))
    .Value = Application.Trim(.Value)
End With

В принципе подход тот же.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Казанский, The_Prist, спасибо большое. Как говориться — все гениальное просто !  :)

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Забыл добавить ложку дегтя в примечание к своему коду. Код Казанского лучше, т.к. обработает любую строку.
Мой код не работает в случае, если длина строки внутри ячейке больше 255 символов.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

fvg

Пользователь

Сообщений: 33
Регистрация: 10.12.2014

Добрый день. А можно переделать этот макрос, чтоб он удалял не лишние, а все пробелы в выделенных ячейках?

Изменено: fvg10.12.2014 22:57:44

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#7

10.12.2014 14:31:30

Вариант:

Код
Sub DeleteSpace()
Dim rCell As Range
    For Each rCell In Selection
        rCell = Replace(rCell, " ", "")
    Next
End Sub
 
 

fvg

Пользователь

Сообщений: 33
Регистрация: 10.12.2014

Юрий М, все работает, cпасибо большое!  

 

Влад

Пользователь

Сообщений: 1189
Регистрация: 24.12.2012

#9

10.12.2014 16:14:39

Эээ… А цикл-то зачем? Достаточно

Код
Selection.Replace " ", ""
 

camypai

Пользователь

Сообщений: 32
Регистрация: 25.12.2015

#10

18.04.2016 15:09:53

Цитата
The_Prist написал: End With

красавчик Пирст))) помогло мне наконецто, ато целый день мучился))

 

kuklp

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

#11

18.04.2016 15:36:35

Цитата
camypai написал: красавчик Пирст

Так еще Диму никто не обзывал :D

Я сам — дурнее всякого примера! …

 

sv2013

Пользователь

Сообщений: 657
Регистрация: 09.06.2015

#12

18.04.2016 17:26:05

еще вариант макроса ,кнопка 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

Прикрепленные файлы

  • example_19_04_2016_pl_пробел.xls (39 КБ)

 

lazareva

Пользователь

Сообщений: 8
Регистрация: 23.12.2014

Как удалить пробелы внутри числа (неразрывный пробел) с помощью макроса. Сейчас использую «Найти и Заменить», так как формулу =СЖПРОБЕЛЫ(ПОДСТАВИТЬ(J5;СИМВОЛ(160);»»;1))*1 использовать в моем случае не удобно.

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

 

lazareva

Пользователь

Сообщений: 8
Регистрация: 23.12.2014

Спасибо,

Мотя

. Пробел забрала, но проблема не решена, сума не считает.

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

Как профессионально решить проблему — я не знаю.
Советую создать новую тему на формуме: она непременно привлечет специалистов.
Примитивный вариант:
1. скопировать столб с данными в «Блокнот»,
2. выделить Ваш «пробел»,
3. в «Блокноте» в режиме «Заменить» избавиться от него в Ваших данных,
4. из «Блокнота» вернуть данные в Excel.

 

kuklp

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

#17

19.05.2016 16:24:26

Не, Матреш, будем проще :)
Выделите столбец с корявыми числами — данные — текст по столбцам — ок.
Ну или в окне Immeiate:

Код
[j:j].texttocolumns

Изменено: kuklp19.05.2016 16:27:49

Я сам — дурнее всякого примера! …

 

lazareva

Пользователь

Сообщений: 8
Регистрация: 23.12.2014

Спасибо,

kuklp

, сработало (окно Immeiate)! Остался один вопрос. Данные в документ вносятся каждый день. Что делать после ввода новых данных?

Изменено: lazareva19.05.2016 17:41:34

 

kuklp

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

#19

19.05.2016 17:44:58

Да хоть то же самое. Или можете оформить его макросом, повесить на кнопку:

Код
sub www(): [j:j].texttocolumns: end sub

Я сам — дурнее всякого примера! …

 

lazareva

Пользователь

Сообщений: 8
Регистрация: 23.12.2014

#20

20.05.2016 09:33:50

Мне стыдно,что я научилась только копировать макросы, а написать самой трудновато. Немножко потрудившись, вот что получилось. Работает, но мня не устраивает то что надо выделять диапазон перед выполнением макроса. Диапазонов у меня много и они разбросаны. Как сделать так, чтоб он работал в столбце I и столбце J пока не разобралась. Еще нужно учесть, что в этих столбцах будут данные, которые уже прошли через макрос

Код
Sub удалить_неразрывный_пробел()
Dim rCell As Range
    For Each rCell In Selection
        rCell = Replace(rCell, Chr(160), "")
        rCell.TextToColumns
    Next
End Sub

Изменено: lazareva20.05.2016 09:35:41

 

kuklp

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

#21

20.05.2016 09:42:43

Код
Public Sub www()
    With Intersect(ActiveSheet.UsedRange, [i:j])
        .Replace Chr(160), "", 2
        .Replace ",", ".", 2
    End With
End Sub

Я сам — дурнее всякого примера! …

 

lazareva

Пользователь

Сообщений: 8
Регистрация: 23.12.2014

kuklp

, большое спасибо! То что надо!

 

kuklp

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

#23

20.05.2016 09:51:39

Вариант:

Код
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

Я сам — дурнее всякого примера! …

 

IvI80

Пользователь

Сообщений: 36
Регистрация: 04.09.2017

Подскажите, пожалуйста, как переделать код Казанского, чтобы он выполнялся не только в отдельном столбце, а в произвольно выбранном диапазоне?

 

GroshevDV

Пользователь

Сообщений: 16
Регистрация: 27.03.2018

Казанский, The_Prist, Спасибо ОГРОМНОЕ! Очень мне помогли ваши решения.

 

DARR

Пользователь

Сообщений: 42
Регистрация: 10.02.2016

#26

15.07.2019 12:58:12

Цитата
Казанский написал:
With Range(«I1», Cells(Rows.Count, «I»).End(xlUp))
  .Value = Evaluate(«INDEX(TRIM(» & .Address & «),)»)
End With

Добрый день. Как в данном макросе задать только видимый диапазон ячеек столбца I ? Дело в том, что на столбце A стоит автофильтр и часть строк скрыто, поэтому надо, чтобы обрабатывались только видимые ячейки

 

casag

Пользователь

Сообщений: 175
Регистрация: 11.06.2018

#27

15.07.2019 16:53:16

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
 

kuklp

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

#28

15.07.2019 17:05:00

Так д.б. шустрей:

Код
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

Я сам — дурнее всякого примера! …

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Добавлю, что Application.Trim при применении к массиву равен по скорости применению в прямом цикле, только запись короче

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

DARR

Пользователь

Сообщений: 42
Регистрация: 10.02.2016

#30

16.07.2019 08:01:56

kuklp, casag, супер! спасибо!

In this Article

  • Trim Function
    • Trim Spaces Before and After Text
    • Trim Multiple Spaces Before and After Text
    • VBA Trim will NOT Remove Multiple Spaces Between Words
    • Trim as a Worksheet Function
    • Use Worksheet Trim Function in VBA
    • Difference Between WorksheetFunction.Trim and VBA Trim
    • Use VBA to add Trim Function in a Range
    • LTrim Function
    • RTrim Function
    • Remove all spaces from text

This tutorial will demonstrate how to use the Trim, LTrim, and RTrim VBA functions as well as the Trim worksheet function.

Trim Function

The VBA Trim function removes (“trims”) erroneous spaces before and after strings of text.

Trim Spaces Before and After Text

The VBA Trim function will remove spaces before and after strings of text:

Sub TrimExample_1()
MsgBox Trim(" I love excel ")		
'Result is: "I love excel"

MsgBox Trim(" I love excel")		
'Result is: "I love excel"

MsgBox Trim("I love excel ")		
'Result is: "I love excel"
End Sub

Trim Multiple Spaces Before and After Text

This includes trimming multiple spaces before and after text:

Sub TrimExample_2()
MsgBox Trim("     I love excel          ")		
'Result is: "I love excel"

MsgBox Trim("      I love excel")			
'Result is: "I love excel"

MsgBox Trim("I love excel             ")		
'Result is: "I love excel"
End Sub

VBA Trim will NOT Remove Multiple Spaces Between Words

However, the Trim function will not remove multiple spaces in between words:

Sub TrimExample_3()
MsgBox Trim("     I love    excel          ")		
'Result is: "I love    excel"

MsgBox Trim("      I  love excel")			
'Result is: "I  love excel"

MsgBox Trim("I love        excel             ")		
'Result is: "I love        excel"
End Sub

Trim as a Worksheet Function

However, the Excel Trim worksheet function can be used to remove extra spaces between words:

trim worksheet remove extra spaces

Use Worksheet Trim Function in VBA

To use the Excel Trim Function in VBA, call it by using WorksheetFunction:

Sub TrimExample_4()
Msgbox WorksheetFunction.Trim("     I love    excel          ")	
'Result is: "I love excel"

Msgbox WorksheetFunction.Trim("      I  love excel")		
'Result is: "I love excel"

Msgbox WorksheetFunction.Trim("I love        excel             ")	
'Result is: "I love excel"
End Sub

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

automacro

Learn More

Difference Between WorksheetFunction.Trim and VBA Trim

This will demonstrate the differences between Trim and WorksheetFunction.Trim:

Sub TrimExample_5()
Msgbox WorksheetFunction.Trim("     I love    excel          ")	
'Result is: "I love excel"
Msgbox Trim("     I love    excel          ")				
'Result is: "I love    excel"

Msgbox WorksheetFunction.Trim("      I  love excel")		
'Result is: "I love excel"
Msgbox Trim("      I  love excel")					
'Result is: "I  love excel"

Msgbox WorksheetFunction.Trim("I love        excel             ")	
'Result is: "I love excel"
Msgbox Trim("I love        excel             ")				
'Result is: "I love        excel"

End Sub

Use VBA to add Trim Function in a Range

The Trim Worksheet function can be added in a Range using property .Formula:

Sub TrimExample_6()
ThisWorkbook.Worksheets("Sheet1").Range("B1").Formula = "=trim(A1)"		
End Sub

LTrim Function

The LTrim function removes spaces only from the left side of the word:

Sub TrimExample_7()
MsgBox LTrim(" I love excel ")			
'Result is: "I love excel "

MsgBox LTrim(" I love excel")			
'Result is: "I love excel"

MsgBox LTrim("I love excel ")			
'Result is: "I love excel "

MsgBox LTrim("   I love   excel   ")		
'Result is: "I love   excel   "

MsgBox LTrim("   I   love excel")			
'Result is: "I   love excel"

MsgBox LTrim("I love    excel   ")			
'Result is: "I love    excel    "
End Sub

VBA Programming | Code Generator does work for you!

RTrim Function

The RTrim function removes spaces only from the right side of the word:

Sub TrimExample_8()
MsgBox RTrim(" I love excel ")			
'Result is: " I love excel"

MsgBox RTrim(" I love excel")			
'Result is: " I love excel"

MsgBox RTrim("I love excel ")			
'Result is: "I love excel"

MsgBox RTrim("   I love   excel   ")		
'Result is: "   I love   excel"

MsgBox RTrim("    I    love excel")		
'Result is: "    I    love excel"

MsgBox RTrim("I    love excel    ")		
'Result is: "I     love excel    "
End Sub

Trim, Ltrim and Rtrim do not remove spaces between words.

Remove all spaces from text

Trim will only remove extra spaces in between words, but to remove all spaces in a string of text, you can use the Replace Function:

Sub ReplaceExample ()
MsgBox Replace("     I love     excel ", " ", "")		
'Result is: "Iloveexcel"
End Sub

Are all your other functions leaving whitespace behind?

Get CleanUltra!

CleanUltra removes all whitespace and non-printable characters including whitespace left behind by other functions!

I hope you find this useful. Any improvements are welcome!

Function CleanUltra( _
       ByVal stringToClean As String, _
       Optional ByVal removeSpacesBetweenWords As Boolean = False) _
        As String
' Removes non-printable characters and whitespace from a string


' Remove the 1 character vbNullChar. This must be done first
'  if the string contains vbNullChar
    stringToClean = Replace(stringToClean, vbNullChar, vbNullString)

    ' Remove non-printable characters.
    stringToClean = Application.Clean(stringToClean)

    ' Remove all spaces except single spaces between words
    stringToClean = Application.Trim(stringToClean)

    If removeSpacesBetweenWords = True Then _
       stringToClean = Replace(stringToClean, " ", vbNullString)

    CleanUltra = stringToClean
End Function

Here’s an example of it’s usage:

Sub Example()
    Dim myVar As String
    myVar = " abc d e  "

    MsgBox CleanUltra(myVar)
End Sub

Here’s a test I ran to verify that the function actually removed all whitespace. vbNullChar was particularly devious. I had to set the function to remove it first, before the CLEAN and TRIM functions were used to stop them from removing all characters after the vbNullChar.

Sub Example()
    Dim whitespaceSample As String
    Dim myVar As String

' Examples of various types of whitespace
'  (vbNullChar is particularly devious!)
    whitespaceSample = vbNewLine & _
                       vbCrLf & _
                       vbVerticalTab & _
                       vbFormFeed & _
                       vbCr & _
                       vbLf & _
                       vbNullChar

    myVar = "     1234" & _
            whitespaceSample & _
            "     56      " & _
            "789     "

    Debug.Print "ORIGINAL"
    Debug.Print myVar
    Debug.Print "Character Count: " & Len(myVar)


    Debug.Print
    Debug.Print "CLEANED, Option FALSE"


    Debug.Print CleanUltra(myVar)
    Debug.Print CleanUltra(myVar, False)
    '   Both of these perform the same action.  If the optional parameter to
    '   remove spaces between words is left blank it defaults to FALSE.
    '   Whitespace is removed but spaces between words are preserved.
    Debug.Print "Character Count: " & Len(CleanUltra(myVar))


    Debug.Print
    Debug.Print "CLEANED, Option TRUE"

    Debug.Print CleanUltra(myVar, True)
    '   Optional parameter to remove spaces between words is set to TRUE.
    '   Whitespace and all spaces between words are removed.
    Debug.Print "Character Count: " & Len(CleanUltra(myVar, True))

End Sub

I created a macro for removing all whitespace in a string, specifically an email address. However it only removes about 95% of the whitespace, and leaves a few.

My code:

Sub NoSpaces()
    Dim w As Range

    For Each w In Selection.Cells
        w = Replace(w, " ", "")
    Next
End Sub

Things I have tried to solve the issue include:

~ Confirmed the spaces are indeed spaces with the Code function, it is character 32 (space)
~ Used a substitute macro in conjuction with the replace macro
~ Have additional macro utilizing Trim function to remove leading and trailing whitespace
~ Made a separate macro to test for non-breaking spaces (character 160)
~ Used the Find and Replace feature to search and replace spaces with nothing. Confirmed working.

I only have one cell selected when I run the macro. It selects and goes through all the cells because of the Selection.Cells part of the code.

A few examples:

1 STAR MOVING @ ATT.NET
322 TRUCKING@GMAIL.COM
ALEZZZZ@AOL. COM. 

These just contain regular whitespace, but are skipped over.

Понравилась статья? Поделить с друзьями:
  • Vba excel удалить все кнопки с листа
  • Vba excel удалить все данные с листа
  • Vba excel удаление ячеек по условию
  • Vba excel текст на кнопке
  • Vba excel текст кнопки