Разделить текст на несколько строк в соответствии с шириной столбца - PullRequest
4 голосов
/ 21 марта 2011

У меня есть генератор отчетов в Excel VBA, который работает до сих пор. Он читает некоторые входные данные и выдает в виде отформатированного листа Excel в качестве результата. Последний столбец этого листа заполнен каким-то свободным текстом.

Теперь, иногда свободный текст не помещается в последний столбец, он просто слишком широкий. Поскольку высота строк всех строк этого отчета фиксирована, я не могу установить range.WrapText=True для этого столбца (чтобы текст оставался видимым, нужно было бы увеличить высоту строк). Ручное (не VBA) решение легко: разбить текст на несколько частей и распределить по разным строкам. Например:

A          | B               |C
content    |This text is too wide for column B.
here       |This text fits.  |
is         |                 |
fixed      |                 |

должно быть преобразовано в

A          | B               |C
content    |This text is too |
here       |wide for column  |
is         |B.               |
fixed      |This text fits.  |

Я мог бы легко написать код, если бы смог определить реальную ширину текста (используя пропорциональный шрифт!) Содержимого в столбце B с помощью VBA. range.ColumnWidth дает мне фактическую ширину столбца, но я понятия не имею, как определить ширину «Этот текст слишком широкий для столбца B». в VBA. Есть предложения?

(в настоящее время я использую Excel 2002 / XP).

Ответы [ 2 ]

5 голосов
/ 21 марта 2011

Это сработает (в 2003 году ... конечно, в 2002 году).

With Columns("B:B")
    oldWidth = .ColumnWidth

    .EntireColumn.AutoFit ' Aha!
    fitWidth = .ColumnWidth

    .ColumnWidth = oldWidth ' Restore original width
    If oldWidth < fitWidth Then
        ' Text is too wide for column.
        ' Do stuff.
    End If
End With

Я бы не увяз в этом оценочном бизнесе, если бы я был вами ... Это просто вопроснеожиданные вещи случаются.


РЕДАКТИРОВАТЬ: Адресация точек в вашем комментарии.

Вышеприведенное будет автоматически устанавливать столбец в ячейку с самым широким текстом.Чтобы рассмотреть только текст в текущей ячейке, скопируйте текст ячейки в какой-нибудь пустой столбец и выполните там автоматическую подгонку.

Если вы беспокоитесь о производительности, вам придется прикусить пулю и составить справочную таблицу ширины символов.Выполните цикл по Chr(i) и измерьте ширину каждого символа, используя технику выше.Сохраните результаты в массиве, сделайте функцию, чтобы получить ширину строки, ища ширину символов в этом массиве и суммируя.Начальная стоимость составления LUT будет первоначальной, но поиск будет очень быстрым, что незаметно.Конечно, LUT будет действительным только для текущего шрифта, поэтому я буду создавать его заново при каждом запуске кода.Стоит затрат, если есть столько строк, сколько вы говорите.

NB: fitWidth выше вернет ширину символа плюс небольшое значение (0,29pt на моей машине), которое является своего рода тонким «белым полем», автоматически добавляемым с обеих сторон ячейки для эстетикицели.Не забудьте вычесть это из fitWidth, чтобы получить истинную ширину символа.Вы можете выяснить, насколько он широк, выполнив автоподбор по «А» и «АА».Разница между ними будет истинной шириной одного «А».

1 голос
/ 21 марта 2011

Для приложения, которое предположительно является wysiwyg excel, довольно плохо справляется с отображением шрифтов в согласованном стиле.То, что вы видите, зависит от шрифта, размера шрифта, уровня масштабирования и различается на экране и распечатывается.добавьте непропорциональные шрифты, и это станет еще хуже.

Любое решение для вычисления ширины строки будет чревато сложностью.

В качестве альтернативы рассмотрите возможность объединения некоторых ячеек в столбце B и использования переноса,Если под текстом есть место, пара дополнительных строк в слиянии не повлияет на результат, поэтому вычисление количества строк может быть выполнено консервативно (ошибка в верхней части)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...