При программной работе с Excel из 1С через COMОбъект часто возникают задачи по форматированию ячеек, которые не всегда очевидны. Рассмотрим две распространенные проблемы: как повернуть текст в ячейке на 90 градусов и как сделать так, чтобы длинный текст визуально «накладывался» на соседние пустые ячейки, а не обрезался. Проанализируем, какие свойства объекта Range для этого используются, и разберем универсальный способ поиска решений для подобных задач.
Первая задача — изменить ориентацию текста в ячейке. Для этого у объекта Range (который представляет ячейку или диапазон) есть свойство Orientation.
В ходе обсуждения автор столкнулся с ошибкой «Неверное число параметров» при попытке использовать следующий код:
// Неправильный код
Лист.Cells(СтрокаExcel, 1).Range.Orientation = 90;
Выясним причину ошибки. Метод Лист.Cells(НомерСтроки, НомерКолонки) уже возвращает объект типа Range, то есть саму ячейку. Обращаться после него еще раз к свойству Range не нужно. Это избыточная конструкция, которая и приводит к ошибке.
Правильный синтаксис для установки ориентации текста выглядит так:
// Получаем COMОбъект приложения Excel
ExcelApp = Новый COMОбъект("Excel.Application");
// ... код открытия книги и получения листа ...
Лист = Книга.Worksheets(1);
// Устанавливаем ориентацию текста в ячейке A1 на 90 градусов
Лист.Cells(1, 1).Orientation = 90;
Свойство Orientation может принимать следующие значения:
Вторая задача — сделать так, чтобы текст, не помещающийся в ячейку, не скрывался, а визуально перетекал на соседние пустые ячейки справа. Часто это путают со свойством WrapText («Перенос по словам»), но оно выполняет другую функцию: оставляет текст внутри ячейки, увеличивая высоту строки.
Чтобы добиться эффекта перетекания текста, необходимо соблюдение трех условий одновременно:
WrapText должно быть выключено (установлено в Ложь / False).HorizontalAlignment) должно быть стандартным («По значению») или «По левому краю». Если установить выравнивание «По ширине» или «Заполнение», текст будет обрезан.При работе из 1С важно помнить, что именованные константы VBA (например, xlLeft) недоступны. Вместо них нужно использовать их числовые аналоги. Для выравнивания по левому краю это -4131.
Посмотрим на пример кода, который настраивает ячейку для перетекания текста:
// Получаем ячейку A2
Ячейка = Лист.Cells(2, 1);
// 1. Отключаем перенос по словам
Ячейка.WrapText = 0; // 0 соответствует False
// 2. Устанавливаем выравнивание по левому краю
// Константа xlLeft в VBA равна -4131
Ячейка.HorizontalAlignment = -4131;
// 3. Заполняем ячейку длинным текстом
Ячейка.Value = "Очень длинный текст, который должен выходить за пределы ячейки";
// Важно: убедитесь, что ячейка B2 (Лист.Cells(2, 2)) пуста
Что делать, если вы не знаете, какое свойство отвечает за нужное форматирование? Самый надежный и простой способ — это воспользоваться встроенным в Excel рекордером макросов. Он запишет все ваши действия в виде кода на VBA, который затем можно проанализировать и перенести в код 1С.
Разберем по шагам, как это сделать:
Например, для поворота текста вы увидите примерно такой код:
Sub Макрос1()
'
' Макрос1 Макрос
'
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 90
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
End Sub
Из этого кода сразу видно, что за поворот отвечает свойство .Orientation = 90. Этот подход позволяет быстро находить нужные свойства для любых, даже самых сложных операций форматирования.
При заполнении больших объемов данных (например, когда идет выгрузка журнала регистрации в Excel) работа через COM-объект может быть медленной. Рассмотрим несколько ключевых советов по оптимизации и правильному завершению работы.
Ускорение записи данных. Если вы разрабатываете свой алгоритм, перед началом цикла заполнения ячеек отключите обновление экрана и автоматический пересчет формул. Это ускорит выполнение кода в десятки раз, так как Excel не будет перерисовывать интерфейс после каждого изменения.
ExcelApp = Новый COMОбъект("Excel.Application");
ExcelApp.Visible = 0; // Работа в фоновом режиме
// Отключаем обновление экрана
ExcelApp.ScreenUpdating = 0; // False
// Устанавливаем ручной пересчет формул (константа xlCalculationManual = -4135)
ExcelApp.Calculation = -4135;
// --- Здесь идет ваш основной код по заполнению и форматированию ячеек ---
// Например, цикл по 1000 строкам
Для сч = 1 По 1000 Цикл
Лист.Cells(сч, 1).Value = "Данные " + сч;
КонецЦикла;
// -------------------------------------------------------------------------
// Возвращаем настройки обратно
ExcelApp.Calculation = -4105; // xlCalculationAutomatic
ExcelApp.ScreenUpdating = 1; // True
ExcelApp.Visible = 1; // Показываем результат пользователю
Корректное закрытие Excel. Очень важно правильно завершать работу с COM-объектом. Если этого не сделать, в диспетчере задач могут остаться «висеть» процессы EXCEL.EXE, потребляющие память.
Правильная последовательность действий в конце работы:
// Сохраняем книгу, если нужно
Книга.SaveAs("C:\MyReport.xlsx");
// Закрываем книгу без дополнительных диалоговых окон
Книга.Close(0); // 0 соответствует False - не показывать окно сохранения
// Выходим из приложения Excel
ExcelApp.Quit();
// Освобождаем переменные в 1С
Книга = Неопределено;
ExcelApp = Неопределено;
Следуя этим рекомендациям, вы сможете не только решить конкретные задачи форматирования, но и сделать вашу работу с Excel из 1С быстрой, надежной и предсказуемой.