Замена символов, цифр и букв (кириллица и латиница) на заданный разделитель с последующей очисткой, Попытка объединить несколько тем на общую тематику.
Записал макрорекордером вот такой макрос (минусы не трогает, точки заменяет запятыми, а остальные символы заменяет на пробелы в конце подчищает результат)
Подскажите пожалуйста, как записать этот код в более удобном (коротком) виде, как у ikki или Nerv. И как записать подобные макросы для замены латиницы и кириллицы (отдельно) на пробел (пробел, потому что потом подчистить через Trim можно). Вы спросите: а зачем ВООБЩЕ менять текст или символы на пробелы, почему не удалить? А я отвечу))) потому что иногда исходником является мешанина типа "катя14.48рыба-меч890куры-890,15" и разделить по какому-то ОДНОМУ признаку никак . Выслушаю предложения - наверняка каждый по-своему решает подобные проблемы. Поиск в интернете толком ничего не дал. Ссылки с сайта - в начале темы. Файл-пример содержит плохочитаемый набор символов - вся суть в заголовках
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Sanja, всё верно, хватит в девках сидеть)) подскажите пожалуйста, как эту функцию превратить в макрос для Selection - и я погнал)))
Код
Function Replace_symbols(ByVal txt As String) As String
St$ = "~!@#$%^&|\/.*=|`'"""
For i% = 1 To Len(St$)
txt = Replace(txt, Mid(St$, i, 1), "_")
Next
Replace_symbols = txt
End Function
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack_Famous написал: как эту функцию превратить в макрос для Selection
Для начала почитать про RegExp и узнать оттуда, что в шаблоне могут быть метасимволы, которые надо превращать с обычные для замены, путем проставления перед ними слеша...Плюс хотя бы в общих чертах понять как RegExp применять.
Чтобы гнать - надо хотя бы теорию понять. Сейчас Вы гоните в Лондон из Рязани совершенно не зная ни дороги, ни времени на её преодоление...А это чревато последствиями. Не бывает быстрых побед - бывают быстрые поражения.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
sub макрос_для_Selection
dim r as range
St$ = "~!@#$%^&|\/.*=|`'"""
for each r in selection
For i% = 1 To Len(r)
r = Replace(r, Mid(St$, i, 1), "_")
Next
next
end sub
The_Prist, к сожалению, пока не могу заняться изучением VBA (но обязательно приду к этому)... Было интересно, (без "подводных камней", которые требуют изучения RegExp) - есть ли способ упростить запись типа "найти и заменить" для большого количества символов, если каждый менять на пробел (к примеру). Можно ведь также сделать и для кириллицы с латиницей - 100 строчек практически одинакового кода для неумеки в VBA )))) Апострофф. спасибо большое! ))) На его основе сделаю для текста...
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Пока так... В принципе, комбинации этих макросов дело делают, и довольно быстро - хватит на первое время Всем большое спасибо за участие (особенно Апострофф за предоставленный поправленный макрос)! Жду замечаний и предложений...
Код
Sub ReplacerSym()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Dim r As Range
St$ = "~<>?+!@#$:;%^&|\/*(){}[]=|`'"""
For Each r In Selection
For i% = 1 To Len(r)
r = Replace(r, Mid(St$, i, 1), " ")
Next
Next
Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Value = Application.Clean(Selection.Value)
Selection.Value = Application.Trim(Selection.Value)
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
______________________________________________________________________________
Sub ReplacerKirill()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Dim r As Range
St$ = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя"
For Each r In Selection
For i% = 1 To Len(r)
r = Replace(r, Mid(St$, i, 1), " ")
Next
Next
'Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
' SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
' ReplaceFormat:=False
Selection.Value = Application.Clean(Selection.Value)
Selection.Value = Application.Trim(Selection.Value)
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
_____________________________________________________________________________
Sub ReplacerLatin()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Dim r As Range
St$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
For Each r In Selection
For i% = 1 To Len(r)
r = Replace(r, Mid(St$, i, 1), " ")
Next
Next
'Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
' SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
' ReplaceFormat:=False
Selection.Value = Application.Clean(Selection.Value)
Selection.Value = Application.Trim(Selection.Value)
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
у таких выражений есть тенденция к укорачиванию строк в ячейках до 255 символов, плюс выдаст ошибку, если будет выделено более 65536 строк данных...Поэтому я бы вынес это в цикл, раз он все равно есть:
Код
St$ = "~<>?+!@#$:;%^&|\/*(){}[]=|`'"""
For Each r In Selection
For i% = 1 To Len(r)
r = Replace(r, Mid(St$, i, 1), " ")
Next
r.Value = Application.Clean(r.Value)
r.Value = Application.Trim(r.Value)
Next
Собственно, сам цикл можно делать на массиве(хотя есть свои подводные камни).
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
The_Prist, спасибо за замечание и дополнение! Давно хотел узнать: в сети популярно вложение Trim в Clean и наоборот и, кажется, без Application. Так вот в этом случае почему-то ощутимо тормозить начинает... А когда вот так просто последовательно вызывать - летает... Почему так?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Потому что есть разница между Application.Trim и Trim. Trim - это функция VBA, которая удаляет все пробелы спереди и сзади текста. Application.Trim - это вызов функции листа СЖПРОБЕЛЫ, которая удаляет все пробелы спереди и сзади текста, а также все другие пробелы внутри строки, кроме одиночных между словами. Clean - не существует в VBA, только как WorksheetFunction. Это не что иное, как функция листа ПЕЧСИМВ. Ну и вложенность функций одна в другую всегда медленнее, чем последовательный их вызов. На больших массивах это более заметно.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
The_Prist, спасибо большое за пояснения! ))) почему тогда она чаще выскакивает при поиске...(вопрос не требующий ответа )
2016-04-14. 10:55. Итоги тестирования: 1. Время работы в "умных" таблицах минимум в 5!!! раз дольше... Так что лучше перед обработкой преобразовать в диапазон. 2. Selection.Value = Application.Clean(Selection.Value), Selection.Value = Application.Trim(Selection.Value) а также их цикличные аналоги от Дмитрия "The_Prist" работают по времени одинаково, более того, практически никак не влияют на общее время работы макроса.
2016-04-18; 17:00. Опытным путём было выявлено, что замена циклов и прочего на банальное Selection.Replace "что_менять", "на_что_менять" просто ускоряет макросы по пакетной замене в ДЕСЯТКИ !!! раз (в том числе, в умных таблицах). Удачи
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄