pinguindell Пользователь Сообщений: 200 |
#1 16.05.2013 09:54:10 Добрый день уважаемые знатоки Excel и VBA в частности.
Макрос успешно справляется со своей задачей, но работает очень долго, в особенности когда объем файла превышает 100 строк. Помогите пожалуйста оптимизировать код так, чтобы макрос работал быстрее, если это возможно. Прикрепленные файлы
|
||
Казанский Пользователь Сообщений: 8839 |
#2 16.05.2013 10:05:26
|
||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#3 16.05.2013 10:19:37 Если не ошибаюсь, то можно еще так:
В принципе подход тот же. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
Казанский, The_Prist, спасибо большое. Как говориться — все гениальное просто ! |
|
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
Забыл добавить ложку дегтя в примечание к своему коду. Код Казанского лучше, т.к. обработает любую строку. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
fvg Пользователь Сообщений: 33 |
Добрый день. А можно переделать этот макрос, чтоб он удалял не лишние, а все пробелы в выделенных ячейках? Изменено: fvg — 10.12.2014 22:57:44 |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#7 10.12.2014 14:31:30 Вариант:
|
||
fvg Пользователь Сообщений: 33 |
Юрий М, все работает, cпасибо большое! |
Влад Пользователь Сообщений: 1189 |
#9 10.12.2014 16:14:39 Эээ… А цикл-то зачем? Достаточно
|
||
camypai Пользователь Сообщений: 32 |
#10 18.04.2016 15:09:53
красавчик Пирст))) помогло мне наконецто, ато целый день мучился)) |
||
kuklp Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
#11 18.04.2016 15:36:35
Так еще Диму никто не обзывал Я сам — дурнее всякого примера! … |
||
sv2013 Пользователь Сообщений: 657 |
#12 18.04.2016 17:26:05 еще вариант макроса ,кнопка vvv
Прикрепленные файлы
|
||
lazareva Пользователь Сообщений: 8 |
Как удалить пробелы внутри числа (неразрывный пробел) с помощью макроса. Сейчас использую «Найти и Заменить», так как формулу =СЖПРОБЕЛЫ(ПОДСТАВИТЬ(J5;СИМВОЛ(160);»»;1))*1 использовать в моем случае не удобно. |
Мотя Пользователь Сообщений: 3218 |
|
lazareva Пользователь Сообщений: 8 |
Спасибо, Мотя . Пробел забрала, но проблема не решена, сума не считает. |
Мотя Пользователь Сообщений: 3218 |
Как профессионально решить проблему — я не знаю. |
kuklp Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
#17 19.05.2016 16:24:26 Не, Матреш, будем проще
Изменено: kuklp — 19.05.2016 16:27:49 Я сам — дурнее всякого примера! … |
||
lazareva Пользователь Сообщений: 8 |
Спасибо, kuklp , сработало (окно Immeiate)! Остался один вопрос. Данные в документ вносятся каждый день. Что делать после ввода новых данных? Изменено: lazareva — 19.05.2016 17:41:34 |
kuklp Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
#19 19.05.2016 17:44:58 Да хоть то же самое. Или можете оформить его макросом, повесить на кнопку:
Я сам — дурнее всякого примера! … |
||
lazareva Пользователь Сообщений: 8 |
#20 20.05.2016 09:33:50 Мне стыдно,что я научилась только копировать макросы, а написать самой трудновато. Немножко потрудившись, вот что получилось. Работает, но мня не устраивает то что надо выделять диапазон перед выполнением макроса. Диапазонов у меня много и они разбросаны. Как сделать так, чтоб он работал в столбце I и столбце J пока не разобралась. Еще нужно учесть, что в этих столбцах будут данные, которые уже прошли через макрос
Изменено: lazareva — 20.05.2016 09:35:41 |
||
kuklp Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
#21 20.05.2016 09:42:43
Я сам — дурнее всякого примера! … |
||
lazareva Пользователь Сообщений: 8 |
kuklp
, большое спасибо! То что надо! |
kuklp Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
#23 20.05.2016 09:51:39 Вариант:
Я сам — дурнее всякого примера! … |
||
IvI80 Пользователь Сообщений: 36 |
Подскажите, пожалуйста, как переделать код Казанского, чтобы он выполнялся не только в отдельном столбце, а в произвольно выбранном диапазоне? |
GroshevDV Пользователь Сообщений: 16 |
Казанский, The_Prist, Спасибо ОГРОМНОЕ! Очень мне помогли ваши решения. |
DARR Пользователь Сообщений: 42 |
#26 15.07.2019 12:58:12
Добрый день. Как в данном макросе задать только видимый диапазон ячеек столбца I ? Дело в том, что на столбце A стоит автофильтр и часть строк скрыто, поэтому надо, чтобы обрабатывались только видимые ячейки |
||
casag Пользователь Сообщений: 175 |
#27 15.07.2019 16:53:16 DARR, у меня получилось так
|
||
kuklp Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
#28 15.07.2019 17:05:00 Так д.б. шустрей:
Я сам — дурнее всякого примера! … |
||
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Добавлю, что Application.Trim при применении к массиву равен по скорости применению в прямом цикле, только запись короче Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
DARR Пользователь Сообщений: 42 |
#30 16.07.2019 08:01:56 kuklp, casag, супер! спасибо! |
Удаление лишних пробелов из строк с помощью кода 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 должен быть добавлен в тот же модуль.
Skip to content
На чтение 2 мин. Просмотров 3.3k.
Что делает макрос: Частая проблема при импорте данных из других источников — это начальные или конечные пробелы. Данный макрос позволит легко удалить лишние пробелы в ячейках.
Содержание
- Как макрос работает
- Код макроса
- Как этот код работает
- Как использовать
Как макрос работает
В этом макросе, мы перебираем диапазон, проверяя каждую ячейку с помощью функции Trim.
Код макроса
Sub UdalitLishnieProbeli() 'Шаг 1: Объявляем переменные Dim MyRange As Range Dim MyCell As Range 'Шаг 2: Сохранить книгу прежде, чем изменить данные? Select Case MsgBox("Перед изменением ячеек. " & _ "Сохранить книгу?", vbYesNoCancel) Case Is = vbYes ThisWorkbook.Save Case Is = vbCancel Exit Sub End Select 'Шаг 3: определяем целевой диапазон Set MyRange = Selection 'Шаг 4: запускаем цикл по диапазону For Each MyCell In MyRange 'Шаг 5: Убираем пробелы If Not IsEmpty(MyCell) Then MyCell = Trim(MyCell) End If 'Шаг 6: Получаем следующую ячейку в диапазоне Next MyCell End Sub
Как этот код работает
- Шаг 1 объявляет две переменные объекта Range.
- Мы должны сохранить книгу перед запуском макроса.
- Шаг 3 заполняет переменную MyRange с целевым диапазоном.
- После того, как клетка активируется, Шаг 5 использует Not IsEmpty функцию, которая удаляет лишние пробелы
- Шаг 6 повторяет цикл, чтобы получить следующую ячейку. После просмотра всех ячеек в целевом диапазоне макрос заканчивается.
Как использовать
Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:
- Активируйте редактор Visual Basic, нажав ALT + F11.
- Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
- Выберите Insert➜Module.
В этом уроке мы создадим макрос, который удалит лишние пробелы в нужном диапазоне. Макрос будет работать как функция Excel СЖПРОБЕЛЫ. Если вы хотите при помощи VBA сделать то, что делает функция СЖПРОБЕЛЫ, то вы попали по адресу.
Данные, в которых нужно удалять лишние пробелы находятся в диапазоне A2:A4:
Мы будем пользоваться функцией Application.Trim:
Sub triming() ' Переменная для диапазона Dim trim_range As Range ' Присваиваем значение объектной переменной Set trim_range = Range("a2:a4") ' Выделяем диапазон trim_range.Select ' Удаляем лишние пробелы With Selection .Value = Application.Trim(.Value) End With End Sub
В результате получим данные без лишних пробелов:
- Что делает макрос
- Код макроса
- Как работает макрос
- Как использовать
- Скачать файл
Ссылка на это место страницы:
#zadacha
Частая проблема при импорте данных из других источников — это начальные или конечные пробелы. Данный макрос позволит легко удалить лишние пробелы в ячейках.
В этом макросе, мы перебираем диапазон, проверяя каждую ячейку с помощью функции Trim.
Ссылка на это место страницы:
#formula
Sub
UdalitLishnieProbeli()
Dim
MyRange
As
Range
Dim
MyCell
As
Range
Select
Case
MsgBox(
"Перед изменением ячеек. "
& _
"Сохранить книгу?"
, vbYesNoCancel)
Case
Is
= vbYes
ThisWorkbook.Save
Case
Is
= vbCancel
Exit
Sub
End
Select
Set
MyRange = Selection
For
Each
MyCell
In
MyRange
If
Not
IsEmpty(MyCell)
Then
MyCell = Trim(MyCell)
End
If
Next
MyCell
End
Sub
Ссылка на это место страницы:
#kak
1. Шаг 1 объявляет две переменные объекта Range.
2. При выполнении макрос уничтожает стек отката. Это означает, что вы не сможете отменить изменения, поэтому нужно сохранить книгу перед запуском макроса. Это делает Шаг 2.
3. Шаг 3 заполняет переменную MyRange с целевым диапазоном.
4. Шаг 4 начинает цикл через каждую ячейку в целевом диапазоне. После того, как клетка активируется.
5. Шаг 5 проверяет пуста ли ячейка с помощью функции IsEmpty, а потом с помощью функции Trim удаляет лишние пробелы
6. Шаг 6 повторяет цикл, чтобы получить следующую ячейку. После просмотра всех ячеек в целевом диапазоне макрос заканчивается.
Ссылка на это место страницы:
#touse
Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:
1. Активируйте редактор Visual Basic, нажав ALT + F11.
2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
3. Выберите Insert➜Module.
4. Введите или вставьте код во вновь созданном модуле.
Ссылка на это место страницы:
#file
Файлы статей доступны только зарегистрированным пользователям.
1. Введите свою почту
2. Нажмите Зарегистрироваться
3. Обновите страницу
Вместо этого блока появится ссылка для скачивания материалов.
Привет! Меня зовут Дмитрий. С 2014 года Microsoft Cretified Trainer. Вместе с командой управляем этим сайтом. Наша цель — помочь вам эффективнее работать в Excel.
Изучайте наши статьи с примерами формул, сводных таблиц, условного форматирования, диаграмм и макросов. Записывайтесь на наши курсы или заказывайте обучение в корпоративном формате.
Подписывайтесь на нас в соц.сетях:
I’m trying to delete the spaces that I have in each field of the column «A» this spaces are at the end of the string some of the string has 3 spaces others 4. When I run the code, I don’t have error, so I think I have a bug because nothing happened when is running.
Dim result As String
Last = Cells(Rows.Count, "A").End(xlUp).Row
For i = Last To 1 Step -1
If (Right(Cells(i, "A").Value, 4)) Like " " Or (Right(Cells(i, "A").Value, 3)) Like " " Then
result = Replace(Cells(i, "A"), " ", "")
End If
Next i
halfer
19.8k17 gold badges97 silver badges185 bronze badges
asked Aug 14, 2015 at 15:42
In your specific case, the problem is that you’re storing the replacement value in a string variable named result
, then doing nothing with it. If you want it to be in the Cell
, you have to add it back in there, such as:
Cells(I, "A").Value = result
Keep in mind, there is an Application.Trim
method that can actually save a bit of time over looping. Experiment with code such as:
Dim rng as Range
set rng = Range("A1:A10")
rng.Value = Application.Trim(rng)
answered Aug 14, 2015 at 15:44
5
Currently you are not actually updating the cell in the loop, you just;
result = Replace(Cells(i, "A"), " ", "")
You should:
Cells(i, "A") = Replace(Cells(i, "A"), " ", "")
Or better
Cells(i, "A") = rtrim$(Cells(i, "A"))
Which will remove all right spaces. You can probably remove the if check as well.
answered Aug 14, 2015 at 15:45
Alex K.Alex K.
170k30 gold badges263 silver badges286 bronze badges
2
What are expecting this code to do? as currently the values are being read into result. It would also be better to use trim to remove trailing spaces.
Dim result As String
Last = Cells(Rows.Count, "A").End(xlUp).Row
For i = Last To 1 Step -1
result = RTrim(Cells(i, "A"))
Next i
answered Aug 14, 2015 at 15:44
99moorem99moorem
1,9551 gold badge15 silver badges27 bronze badges
1
Удалить пробелы макросом |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |