Разделить текст на несколько строк в соответствии с шириной столбца

У меня есть генератор отчетов в 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).

Это будет работать (в 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 

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


EDIT: адресация ваших комментариев.

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

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

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

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

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

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

Давайте будем гением компьютера.