Страницы: 1
RSS
Разбить значение ячейки по строкам (ограничение длины части текста - ширина столбца)
 
Доброй ночи, форумчане.
Помогите с макросом по сжиманию текста.

На Листе4 в столбце B - есть текст разной длины.
Рядом находится желтый столбец "T".
Видно, что кое-где текст значительно выходит за пределы этого столбца T.

Как перенести этот текст - на Лист5, со сжиманием текстового массива по ширине (до столбца T) и переносом невлезающего текста - на новую строку ?
 
Цитата
Serg.Vrn написал:
Помогите с макросом по сжиманию текста
Название темы и Ваши желания ни как не коррелируются между собой...
Сжимание текста можно воспринять как изменение интервала между символами и строками, в то время как у Вас требуется перенос по строкам в рамках длины заданной определенным образом.
Прилагаю файл с надеждой, что Вы ответите что Вас  не устроило в рамках такого решения.
 
AAF, так это вы макросом сделали или каким образом ?
В моем файле изначально - ячейки с текстом - обычного размера.

Как макросом - сделать - то что вы сделали в своем файле ?
 
AAF,доброго времени, возможно под этим текстом будут дополнительные данные по столбцам и скорее всего колонку расширять нельзя. Возможное решение это объединить ячейки в строке и переносить по строкам
 
Код
Sub asdf()
ActiveCell.ColumnWidth = 30
ActiveCell.WrapText = True
End Sub
 
положите этот макрос
Код
Sub SplitText()
  Dim w, r&, r2&, s$, v$, ar, i&, n&, n1&, n2&
  With Worksheets(Worksheets.Count)
    .Columns(20).ClearContents:  w = .Cells(1, 20).Left - .Cells(1, 2).Left
    r = 5: r2 = 5
    Do While Not IsEmpty(Cells(r, 2))
      v = Cells(r, 2):  .Cells(1, 20) = v:  .Columns(20).AutoFit
      If .Cells(1, 20).Width <= w Then
        .Cells(r2, 2) = v: r2 = r2 + 1
      Else
        Do While True
          ar = Split(v): n2 = UBound(ar): n1 = 0
          Do While n2 - n1 > 1
            s = "":  n = (n2 + n1) / 2
            For i = 0 To n: s = s & ar(i) & " ": Next
            .Cells(1, 20) = Left(s, Len(s) - 1): .Columns(20).AutoFit
            If .Cells(1, 20).Width > w Then n2 = n Else n1 = n
          Loop
          s = ""
          For i = 0 To n1: s = s & ar(i) & " ": Next
          .Cells(r2, 2) = Left(s, Len(s) - 1): r2 = r2 + 1
          If Len(v) > Len(s) Then
            v = Right(v, Len(v) - Len(s)): .Cells(1, 20) = v: .Columns(20).AutoFit
            If .Cells(1, 20).Width < w Then .Cells(r2, 2) = v: r2 = r2 + 1: Exit Do
          Else
            Exit Do
          End If
        Loop
      End If
      r = r + 1
    Loop
    .Cells(1, 20).ClearContents
  End With
End Sub
в программный модуль и выполните его при активном листе 4
результаты см. на листе 5  
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Название темы должно отражать суть задачи. Предложите новое. Модераторы заменят.
 
тему можно назвать так:
разбить содержимое ячейки на несколько частей с переносом каждого фрагмента в новую строку так, чтобы  визуально текст не "вылезал" вправо за указанную границу
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, круто, а почему  колонка 20 расширяется после действия макроса
 
Ігор Гончаренко, теперь все заработало.
Спасибо большое.
 
я в ячейку (1, 20) ложил разные куски исходного текста до момента определения того пробела, по которому текст нужно разбить на 2 части
согласен правильно было бы в начале работы запомнить ширину колонки 20, а в конце вернуть как было))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, не пойму, где вы указали лист5? Вроде всё просмотрел
 
Worksheets(Worksheets.Count) - это вообще-то не 5-й лист, а последний лист книги, но так как в исходном файле было 5 листов, то 5-й и последний - это один и тот же лист в данном файле.
задача эта появлялась тут и на других форумах уже неоднократно:
разбить длинный текст на короткие фрагменты, которые визуально не должны выходить за определенные рамки. все время предлагались всякие обходные маневры и решения. теперь есть прямое решение задачи.
Изменено: Ігор Гончаренко - 19.12.2017 03:40:37
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,я знаю, я тож ломал голову над этой задачей, только мне надо было перенести остаток текста в первую свободную строку. Получается лист выгрузки вы определили строкой
Код
 With Worksheets(Worksheets.Count)
Страницы: 1
Читают тему
Наверх