Нередко приходится сталкиваться с ситуацией, когда нужно отформатировать xls-документ непосредственно в коде. В этой статье хотелось привести несколько примеров форматирования данных. Итак, начнем.
Обозначим переменные, которые будут использоваться в дальнейшем.
ExcelApp = CreateObject('Excel.Application') Book = ExcelApp.WorkBooks.Add(1) Sheet = Book.WorkSheets(1) // первый лист книги Data = Sheet.UsedRange CellHL = Data.Cells(НомерСтроки1; НомерСтолбца1) // Верхний левый угол CellBR = Data.Cells(НомерСтроки2; НомерСтолбца2) // Нижний правый угол Cell = Data.Cells(НомерСтроки; НомерКолонки) // ячейка
Text = 'Выделяемое слово в ячейке' LengText = Length(Text) Cell = Data.Cells(НомерСтроки; НомерКолонки) if Not Cell.HasFormula iPosition = CharPos(Text; CellHL.Value) Cell.Characters(iPosition; LengText).Font.Bold = True // выделение жирным Cell.Characters(iPosition; LengText).Font.Underline = True // подчеркивание Cell.Characters(iPosition; LengText).Font.Italic = True // установка курсива endif
Data.Range(CellHL; CellBR).Merge
Data.Range(CellHL; CellBR).Font.Size = 12
Cell.Characters(iPosition; LengTextRed).Font.Color = -16776961 // установка красного цвета
Data.Range(CellHL; CellBR).HorizontalAlignment = -4130
Режим выравнивания |
Константа в Excel |
Значение в ISBL |
По центру |
xlHAlignCenter |
-4108 |
По центру выделения |
xlHAlignCenterAcrossSelection |
7 |
Распределенное |
xlHAlignDistributed |
-4117 |
С заполнением |
xlHAlignFill |
5 |
По значению |
xlHAlignGeneral |
1 |
По ширине |
xlHAlignJustify |
-4130 |
По левому краю |
xlHAlignLeft |
-4131 |
По правому краю |
xlHAlignRight |
-4152 |
Data.Range(CellHL; CellBR).VerticalAlignment = -4130
Режим выравнивания |
Константа в Excel |
Значение в ISBL |
По нижнему краю |
xlVAlignBottom |
-4107 |
По центру |
xlVAlignCenter |
-4108 |
Распределенное |
xlVAlignDistributed |
-4117 |
По высоте |
xlVAlignJustify |
-4130 |
По верхнему краю |
xlVAlignTop |
-4160 |
Data.Item(НомерСтроки; НомерКолонки).IndentLevel = Значение отступа в символах
Data.Range(CellHL; CellBR).Font.Name = 'Times New Roman'
Data.Range(CellHL; CellBR).ColumnWidth = Значение ширины в символах
Data.Range(CellHL; CellBR).RowHeight = Значение высоты в пунктах
SelectionTab = Data.Range(CellHL;CellBR) SelectionTab.Borders(XlBordersIndex).LineStyle = 1 // непрерывная линия
Значения константы XlBordersIndex:
Расположение линии |
Значение в Excel |
Константа в ISBL |
Линия по диагонали сверху – вниз |
xlDiagonalDown |
5 |
Линия по диагонали снизу – вверх |
xlDiagonalUp |
6 |
Линия, обрамляющая диапазон слева |
xlEdgeLeft |
7 |
Линия, обрамляющая диапазон сверху |
xlEdgeTop |
8 |
Линия, обрамляющая диапазон снизу |
xlEdgeBottom |
9 |
Линия, обрамляющая диапазон справа |
xlEdgeRight |
10 |
Все вертикальные линии внутри диапазона |
xlInsideVertical |
11 |
Все горизонтальные линии внутри диапазона |
xlInsideHorizontal |
12 |
Свойство LineStyle (тип линии) может принимать значения:
Тип линии |
Значение в Excel |
Константа в ISBL |
Нет линии |
xlLineStyleNone |
0 |
(_________) Непрерывная |
xlContinuous |
1 |
(_._._._._) В виде тире и точек |
xlDashDot |
4 |
(_.._.._..) В виде тире и двойных точек |
xlDashDotDot |
5 |
(.........) В виде точек |
xlDot |
8 |
(=====) В виде двойной линии |
xlDouble |
9 |
(/././././) В виде наклонной пунктирной |
xlSlantDashDot |
13 |
SelectionTab.Borders(XlBordersIndex).Weight = XlBorderWeight
Значения константы XlBorderWeight
Толщина линии |
Значение в Excel |
Константа в ISBL |
Сверхтонкая |
xlHairline |
1 |
Тонкая |
xlThin |
2 |
Средняя |
xlMedium |
3 |
Жирная |
xlThick |
4 |
SelectionTab.Borders(XlBordersIndex).ColorIndex = Index
где Index:
Data.Range(CellHL; CellBR).WrapText = True
ExcelApp.DisplayAlerts = False // отключение ExcelApp.DisplayAlerts = True // включение
Book.ExportAsFixedFormat(0; Filename;1; IncludeDocProperties; IgnorePrintAreas)
где
// Вставка сводной таблицы
PivotTable = Book.PivotCaches.Create(1; SourceData).CreatePivotTable(TableDestination; TableName)
где
Sheet2 = Book.WorkSheets(2) // Добавление поля в сводную таблицу PivotField1 = Sheet2.PivotTables(TableName).PivotFields(NameColumn) PivotField1.Orientation = 1 // задаем ориентацию – поле строки (поле столбца = 2; поле фильтра = 3) PivotField1.Position = 1 // номер поля в списке полей, выбранной для ориентации (нумеруется с 1)
где NameColumn – название колонки, которое совпадает с именем колонки в шапке таблицы с листа исходных данных.
PivotField2 = Sheet2.PivotTables(TableName).PivotFields(NameColumn) PivotField2.Orientation = 4 // задаем ориентацию – поле данных PivotField2.Function = 0 // функция суммы
Значения констант параметра Функции:
0 – сумма; 1 – количество; 2 – среднее; 3 – максимум; 4 – минимум.
RecordReference = References.ИмяСправочника.GetObjectByID(ИДЗаписи) // запись справочника Sheet.Hyperlinks.Add(Sheet.Cells(НомерСтроки; НомерКолонки); RecordReference.Hyperlink(hltText)) CellHL = Data.Cells(НомерСтроки; НомерКолонки) Cell = Data.Range(CellHL;CellHL) Cell.Formula = Rez.Name
В дальнейшем планирую написать аналогичную статью для MS Word.
Спасибо, очень полезная статейка!
Отличная статья. Добавлю еще несколько примеров, которые использовали сами.
Формат ячеек (обычно делаю для все колонки сразу):
Sheet.Columns("A").NumberFormat = "@" //текстовый формат
Sheet.Columns("B").NumberFormat = "# ##0,00" //числовой формат
Sheet.Columns("D").NumberFormat = "# ##0,00р." //денежный формат
можно формат настраивать для отдельных ячеек
Sheet.Range(CellHL; CellBR).NumberFormat = "@" //текстовый формат
Автофильтр:
Sheet.Range(CellHL; CellBR).AutoFilter
Печать шапки таблицы (3 верхние строчки) на каждой странице:
Sheet.PageSetup.PrintTitleRows = "$3:$3"
Ориентация страницы:
Sheet.PageSetup.Orientation = 2 //альбомная
Sheet.PageSetup.Orientation = 1 //книжная
Поля (установить по 1см):
Sheet.PageSetup.LeftMargin = ExcelApp.CentimetersToPoints(1) //левое
Sheet.PageSetup.TopMargin = ExcelApp.CentimetersToPoints(1) //верхне
Sheet.PageSetup.RightMargin = ExcelApp.CentimetersToPoints(1) //правое
Sheet.PageSetup.BottomMargin = ExcelApp.CentimetersToPoints(1) //нижнее
Назвать лист:
Sheet.Name = "Какое-то название"
Добавить номерацию страниц в правом нижнем колонтитуле:
Sheet.PageSetup.FirstPageNumber = 1 //номер первой страници
Sheet.PageSetup.FooterMargin = 15 //отступ колонтитутла от нижнего края страницы 0,5см (отступ умножать на 30)
Sheet.PageSetup.RightFooter = '&8 Страница &С&P из &К' //на первой странице трехстраничного отчета в колонтитуле будет текст шрифтом размера 8 "Страница 1 из 3"
Алена, спасибо за дополнение.
Аналогичная статья для MS Word: Несколько способов форматирования и обработки данных в Word документах с помощью IS-Builder.
Не нашел как залить ячейку. Если кому надо:
Data.Range(CellHL; CellBR).Interior.ColorIndex = index (берется из 14 пункта)
Подскажите, пожалуйста, а можно как-нибудь установить цвет RGB (255, 255,255) ?
Добрый день. Одним из вариантов установки цвета RGB является: вместо функции RGB() в Excel использовать формулу:
где
То есть для заливки ячейки можно использовать следующий код:
Ошиблась в формуле, формула должна быть такой:
Спасибо!
Отключение обновления экрана(ScreenUpdating) для ускорения работы макроса
Часто макросы требуют долгого времени выполнения, которое можно значительно сократить. В начале и в конце каждой ресурсоёмкой функции вызвать Prepare и Ended.
По порядку:
1. Отключить перерисовку объектов на экране, чтобы ничего не мигало.
2. Выключить расчет. Внимание, если макрос прерваляс посреди работы, то расчет так и останется в ручном режиме!
3. Не обрабатывать события.
4. Отображение границ страниц, тоже почему-то помогает.
5. В статусной строке выводятся различные данные, что замедляет работу, отключаем.
6. Это если нужно. Выключает сообщения Экселя. Например, мы делаем Workbook.Close, Эксель хочет спросить сохранить ли изменения. При выключении этого параметра все ответы будут даны автоматически (изменения не сохранятся).
Константин, спасибо за дополнения, интересная информация.
Дополню по заполнению формул в ячейки.
Столкнулся с тем что не работала формула суммирования значений полей, делал так:
формула записывалась, но не вычислялась пока ее не передернешь. Почитал что это проблема связанна с использованием функций на русском языке и нужно использовать их английские аналоги. СУММ замени на SUM и все заработало как надо.
в дополнение к предыдущему комментарию:
для формул с русскими названиями нужно использовать не Formula, а FormulaLocal. Таким образом правильными вариантами написания формул будут:
Спасибо большое за статью, Елизавета.
А можно определить ячейку (строку и столбец) в таблице Excel по искомому слову? Например, если "нужное слово" содержится в какой то из ячеек таблицы Excel, то вывести ее адрес (строка; столбец).
Дополню статью:
"Применение условного форматирования"
FormatConditions.Add( Type , Operator , Formula1 , Formula2 )
Где Type, одно из значений этих констант:
Operator:
Formula1:
Указывается в зависимости от нужных вам условий (в примере Operator = 3 Formula ="", что значит применять условие для ячеек равным "", или еще один пример Operator = 6 Formula =50, условие будет применено к значениям равным <50)
Formula2:
Используется, если Operator = xlBetween или xlNotBetween
Пример:
Святые люди...
Вот и от меня кусочек:
Пока моя память свежа... Тэги: [Сортировка, Excel, Sort, AutoFilter]
Хоть бы самому не забыть и вдруг кому понадобится - искать долго не придется...
Оформление с помощью стилей
Пример использования в отчёте по документам в файловом архиве
Прикреплен файл: ReportArchive.zip
По сортировке я MSDN курил https://docs.microsoft.com/en-us/office/vba/api/excel.sortfields.add
Значения ColorIndex
Для добавления листа обычно используется Excel.WorkSheets.Add - новый лист будет расположен слева от первого. Для добавления листа справа согласно: параметрам: Excel.WorkSheets.Add(Before,After,Count,Type) - в ISBL будет:
Excel.WorkSheets.Add(null; Excel.WorkSheets(Excel.WorkSheets.Count))
// Закрепить область (4 первые строки)
Excel.ActiveWindow.SplitRow = 4
Excel.ActiveWindow.FreezePanes = True
Добрый день, подскажите как можно выделить например строку, программно нажать "Формат по образцу", затем выделить другую строку и применить формат? очень нужно, помогите пожалуйста!
Никто не написал, а я напишу! Переименование листов!
Авторизуйтесь, чтобы написать комментарий