Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Доработка небольшого макроса по работе с текстом - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Доработка небольшого макроса по работе с текстом (Формулы/Formulas)
Доработка небольшого макроса по работе с текстом
scaels1 Дата: Вторник, 23.12.2014, 16:41 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 19
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Добрый день. Есть макрос (спасибо krosav4ig) - он обрезает текстовую строку до нужной длинны по концу последнего слова, удаляя при этом хвосты менее 3х символов.

Задача: иногда в конце строки он оставляет пробел, и стандартной функцией СЖПРОБЕЛЫ - он не убирается. Что надо дописать в нем, что бы в конце строки он не оставлял пробела?

[vba]
Код
Function dd$(str$, lim&)
Dim arr(), i&, n&, k&
str = Application.Trim(str)
ReDim arr(i)
arr(i) = Len(Split(str, " ")(i))
n = arr(i) + 1
Do Until i = UBound(Split(str, " "))
k = Len(Split(str, " ")(i + 1))
If n + k > lim Then Exit Do
i = i + 1: ReDim Preserve arr(i)
arr(i) = k: n = n + k + 1
Loop
Do Until arr(i) > 3 Or Len(str) <= lim
n = n - 1 - arr(i)
i = i - 1
Loop
dd = Left(str, n)
End Function
[/vba]
[moder]Оформляйте коды тегами, кнопка #[/moder]
 
Ответить
СообщениеДобрый день. Есть макрос (спасибо krosav4ig) - он обрезает текстовую строку до нужной длинны по концу последнего слова, удаляя при этом хвосты менее 3х символов.

Задача: иногда в конце строки он оставляет пробел, и стандартной функцией СЖПРОБЕЛЫ - он не убирается. Что надо дописать в нем, что бы в конце строки он не оставлял пробела?

[vba]
Код
Function dd$(str$, lim&)
Dim arr(), i&, n&, k&
str = Application.Trim(str)
ReDim arr(i)
arr(i) = Len(Split(str, " ")(i))
n = arr(i) + 1
Do Until i = UBound(Split(str, " "))
k = Len(Split(str, " ")(i + 1))
If n + k > lim Then Exit Do
i = i + 1: ReDim Preserve arr(i)
arr(i) = k: n = n + k + 1
Loop
Do Until arr(i) > 3 Or Len(str) <= lim
n = n - 1 - arr(i)
i = i - 1
Loop
dd = Left(str, n)
End Function
[/vba]
[moder]Оформляйте коды тегами, кнопка #[/moder]

Автор - scaels1
Дата добавления - 23.12.2014 в 16:41
Rioran Дата: Вторник, 23.12.2014, 17:10 | Сообщение № 2
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
scaels1, здравствуйте.

Предлагаю свою UDF с математикой попроще. Протестируйте.
Первый аргумент - текст, второй - сколько резать.

[vba]
Код
Function Rio_Cut(StrX As String, SzeX As Long) As String

Dim A As Integer, B As Byte
Rio_Cut = Left(StrX, SzeX)

For A = SzeX To 1 Step -1
     If Mid(Rio_Cut, A, 1) <> " " Then
         B = B + 1
         If B > 2 Then Exit For
     Else
         Select Case B
             Case 0, 1, 2: Rio_Cut = Left(Rio_Cut, A - 1): B = 0
             Case Else: Exit For
         End Select
     End If
Next A

End Function
[/vba]
К сообщению приложен файл: RioCut.xlsb (13.4 Kb)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщениеscaels1, здравствуйте.

Предлагаю свою UDF с математикой попроще. Протестируйте.
Первый аргумент - текст, второй - сколько резать.

[vba]
Код
Function Rio_Cut(StrX As String, SzeX As Long) As String

Dim A As Integer, B As Byte
Rio_Cut = Left(StrX, SzeX)

For A = SzeX To 1 Step -1
     If Mid(Rio_Cut, A, 1) <> " " Then
         B = B + 1
         If B > 2 Then Exit For
     Else
         Select Case B
             Case 0, 1, 2: Rio_Cut = Left(Rio_Cut, A - 1): B = 0
             Case Else: Exit For
         End Select
     End If
Next A

End Function
[/vba]

Автор - Rioran
Дата добавления - 23.12.2014 в 17:10
RAN Дата: Вторник, 23.12.2014, 17:31 | Сообщение № 3
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
[vba]
Код
dd = Replace(dd, Chr(160), "")
[/vba]
[p.s.]или 10, или 13[/p.s.]


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Вторник, 23.12.2014, 17:36
 
Ответить
Сообщение[vba]
Код
dd = Replace(dd, Chr(160), "")
[/vba]
[p.s.]или 10, или 13[/p.s.]

Автор - RAN
Дата добавления - 23.12.2014 в 17:31
Leanna Дата: Среда, 24.12.2014, 00:00 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 189
Репутация: 78 ±
Замечаний: 0% ±

excel 2010
Функция Trim т.е.
[vba]
Код
dd = Trim(Left(str, n))
[/vba]
У меня убрала.


Лучше день потерять, потом за пять минут долететь!
 
Ответить
СообщениеФункция Trim т.е.
[vba]
Код
dd = Trim(Left(str, n))
[/vba]
У меня убрала.

Автор - Leanna
Дата добавления - 24.12.2014 в 00:00
RAN Дата: Среда, 24.12.2014, 02:57 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Leanna, СЖПРОБЕЛЫ =Trim, так что не то убрала.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеLeanna, СЖПРОБЕЛЫ =Trim, так что не то убрала.

Автор - RAN
Дата добавления - 24.12.2014 в 02:57
scaels1 Дата: Среда, 24.12.2014, 03:48 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 19
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Rioran, у вас он работает, но обрезает часть слова, а не удаляет его под предыдущий пробел.
 
Ответить
СообщениеRioran, у вас он работает, но обрезает часть слова, а не удаляет его под предыдущий пробел.

Автор - scaels1
Дата добавления - 24.12.2014 в 03:48
scaels1 Дата: Среда, 24.12.2014, 03:52 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 19
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Leanna, Спасибо!
 
Ответить
СообщениеLeanna, Спасибо!

Автор - scaels1
Дата добавления - 24.12.2014 в 03:52
Rioran Дата: Среда, 24.12.2014, 07:54 | Сообщение № 8
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
работает, но обрезает часть слова

удаляя при этом хвосты менее 3х символов.

Хвост менее трех символов - это обрубки слов из одной или двух букв. Следовательно, обрубки из трёх и более букв можно оставить. Так работала моя логика, что могло пойти не так? =)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщение
работает, но обрезает часть слова

удаляя при этом хвосты менее 3х символов.

Хвост менее трех символов - это обрубки слов из одной или двух букв. Следовательно, обрубки из трёх и более букв можно оставить. Так работала моя логика, что могло пойти не так? =)

Автор - Rioran
Дата добавления - 24.12.2014 в 07:54
Rioran Дата: Среда, 24.12.2014, 10:17 | Сообщение № 9
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
scaels1, а посмотрите, как у Вас будет работать моя же функция с лёгкой доработкой? На правах спортивного азарта.

[vba]
Код
Function Rio_Cut(StrX As String, SzeX As Long) As String

Dim A As Integer, B As Byte
Rio_Cut = StrX

For A = Len(StrX) To 1 Step -1
     If Mid(Rio_Cut, A, 1) <> " " Then
         B = B + 1
     Else
         If A + B > SzeX And A <= SzeX Then
             Rio_Cut = Left(Rio_Cut, A - 1)
         ElseIf A <= SzeX And B < 3 Then
             Rio_Cut = Left(Rio_Cut, A - 1)
         ElseIf A + B <= SzeX And B > 2 Then
             Rio_Cut = Left(Rio_Cut, A + B)
             Exit For
         End If
         B = 0
     End If
Next A

End Function
[/vba]
К сообщению приложен файл: RioCut2.xlsb (14.0 Kb)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщениеscaels1, а посмотрите, как у Вас будет работать моя же функция с лёгкой доработкой? На правах спортивного азарта.

[vba]
Код
Function Rio_Cut(StrX As String, SzeX As Long) As String

Dim A As Integer, B As Byte
Rio_Cut = StrX

For A = Len(StrX) To 1 Step -1
     If Mid(Rio_Cut, A, 1) <> " " Then
         B = B + 1
     Else
         If A + B > SzeX And A <= SzeX Then
             Rio_Cut = Left(Rio_Cut, A - 1)
         ElseIf A <= SzeX And B < 3 Then
             Rio_Cut = Left(Rio_Cut, A - 1)
         ElseIf A + B <= SzeX And B > 2 Then
             Rio_Cut = Left(Rio_Cut, A + B)
             Exit For
         End If
         B = 0
     End If
Next A

End Function
[/vba]

Автор - Rioran
Дата добавления - 24.12.2014 в 10:17
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Доработка небольшого макроса по работе с текстом (Формулы/Formulas)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!