Top.Mail.Ru
Ответы

Вопрос к знатокам Excel

Доброго времени суток! Такой вопрос. Есть ячейка, в которую вбит объемный текст. Например, объект строительства. Далее, на другом листе есть форма акта где есть соответствующая графа но с уже объединенными ячейками и оформленными как строки (с нижней рамкой). Существует ли какой-то способ сделать так, чтобы этот текст из одной ячейки сам разбивался по этим строкам?

Про функции ЛЕВСИМ, ПРАВСИМ я знаю. Но это не совсем удобно. Нужно высчитывать символы. Но бывает так, что сам это текст может меняться. И тогда все поехало.

Надеюсь вы меня поймете!

По дате
По рейтингу
Аватар пользователя
glavqa_iУченик
6мес

Хороший вопрос, знакомая боль! Чистыми формулами красиво не решается — но есть несколько подходов.

Вариант 1 — Самый простой: перенос по словам + одна большая объединённая ячейка

Если внешний вид "строк" нужен только для красоты (рамки снизу), можно:

  • Сделать одну большую объединённую ячейку на весь блок

  • Включить «Перенос текста» (Wrap Text)

  • Настроить высоту строки автоматически

Минус: это одна ячейка, просто визуально выглядит как строки.

Вариант 2 — VBA-макрос (рекомендую)

Это решает задачу полностью: текст из ячейки разбивается по словам и раскладывается по нужным ячейкам формы, не превышая заданную ширину строки.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
Sub РазбитьТекстПоСтрокам()
    ' Настройки
    Const ЛИСТ_ДАННЫХ = "Данные"       ' лист с исходным текстом
    Const ЛИСТ_ФОРМЫ  = "Форма"        ' лист с актом
    Const ЯЧЕЙКА_ТЕКСТ = "B2"          ' откуда берём текст
    Const ПЕРВАЯ_СТРОКА = 5            ' первая строка в форме (номер строки листа)
    Const КОЛ_СТРОК = 4               ' сколько строк отведено под текст
    Const СТОЛБЕЦ = "C"               ' столбец в форме
    Const МАКС_СИМВ = 60              ' максимум символов на строку
    
    Dim текст As String
    Dim слова() As String
    Dim строка As String
    Dim i As Integer, j As Integer
    
    ' Берём текст
    текст = Sheets(ЛИСТ_ДАННЫХ).Range(ЯЧЕЙКА_ТЕКСТ).Value
    слова = Split(текст, " ")
    
    ' Очищаем строки формы
    For i = 0 To КОЛ_СТРОК - 1
        Sheets(ЛИСТ_ФОРМЫ).Range(СТОЛБЕЦ & (ПЕРВАЯ_СТРОКА + i)).Value = ""
    Next i
    
    ' Разбиваем по строкам
    строка = ""
    j = 0
    
    For i = 0 To UBound(слова)
        Dim кандидат As String
        If строка = "" Then
            кандидат = слова(i)
        Else
            кандидат = строка & " " & слова(i)
        End If
        
        If Len(кандидат) <= МАКС_СИМВ Then
            строка = кандидат
        Else
            ' Записываем текущую строку и переходим к следующей
            If j < КОЛ_СТРОК Then
                Sheets(ЛИСТ_ФОРМЫ).Range(СТОЛБЕЦ & (ПЕРВАЯ_СТРОКА + j)).Value = строка
                j = j + 1
            End If
            строка = слова(i)
        End If
    Next i
    
    ' Записываем остаток
    If строка <> "" And j < КОЛ_СТРОК Then
        Sheets(ЛИСТ_ФОРМЫ).Range(СТОЛБЕЦ & (ПЕРВАЯ_СТРОКА + j)).Value = строка
    End If
    
    MsgBox "Готово!", vbInformation
End Sub

Как использовать: Alt+F11 → вставить модуль → вставить код → настроить константы вверху под свой файл → запускать кнопкой или повесить на кнопку прямо на листе.

Вариант 3 — Формула (без VBA, но громоздко)

Через ПСТР + НАЙТИ можно вырезать куски по ближайшему пробелу до N-го символа. Но при изменении текста всё равно нужно подбирать МАКС_СИМВ, а формулы получаются монструозные. Не советую.

Итог: для акта с фиксированными строками — VBA-макрос оптимален. Меняется текст → нажал кнопку → всё сам разложился. Константу МАКС_СИМВ подбираете один раз под ширину колонки вашей формы.

С уважением, GLAVQA

Аватар пользователя
user_301551446Ученик
6мес

Представь: у тебя есть длинное описание стройки в ячейке A1 на Листе1. А на Листе2 есть красивая форма акта, где это описание должно быть разбито по строчкам (потому что одна ячейка там объединена и выглядит как табличка).

Способ есть, и он проще, чем кажется. Забудь про ЛЕВСИМВ и ПРАВСИМВ — это мучение.

Что тебе нужно сделать

Если у тебя современный Excel (из подписки Microsoft 365 или версии 2021, 2024), то есть волшебная функция, которая называется ТЕКСТРАЗД. Работает она так:

  1. Смотришь на свой длинный текст в ячейке. Если он уже внутри разбит какими-то знаками (например, точкой с запятой, запятой или просто переносом строки), это идеально.

  2. На Листе2, в том месте, где должен начинаться твой текст, ты пишешь формулу.

  3. Формула будет выглядеть так: =ТЕКСТРАЗД(Лист1!A1;;";") (или вместо точки с запятой поставь тот знак, который разделяет части текста у тебя).

Как это работает в жизни:
Допустим, в ячейке А1 написано: "Фундамент;Стены;Кровля;Отделка".
Ты вбиваешь формулу на Листе2, и Excel сам разложит это по строчкам:

  • Строчка 1: Фундамент

  • Строчка 2: Стены

  • Строчка 3: Кровля

  • И так далее.

Главный плюс: если ты потом в A1 изменишь текст (допишешь что-то или уберешь), строчки на Листе2 сами подстроятся.

А если текст сплошной, без разделителей?

Вот тут начинается ручная работа. Excel не умеет читать мысли и не знает, где именно ты хочешь перенести слово. Тут есть два варианта для тех, кто не хочет париться с макросами:

Вариант А (для ручного контроля):
Ты оставляешь просто ссылку на ту ячейку на Листе2, но делаешь её с переносом по словам.

  1. На Листе2 в той ячейке пишешь: =Лист1!A1.

  2. Жмешь правой кнопкой по ячейке -> Формат ячеек -> Выравнивание -> ставишь галочку "Переносить по словам".

  3. Растягиваешь ячейку по высоте и ширине так, как тебе нужно.

  4. Минус: Текст будет в одной ячейке, а не размазан по разным строчкам. Если тебе нужно именно "размазать", этот вариант не подойдет.

Вариант Б (если нужны именно отдельные строчки, но текст меняется):
Тут придется один раз настроить файл с помощью макроса (программки внутри Excel). Звучит страшно, но на деле: находишь в интернете готовый макрос "Разбить текст по строкам", вставляешь его в свой файл, и всё. При изменении текста запускаешь кнопку — он сам распределит слова по строчкам, не разрывая их посередине.

Итог простыми словами

  • Если есть чем разделять текст (точки, запятые) — юзай ТЕКСТРАЗД. Это быстро и четко.

  • Если текст сплошной, и лень возиться с программированием — оставь его в одной ячейке и включи перенос по словам.

  • Если текст сплошной, но очень нужно разбить по разным ячейкам — ищи макрос и настраивай один раз.

Аватар пользователя
abram_pupkin_4Мыслитель
6мес

Если вам нужен ответ в формате "да/нет", тогда скорее "да " чем нет "нет".

Для конкретного решения - покажите "больного врачу(ам)".

Аватар пользователя
progzГуру
6мес

Да существует. Но далее нужно разбирать ситуацию. Если, что пиши в личку, я решаю такие задачи.

Аватар пользователя
alex_zero_emmisionТролль
6мес
Изменено

/.



Видео по теме