Форматирование ячеек в excel программно

Свойства ячейки, часто используемые в коде VBA Excel. Демонстрация свойств ячейки, как структурной единицы объекта Range, на простых примерах.

Объект Range в VBA Excel представляет диапазон ячеек. Он (объект Range) может описывать любой диапазон, начиная от одной ячейки и заканчивая сразу всеми ячейками рабочего листа.

Примеры диапазонов:

  • Одна ячейка – Range("A1").
  • Девять ячеек – Range("A1:С3").
  • Весь рабочий лист в Excel 2016 – Range("1:1048576").

Для справки: выражение Range("1:1048576") описывает диапазон с 1 по 1048576 строку, где число 1048576 – это номер последней строки на рабочем листе Excel 2016.

В VBA Excel есть свойство Cells объекта Range, которое позволяет обратиться к одной ячейке в указанном диапазоне (возвращает объект Range в виде одной ячейки). Если в коде используется свойство Cells без указания диапазона, значит оно относится ко всему диапазону активного рабочего листа.

Примеры обращения к одной ячейке:

  • Cells(1000), где 1000 – порядковый номер ячейки на рабочем листе, возвращает ячейку «ALL1».
  • Cells(50, 20), где 50 – номер строки рабочего листа, а 20 – номер столбца, возвращает ячейку «T50».
  • Range("A1:C3").Cells(6), где «A1:C3» – заданный диапазон, а 6 – порядковый номер ячейки в этом диапазоне, возвращает ячейку «C2».

Для справки: порядковый номер ячейки в диапазоне считается построчно слева направо с перемещением к следующей строке сверху вниз.

Подробнее о том, как обратиться к ячейке, смотрите в статье: Ячейки (обращение, запись, чтение, очистка).

В этой статье мы рассмотрим свойства объекта Range, применимые, в том числе, к диапазону, состоящему из одной ячейки.

Еще надо добавить, что свойства и методы объектов отделяются от объектов точкой, как в третьем примере обращения к одной ячейке: Range("A1:C3").Cells(6).

Свойства ячейки (объекта Range)

Свойство Описание
Address Возвращает адрес ячейки (диапазона).
Borders Возвращает коллекцию Borders, представляющую границы ячейки (диапазона). Подробнее…
Cells Возвращает объект Range, представляющий коллекцию всех ячеек заданного диапазона. Указав номер строки и номер столбца или порядковый номер ячейки в диапазоне, мы получаем конкретную ячейку. Подробнее…
Characters Возвращает подстроку в размере указанного количества символов из текста, содержащегося в ячейке. Подробнее…
Column Возвращает номер столбца ячейки (первого столбца диапазона). Подробнее…
ColumnWidth Возвращает или задает ширину ячейки в пунктах (ширину всех столбцов в указанном диапазоне).
Comment Возвращает комментарий, связанный с ячейкой (с левой верхней ячейкой диапазона).
CurrentRegion Возвращает прямоугольный диапазон, ограниченный пустыми строками и столбцами. Очень полезное свойство для возвращения рабочей таблицы, а также определения номера последней заполненной строки.
EntireColumn Возвращает весь столбец (столбцы), в котором содержится ячейка (диапазон). Диапазон может содержаться и в одном столбце, например, Range("A1:A20").
EntireRow Возвращает всю строку (строки), в которой содержится ячейка (диапазон). Диапазон может содержаться и в одной строке, например, Range("A2:H2").
Font Возвращает объект Font, представляющий шрифт указанного объекта. Подробнее о цвете шрифта…
HorizontalAlignment Возвращает или задает значение горизонтального выравнивания содержимого ячейки (диапазона). Подробнее…
Interior Возвращает объект Interior, представляющий внутреннюю область ячейки (диапазона). Применяется, главным образом, для возвращения или назначения цвета заливки (фона) ячейки (диапазона). Подробнее…
Name Возвращает или задает имя ячейки (диапазона).
NumberFormat Возвращает или задает код числового формата для ячейки (диапазона). Примеры кодов числовых форматов можно посмотреть, открыв для любой ячейки на рабочем листе Excel диалоговое окно «Формат ячеек», на вкладке «(все форматы)». Свойство NumberFormat диапазона возвращает значение NULL, за исключением тех случаев, когда все ячейки в диапазоне имеют одинаковый числовой формат. Если нужно присвоить ячейке текстовый формат, записывается так: Range("A1").NumberFormat = "@". Общий формат: Range("A1").NumberFormat = "General".
Offset Возвращает объект Range, смещенный относительно первоначального диапазона на указанное количество строк и столбцов. Подробнее…
Resize Изменяет размер первоначального диапазона до указанного количества строк и столбцов. Строки добавляются или удаляются снизу, столбцы – справа. Подробнее…
Row Возвращает номер строки ячейки (первой строки диапазона). Подробнее…
RowHeight Возвращает или задает высоту ячейки в пунктах (высоту всех строк в указанном диапазоне).
Text Возвращает форматированный текст, содержащийся в ячейке. Свойство Text диапазона возвращает значение NULL, за исключением тех случаев, когда все ячейки в диапазоне имеют одинаковое содержимое и один формат. Предназначено только для чтения. Подробнее…
Value Возвращает или задает значение ячейки, в том числе с отображением значений в формате Currency и Date. Тип данных Variant. Value является свойством ячейки по умолчанию, поэтому в коде его можно не указывать.
Value2 Возвращает или задает значение ячейки. Тип данных Variant. Значения в формате Currency и Date будут отображены в виде чисел с типом данных Double.
VerticalAlignment Возвращает или задает значение вертикального выравнивания содержимого ячейки (диапазона). Подробнее…

В таблице представлены не все свойства объекта Range. С полным списком вы можете ознакомиться не сайте разработчика.

Простые примеры для начинающих

Вы можете скопировать примеры кода VBA Excel в стандартный модуль и запустить их на выполнение. Как создать стандартный модуль и запустить процедуру на выполнение, смотрите в статье VBA Excel. Начинаем программировать с нуля.

Учтите, что в одном программном модуле у всех процедур должны быть разные имена. Если вы уже копировали в модуль подпрограммы с именами Primer1, Primer2 и т.д., удалите их или создайте еще один стандартный модуль.

Форматирование ячеек

Заливка ячейки фоном, изменение высоты строки, запись в ячейки текста, автоподбор ширины столбца, выравнивание текста в ячейке и выделение его цветом, добавление границ к ячейкам, очистка содержимого и форматирования ячеек.

Если вы запустите эту процедуру, информационное окно MsgBox будет прерывать выполнение программы и сообщать о том, что произойдет дальше, после его закрытия.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

Sub Primer1()

MsgBox «Зальем ячейку A1 зеленым цветом и запишем в ячейку B1 текст: «Ячейка A1 зеленая!»»

Range(«A1»).Interior.Color = vbGreen

Range(«B1»).Value = «Ячейка A1 зеленая!»

MsgBox «Сделаем высоту строки, в которой находится ячейка A2, в 2 раза больше высоты ячейки A1, « _

& «а в ячейку B1 вставим текст: «Наша строка стала в 2 раза выше первой строки!»»

Range(«A2»).RowHeight = Range(«A1»).RowHeight * 2

Range(«B2»).Value = «Наша строка стала в 2 раза выше первой строки!»

MsgBox «Запишем в ячейку A3 высоту 2 строки, а в ячейку B3 вставим текст: «Такова высота второй строки!»»

Range(«A3»).Value = Range(«A2»).RowHeight

Range(«B3»).Value = «Такова высота второй строки!»

MsgBox «Применим к столбцу, в котором содержится ячейка B1, метод AutoFit для автоподбора ширины»

Range(«B1»).EntireColumn.AutoFit

MsgBox «Выделим текст в ячейке B2 красным цветом и выровним его по центру (по вертикали)»

Range(«B2»).Font.Color = vbRed

Range(«B2»).VerticalAlignment = xlCenter

MsgBox «Добавим к ячейкам диапазона A1:B3 границы»

Range(«A1:B3»).Borders.LineStyle = True

MsgBox «Сделаем границы ячеек в диапазоне A1:B3 двойными»

Range(«A1:B3»).Borders.LineStyle = xlDouble

MsgBox «Очистим ячейки диапазона A1:B3 от заливки, выравнивания, границ и содержимого»

Range(«A1:B3»).Clear

MsgBox «Присвоим высоте второй строки высоту первой, а ширине второго столбца — ширину первого»

Range(«A2»).RowHeight = Range(«A1»).RowHeight

Range(«B1»).ColumnWidth = Range(«A1»).ColumnWidth

MsgBox «Демонстрация форматирования ячеек закончена!»

End Sub

Вычисления в ячейках (свойство Value)

Запись двух чисел в ячейки, вычисление их произведения, вставка в ячейку формулы, очистка ячеек.

Обратите внимание, что разделителем дробной части у чисел в VBA Excel является точка, а не запятая.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

Sub Primer2()

MsgBox «Запишем в ячейку A1 число 25.3, а в ячейку B1 — число 34.42»

Range(«A1»).Value = 25.3

Range(«B1»).Value = 34.42

MsgBox «Запишем в ячейку C1 произведение чисел, содержащихся в ячейках A1 и B1»

Range(«C1»).Value = Range(«A1»).Value * Range(«B1»).Value

MsgBox «Запишем в ячейку D1 формулу, которая перемножает числа в ячейках A1 и B1»

Range(«D1»).Value = «=A1*B1»

MsgBox «Заменим содержимое ячеек A1 и B1 на числа 6.258 и 54.1, а также активируем ячейку D1»

Range(«A1»).Value = 6.258

Range(«B1»).Value = 54.1

Range(«D1»).Activate

MsgBox «Мы видим, что в ячейке D1 произведение изменилось, а в строке состояния отображается формула; « _

& «следующим шагом очищаем задействованные ячейки»

Range(«A1:D1»).Clear

MsgBox «Демонстрация вычислений в ячейках завершена!»

End Sub

Так как свойство Value является свойством ячейки по умолчанию, его можно было нигде не указывать. Попробуйте удалить .Value из всех строк, где оно встречается и запустить код заново.

Различие свойств Text, Value и Value2

Построение с помощью кода VBA Excel таблицы с результатами сравнения того, как свойства Text, Value и Value2 возвращают число, дату и текст.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

Sub Primer3()

‘Присваиваем ячейкам всей таблицы общий формат на тот

‘случай, если формат отдельных ячеек ранее менялся

Range(«A1:E4»).NumberFormat = «General»

‘добавляем сетку (границы ячеек)

Range(«A1:E4»).Borders.LineStyle = True

‘Создаем строку заголовков

Range(«A1») = «Значение»

Range(«B1») = «Код формата» ‘формат соседней ячейки в столбце A

Range(«C1») = «Свойство Text»

Range(«D1») = «Свойство Value»

Range(«E1») = «Свойство Value2»

‘Назначаем строке заголовков жирный шрифт

Range(«A1:E1»).Font.Bold = True

‘Задаем форматы ячейкам A2, A3 и A4

‘Ячейка A2 — числовой формат с разделителем триад и двумя знаками после запятой

‘Ячейка A3 — формат даты «ДД.ММ.ГГГГ»

‘Ячейка A4 — текстовый формат

Range(«A2»).NumberFormat = «# ##0.00»

Range(«A3»).NumberFormat = «dd.mm.yyyy»

Range(«A4»).NumberFormat = «@»

‘Заполняем ячейки A2, A3 и A4 значениями

Range(«A2») = 2362.4568

Range(«A3») = CDate(«01.01.2021»)

‘Функция CDate преобразует текстовый аргумент в формат даты

Range(«A4») = «Озеро Байкал»

‘Заполняем ячейки B2, B3 и B4 кодами форматов соседних ячеек в столбце A

Range(«B2») = Range(«A2»).NumberFormat

Range(«B3») = Range(«A3»).NumberFormat

Range(«B4») = Range(«A4»).NumberFormat

‘Присваиваем ячейкам C2-C4 значения свойств Text ячеек A2-A4

Range(«C2») = Range(«A2»).Text

Range(«C3») = Range(«A3»).Text

Range(«C4») = Range(«A4»).Text

‘Присваиваем ячейкам D2-D4 значения свойств Value ячеек A2-A4

Range(«D2») = Range(«A2»).Value

Range(«D3») = Range(«A3»).Value

Range(«D4») = Range(«A4»).Value

‘Присваиваем ячейкам E2-E4 значения свойств Value2 ячеек A2-A4

Range(«E2») = Range(«A2»).Value2

Range(«E3») = Range(«A3»).Value2

Range(«E4») = Range(«A4»).Value2

‘Применяем к таблице автоподбор ширины столбцов

Range(«A1:E4»).EntireColumn.AutoFit

End Sub

Результат работы кода:

Сравнение свойств ячейки Text, Value и Value2

В таблице наглядно видна разница между свойствами Text, Value и Value2 при применении их к ячейкам с отформатированным числом и датой. Свойство Text еще отличается от Value и Value2 тем, что оно предназначено только для чтения.


Нередко приходится сталкиваться с ситуацией, когда нужно отформатировать 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(НомерСтроки; НомерКолонки)          // ячейка
  1. Выделение всего текста в ячейке
  • Data.Range(CellHL; CellBR). Font.Bold = True          // жирным
  • Data.Range(CellHL; CellBR).Font.Italic = True           // курсивом
  • Data.Range(CellHL; CellBR). Font.Underline = True   //подчеркиванием
  1. Выделение определенного слова в тексте ячейки
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
  1. Объединение ячеек
Data.Range(CellHL; CellBR).Merge
  1. Установка размера шрифта
Data.Range(CellHL; CellBR).Font.Size = 12
  1. Установка цвета текста
Cell.Characters(iPosition; LengTextRed).Font.Color = -16776961   // установка красного цвета
  1. Горизонтальное выравнивание ячейки
Data.Range(CellHL; CellBR).HorizontalAlignment = -4130

Режим выравнивания

Константа в Excel

Значение в ISBL

По центру

xlHAlignCenter

-4108

По центру выделения

xlHAlignCenterAcrossSelection

7

Распределенное

xlHAlignDistributed

-4117

С заполнением

xlHAlignFill

5

По значению

xlHAlignGeneral

1

По ширине

xlHAlignJustify

-4130

По левому краю

xlHAlignLeft

-4131

По правому краю

xlHAlignRight

-4152

  1. Вертикальное выравнивание ячейки
Data.Range(CellHL; CellBR).VerticalAlignment = -4130

Режим выравнивания

Константа в Excel

Значение в ISBL

По нижнему краю

xlVAlignBottom

-4107

По центру

xlVAlignCenter

-4108

Распределенное

xlVAlignDistributed

-4117

По высоте

xlVAlignJustify

-4130

По верхнему краю

xlVAlignTop

-4160

  1. Отступ
Data.Item(НомерСтроки; НомерКолонки).IndentLevel = Значение отступа в символах
  1. Установка темы шрифта
Data.Range(CellHL; CellBR).Font.Name = 'Times New Roman'
  1. Установка ширины ячеек
Data.Range(CellHL; CellBR).ColumnWidth = Значение ширины в символах
  1. Установка высоты ячеек
Data.Range(CellHL; CellBR).RowHeight = Значение высоты в пунктах
  1. Установка границы ячейки и тип линии границы
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

  1. Установка толщины линии границы 
SelectionTab.Borders(XlBordersIndex).Weight = XlBorderWeight

Значения константы XlBorderWeight

Толщина линии      

Значение в Excel

Константа в ISBL

Сверхтонкая

xlHairline

1

Тонкая

xlThin

2

Средняя

xlMedium

3

Жирная

xlThick

4

  1. Установка цвета линии границы 
 SelectionTab.Borders(XlBordersIndex).ColorIndex = Index

где Index: 

  1. Установка отметки напротив пункта «переносить по словам» 
Data.Range(CellHL; CellBR).WrapText = True
  1. Отключение/включение режима показа предупреждений          
ExcelApp.DisplayAlerts = False // отключение
ExcelApp.DisplayAlerts = True  // включение
  1. Сохранение книги в pdf формат      
  Book.ExportAsFixedFormat(0; Filename;1; IncludeDocProperties; IgnorePrintAreas)

где

  • 0 — значение Microsoft.Office.Interop.Excel.XlFixedFormatType, указывающее, сохранять книгу в формате PDF;
  • Filename — полный путь к новому файлу формата PDF;
  • 1 — значение Microsoft.Office.Interop.Excel.XlFixedFormatQuality, определяющее качество экспортируемого файла;
  • IncludeDocProperties — значение true, чтобы включить свойства документа в новый экспортированный файл; в противном случае — значение false;
  • IgnorePrintAreas — значение true, чтобы пропускать области печати, установленные при экспорте; в противном случае — false.
  1. Построение сводной таблицы

        // Вставка сводной таблицы

 PivotTable = Book.PivotCaches.Create(1; SourceData).CreatePivotTable(TableDestination; TableName)

где

  • 1 — значение константы xlPivotTableSourceType;
  • SourceData – данные для нового сводной таблицы (диапазон ячеек);
  • 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 – минимум.

  1. Вставка гиперссылки на запись справочника в ячейку
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.

Как выбрать и изменить форматирование диапазона

На чтение 3 мин. Просмотров 2.8k.

Что делает макрос: Этот простой макрос выбирает диапазон D5: D16 и форматирует его.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как этот код работает
  4. Код макроса
  5. Как этот код работает
  6. Код макроса
  7. Как использовать

Как макрос работает

В этом макросе определяется диапазон для выбора с помощью объекта Range.

Код макроса

Sub VibratDiapazon()
'Выбор диапазона
Range("D5:D16").Select
End Sub

После того, как выбран диапазон ячеек, вы можете использовать любые свойства Range, манипулируя ячейками. Мы изменили этот макрос, чтобы диапазон желтого цвета преобразовался в формат числа и стал выделенным жирным шрифтом.

Sub IzmenitFormat()
'Выбор диапазона
Range("D5:D16").Select
'Преобразование в формат числа
Selection.NumberFormat = "#,##0"
'Жирный шрифт
Selection.Font.Bold = True
'Заливка желтым цветом
Selection.Interior.ColorIndex = 36
End Sub

Вам не нужно запоминать все свойства объекта ячейки для того, чтобы манипулировать ими. Вы можете просто записать макрос, выполните форматирование, а затем посмотреть на код, который написал Excel. После того, как вы увидели, что синтаксис правильный, вы можете применить его по мере необходимости. Многие программисты Excel начинают обучение VBA с этого.

Вы заметили, что мы называем Selection много раз в предыдущем примере кода. Для того, чтобы написать более эффективный код, вы можете просто сослаться на диапазон, используя With … End With. Этот оператор говорит Excel, что любое действие, которое вы выполняете относится к объекту, который вы указали.

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

Sub IzmenitFormatWith()
With Range("D5:D16")
.NumberFormat = "#,##0"
.Font.Bold = True
.Interior.ColorIndex = 36
End With
End Sub

Как этот код работает

Еще один способ, вы можете выбрать диапазон с помощью элемента ячейки объекта Range.
Адрес ячеек — это удобный способ выбора диапазонов через код. Он требует только позиции строк и столбцов в качестве параметров. Ячейка (5, 4) относится к строке 5, столбцу 4 (или ячейка D5).
Ячейки (16, 4) относится к строке 16, столбцу 4 (или ячейки D16). Если вы хотите выбрать диапазон ячеек, просто укажите два пункта в объект Range. Этот макрос выполняет один и тот же выбор диапазона D5:D16:

Код макроса

Sub IzmenitFormatRange()
Range(Cells(5, 4), Cells(16, 4)).Select
End Sub

Как этот код работает

Вот полный код форматирования с помощью позиций ячеек. Опять же, обратите внимание, что этот макрос фактически не меняет диапазон. Мы можем работать с диапазоном, не выделяя его.

Код макроса

Sub IzmenitFormat3()
With Range(Cells(5, 4), Cells(16, 4))
.NumberFormat = "#,##0"
.Font.Bold = True
.Interior.ColorIndex = 36
End With
End Sub

Как использовать

Для реализации такого рода макроса, вы можете скопировать и вставить его в стандартный модуль:

  1. Активируйте редактор Visual Basic, нажав ALT + F11 на клавиатуре.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код в окно кода.

Содержание

  1. Формат отображаемого значения
  2. Применение стилей к ячейкам листа
  3. VBA-макрос: заливка, шрифт, линии границ, ширина столбцов и высота строк
  4. Вывод сообщений о числовых значениях цветов
  5. Выравнивание по горизонтали
  6. Основные свойства объекта Font
  7. Синтаксис и параметры
  8. Именные форматы даты и времени
  9. Именованные форматы чисел
  10. Символы для форматов даты и времени
  11. Заливка ячейки цветом в VBA Excel
  12. Создание новых стилей
  13. Выравнивание по вертикали
  14. Зачем нужны именованные стили
  15. Описание VBA-макроса для формата ячеек таблицы Excel
  16. Использование предопределенных констант
  17. Изменение существующих стилей

Формат отображаемого значения

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

  • рабочего листа по умолчанию;
  • установленный для диапазона пользователем;
  • примененный к диапазону из кода VBA Excel.

Если ячейка содержит текстовое значение, его начертание можно форматировать по отдельным частям (подстрокам). Такое форматирование доступно как в ручном режиме на рабочем листе, так и из кода VBA Excel.

У объекта Range есть свойство Font (шрифт), которое отвечает за форматирование (начертание) визуально отображаемого текста в ячейках рабочего листа. Его применение вызывает объект Font, который в свою очередь обладает собственным набором свойств, отвечающих за конкретный стиль начертания отображаемого значения.

Применение стилей к ячейкам листа

В Excel изначально установлено множество встроенных стилей. Найти их можно в меню Стили ячеек, которая расположена на вкладке Главная -> Стили.

Откроется галерея стилей (рисунок справа).

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

После применения стиля из галереи можно будет накладывать дополнительное форматирование на ячейки.

В процессе запыления данных сотрудниками отдела на некоторых листах были изменены форматы ячеек:

Необходимо сбросить форматирование ячеек и сделать так чтобы на всех таблицах планов выполнения работ были одинаковые форматы отображения данных. Формат ячеек для исходной таблицы должен быть закреплен за шаблоном, чтобы можно было сделать сброс и применять заданный стиль оформления в дальнейшем.

Чтобы выполнять такие задачи вручную можно попытаться облегчить процесс настройки множества опций форматирования для многих диапазонов ячеек на разных листах и рабочих книгах. Плюс к о всему можно ошибиться и применить несколько другие настройки форматирования.

Макросы Excel прекрасно справляются с форматированием ячеек на рабочих листах. Кроме того, делают это быстро и в полностью автоматическом режиме. Воспользуемся этими преимуществами и для решения данной задачи напишем свой код VBA-макроса. Он поможет нам быстро и безопасно сбрасывать форматы на исходный предварительно заданный в шаблоне главной таблицы.

Чтобы написать свой код макроса откройте специальный VBA-редактор в Excel: «РАЗРАБОТЧИК»-«Код»-«Visual Basic» или нажмите комбинацию клавиш ALT+F11:

В редакторе создайте новый модуль выбрав инструмент «Insert»-«Module» и введите в него такой VBA-код макроса:

SubSbrosFormat()
IfTypeName(Selection) <>"Range"Then Exit Sub
WithSelection
.HorizontalAlignment = xlVAlignCenter
.VerticalAlignment = xlVAlignCenter
.WrapText =True
.Borders.LineStyle = xlContinuous
.Borders.Weight = xlThin
.Font.ColorIndex = xlColorIndexAutomatic
.Interior.ColorIndex = xlColorIndexAutomatic
.Columns.AutoFit
.Rows.AutoFit
End With
End Sub

Теперь если нам нужно сбросить форматирование таблицы на исходный формат отображения ее данных, выделите диапазон ячеек A1:E20 и запустите макрос: «РАЗРАБОЧТИК»-«Код»-«Макросы»-«SbrosFormat»-«Выполнить». Результат работы макроса изображен ниже на рисунке:

Таблица приобрела формат, который определен макросом. Таким образом код VBA нам позволяет сбросить любые изменения формата ячеек на предустановленный автором отчета.

Вывод сообщений о числовых значениях цветов

Числовые значения цветов запомнить невозможно, поэтому часто возникает вопрос о том, как узнать числовое значение фона ячейки. Следующий код VBA Excel выводит сообщения о числовых значениях присвоенных ранее цветов.

Пример кода 2:

Sub ColorTest2()

MsgBox Range(“A1”).Interior.Color

MsgBox Range(“A4:D8”).Interior.Color

MsgBox Range(“C12:D17”).Cells(4).Interior.Color

MsgBox Cells(3, 6).Interior.Color

End Sub

Вместо вывода сообщений можно присвоить числовые значения цветов переменным, объявив их как Long.

Выравнивание по горизонтали

Для выравнивания текста в ячейках рабочего листа по горизонтали в VBA Excel используется свойство HorizontalAlignment объекта Range. Оно может принимать следующие значения:

Выравнивание Константа Значение
По левому краю xlLeft -4131
По центру xlCenter -4108
По правому краю xlRight -4152

Константу использовать удобнее, так как ее можно выбрать из подсказок и легче запомнить. Но и присвоение свойству HorizontalAlignment непосредственно числового значения константы будет работать точно так же.

Пример 1
Заполним три первые ячейки листа Excel текстом, соответствующим предполагаемому выравниванию. Затем применим к ним выравнивание по горизонтали, а в ячейках ниже выведем соответствующие значения констант.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Sub Primer1()

‘Заполняем ячейки текстом

Range(“A1”) = “Левая сторона”

Range(“B1”) = “Центр ячейки”

Range(“C1”) = “Правая сторона”

‘Применяем горизонтальное выравнивание

Range(“A1”).HorizontalAlignment = xlLeft

Range(“B1”).HorizontalAlignment = xlCenter

Range(“C1”).HorizontalAlignment = xlRight

‘Выводим значения констант

Range(“A2”) = “xlLeft = “ & xlLeft

Range(“B2”) = “xlCenter = “ & xlCenter

Range(“C2”) = “xlRight = “ & xlRight

End Sub

Основные свойства объекта Font

Свойство Описание Значения
Name наименование шрифта “Arial”, “Calibri”, “Courier New”, “Times New Roman” и т.д.
Size размер шрифта от 1 до 409 пунктов
Bold полужирное начертание True, False
Italic курсивное начертание True, False
FontStyle заменяет Bold и Italic “обычный”, “полужирный”, “курсив”, “полужирный курсив”
Superscript надстрочный текст True, False
Subscript подстрочный текст True, False
Underline подчеркнутый текст True, False
Color* цвет текста от 0 до 16777215

*Color – это не единственное свойство, отвечающее за цвет отображаемого текста в ячейке. Оно также может принимать и другие значения, кроме указанных в таблице. Смотрите подробности в статье Цвет текста (шрифта) в ячейке.

Синтаксис и параметры

Format(Expression, [FormatExpression], [FirstDayOfWeek], [FirstWeekOfYear])

  • Expression – любое допустимое выражение (переменная), возвращающее числовое значение или строку (обязательный параметр).
  • FormatExpression – выражение формата, именованное или содержащее инструкции из специальных символов (необязательный параметр).
  • FirstDayOfWeek – константа, задающая первый день недели (необязательный параметр).
  • FirstWeekOfYear – константа, задающая первую неделю года (необязательный параметр).

Именные форматы даты и времени

Имя формата Описание
General Date Стандартное отображение даты и времени в соответствии с параметрами системы.
Long Date Длинный формат даты.
Medium Date Средний формат даты.
Short Date Краткий формат даты.
Long Time Длинный формат времени.
Medium Time Средний формат времени.
Short Time Краткий формат времени.

Проверьте отображение даты и времени с использованием именованных форматов на вашем компьютере при помощи следующего кода VBA Excel:

Sub FormatDateTime()

MsgBox “General Date: “ & Format(Now, “General Date”) & vbNewLine _

& vbNewLine & “Long Date: “ & Format(Now, “Long Date”) & vbNewLine _

& vbNewLine & “Medium Date: “ & Format(Now, “Medium Date”) & vbNewLine _

& vbNewLine & “Short Date: “ & Format(Now, “Short Date”) & vbNewLine _

& vbNewLine & “Long Time: “ & Format(Now, “Long Time”) & vbNewLine _

& vbNewLine & “Medium Time: “ & Format(Now, “Medium Time”) & vbNewLine _

& vbNewLine & “Short Time: “ & Format(Now, “Short Time”)

End Sub

Скорее всего, результат будет таким:

Именованные форматы чисел

Имя формата Описание
General Number Стандартное отображение числа без знака разделителя групп разрядов.
Currency Денежный формат.
Fixed Отображение числа без знака разделителя групп разрядов с двумя цифрами после разделителя целой и дробной части.
Standard Отображение числа со знаком разделителя групп разрядов и с двумя цифрами после разделителя целой и дробной части.
Percent Процентный формат: отображение числа, умноженного на 100, со знаком процента (%), добавленного справа.
Scientific Отображение числа в экспоненциальном виде.
Yes/No Возвращается «Нет», если число равно 0, иначе отображается «Да».
True/False Возвращается «Ложь», если число равно 0, иначе отображается «Истина».
On/Off Возвращается «Выкл», если число равно 0, иначе отображается «Вкл».

Проверяем работу именованных форматов на числах 2641387.7381962 и 0 с помощью кода VBA Excel:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Sub FormatNumber()

Dim n As Double

n = 2641387.7381962

‘n = 0

MsgBox “Форматируемое число = “ & n & vbNewLine _

& vbNewLine & “General Number: “ & Format(n, “General Number”) & vbNewLine _

& vbNewLine & “Currency: “ & Format(n, “Currency”) & vbNewLine _

& vbNewLine & “Fixed: “ & Format(n, “Fixed”) & vbNewLine _

& vbNewLine & “Standard: “ & Format(n, “Standard”) & vbNewLine _

& vbNewLine & “Percent: “ & Format(n, “Percent”) & vbNewLine _

& vbNewLine & “Scientific: “ & Format(n, “Scientific”) & vbNewLine _

& vbNewLine & “Yes/No: “ & Format(n, “Yes/No”) & vbNewLine _

& vbNewLine & “True/False: “ & Format(n, “True/False”) & vbNewLine _

& vbNewLine & “On/Off: “ & Format(n, “On/Off”)

End Sub

Получаем следующий результат:

Вместо вопросительного знака в отображении числа в формате Currency, по идее, должен быть знак валюты (₽ или руб.).

Символы для форматов даты и времени

Символ Описание
Точка (.) Разделитель компонентов даты (день, месяц, год). Используется при отображении месяца в виде числа.
Пробел Разделитель компонентов даты (день, месяц, год). Используется при отображении месяца прописью.
Двоеточие (:) Разделитель компонентов времени (часы, минуты, секунды).
d День в виде числа без нуля в начале (1–31).
dd День в виде числа с нулем в начале (01–31).
m Месяц в виде числа без нуля в начале (1–31). Если (m) следует после (h) или (hh), отображаются минуты.
mm Месяц в виде числа с нулем в начале (01–31). Если (mm) следует после (h) или (hh), отображаются минуты.
mmm Месяц прописью в сокращенном виде (янв–дек).
mmmm Полное название месяца (январь–декабрь).
y День года в виде числа (1–366).
yy Год в виде 2-значного числа (00–99).
yyyy Год в виде 4-значного числа (1900–9999).
h Часы в виде числа без нуля в начале (0–23).
hh Часы в виде числа с нулем в начале (00–23).
n (m) Минуты в виде числа без нуля в начале (0–59).
nn (mm) Минуты в виде числа с нулем в начале (00–59).
s Секунды в виде числа без нуля в начале (0–59).
ss Секунды в виде числа с нулем в начале (00–59).

Примеры отображения даты с помощью разных по количеству наборов символа d:

Sub DataIsD()

MsgBox “d: “ & Format(Now, “d”) & vbNewLine _

& vbNewLine & “dd: “ & Format(Now, “dd”) & vbNewLine _

& vbNewLine & “ddd: “ & Format(Now, “ddd”) & vbNewLine _

& vbNewLine & “dddd: “ & Format(Now, “dddd”) & vbNewLine _

& vbNewLine & “ddddd: “ & Format(Now, “ddddd”) & vbNewLine _

& vbNewLine & “dddddd: “ & Format(Now, “dddddd”)

End Sub

Заливка ячейки цветом в VBA Excel

Пример кода 1:

Sub ColorTest1()

Range(“A1”).Interior.Color = 31569

Range(“A4:D8”).Interior.Color = 4569325

Range(“C12:D17”).Cells(4).Interior.Color = 568569

Cells(3, 6).Interior.Color = 12659

End Sub

Поместите пример кода в свой программный модуль и нажмите кнопку на панели инструментов «Run Sub» или на клавиатуре «F5», курсор должен быть внутри выполняемой программы. На активном листе Excel ячейки и диапазон, выбранные в коде, окрасятся в соответствующие цвета.

Есть один интересный нюанс: если присвоить свойству .Interior.Color отрицательное значение от -16777215 до -1, то цвет будет соответствовать значению, равному сумме максимального значения палитры (16777215) и присвоенного отрицательного значения. Например, заливка всех трех ячеек после выполнения следующего кода будет одинакова:

Sub ColorTest11()

Cells(1, 1).Interior.Color = 12207890

Cells(2, 1).Interior.Color = 16777215 + (12207890)

Cells(3, 1).Interior.Color = 4569325

End Sub

Проверено в Excel 2016.

Создание новых стилей

Если встроенных стилей Excel не достаточно, то можно создать собственные стили. Это достаточно просто сделать:

  1. Выберите любую ячейку и отформатируйте ее обычным способом так как вам нравится. Форматирование этой ячейки в дальнейшим мы сохраним как именованный стиль. Вы можете использовать любое доступное форматирование из диалогового окна Форматирование ячеек.
  2. Перейдите на вкладку Главная -> Стили ячеек и выберите команду Создать стиль ячейки. Откроется диалоговое окно Стиль.
  3. Выберите Имя стиля, которое будет в дальнейшем будете использовать.
  4. Выберите опции, которые будут применяться к выбранному стилю (по умолчанию отмечены все опции). Если нет необходимости в какой то опции, например вы не хотите изменять шрифт ячейки – то снимите выбор.
  5. Нажмите кнопку OK.

В результате в активную книгу будет добавлен новый пользовательский стиль, который будет доступен в меню Стили ячеек.

Выравнивание по вертикали

Для выравнивания текста в ячейках рабочего листа по вертикали в VBA Excel используется свойство VerticalAlignment объекта Range. Оно может принимать следующие значения:

Выравнивание Константа Значение
По верхнему краю xlTop -4160
По центру xlCenter -4108
По нижнему краю xlBottom -4107

Точно так же, как и по горизонтали, при выравнивании по вертикали свойству VerticalAlignment можно присваивать как значение из константы, так и непосредственно ее числовое значение.

Пример 2
Заполним три первые ячейки третьей строки листа Excel текстом, соответствующим предполагаемому выравниванию. Затем применим к ним выравнивание по вертикали, а в ячейках ниже выведем соответствующие значения констант.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Sub Primer2()

‘Заполняем ячейки текстом

Range(“A3”) = “Верх”

Range(“B3”) = “Центр”

Range(“C3”) = “Низ”

‘Применяем вертикальное выравнивание

Range(“A3”).VerticalAlignment = xlTop

Range(“B3”).VerticalAlignment = xlCenter

Range(“C3”).VerticalAlignment = xlBottom

‘Выводим значения констант

Range(“A4”) = “xlTop = “ & xlTop

Range(“B4”) = “xlCenter = “ & xlCenter

Range(“C4”) = “xlBottom = “ & xlBottom

End Sub

Зачем нужны именованные стили

Идея именованных стилей заключается в следующем:

  1. Можно создать собственный набор стилей для форматирования, например, заголовков, итогов, обычного текста. А после применять готовые стили на другие ячейки не тратя время на воспроизведение точно такого же формата.
  2. Если изменить формат стиля, то все ячейки, к котором применен данный стиль будут автоматически отформатированы. Таким образом, можно быстро пересматривать любой формат и не тратить время на форматирование ячеек по отдельности.

Стили Excel позволяют отформатировать следующие атрибуты:

  • числовой формат (например, число, короткий формат даты, формат телефонного номера и т.п.);
  • выравнивание (по вертикали и горизонтали);
  • шрифт (название, размер, цвет и пр.);
  • граница (тип линии, цвет границы);
  • заливка (цвет фона, узор);
  • защита (защищаемая ячейка, скрытие формул).

Описание VBA-макроса для формата ячеек таблицы Excel

Первая инструкция в коде, проверяет выделены ли ячейки диапазоном. Если перед выполнением макроса выделил другой элемент листа, например, график, тогда макрос закрывается и дальнейшие инструкции выполняться не будут. В противные случаи будут форматироваться все выделенные ячейки по очереди в соответствии с определенными настройками форматирования:

  1. Текст в значениях ячеек выравнивается по центру горизонтально и вертикально.
  2. Включен построчный перенос текста.
  3. Все границы ячеек получают черную обычной толщины непрерывную линию с черным цветом.
  4. Сброс цвета шрифта на авто.
  5. Удаляется любая заливка ячеек.
  6. Ширина столбцов автоматически настраивается под текст в ячейках.
  7. Автоматически настроить высоту строк по содержимому ячеек.

Использование предопределенных констант

В VBA Excel есть предопределенные константы часто используемых цветов для заливки ячеек:

Предопределенная константа Наименование цвета
vbBlack Черный
vbBlue Голубой
vbCyan Бирюзовый
vbGreen Зеленый
vbMagenta Пурпурный
vbRed Красный
vbWhite Белый
vbYellow Желтый
xlNone Нет заливки

Присваивается цвет ячейке предопределенной константой в VBA Excel точно так же, как и числовым значением:

Пример кода 3:

Range(“A1”).Interior.Color = vbGreen

Изменение существующих стилей

Вы можете изменить форматирование существующего стиля. При этом все ячейки, к которым применен данный стиль также изменят форматирование. Чтобы изменить стиль необходимо:

  1. Перейти на вкладку Главная -> Стили ячеек.
  2. Щелкнуть правой кнопкой мыши по стилю, который хотите изменить и выбрать команду Изменить.
  3. Откроется диалоговое окно Стиль, в котором указано применяемое к ячейке форматирование.
  4. Нажмите на кнопку Формат, и в появившемся диалоговом окне Формат ячеек задайте необходимое форматирование. Например, чтобы изменить размер шрифта перейдите на вкладку Шрифт, задайте нужный размер и нажмите кнопку ОК.
  5. Нажмите еще раз кнопку ОК, чтобы закрыть окно Стиль и применить форматирование к изменяемому стилю.

Источники

  • https://vremya-ne-zhdet.ru/vba-excel/formatirovaniye-teksta-v-yacheyke/
  • https://micro-solution.ru/excel/formatting/formatting-styles
  • https://exceltable.com/vba-macros/makrosy-dlya-formatirovaniya-yacheek
  • https://vremya-ne-zhdet.ru/vba-excel/tsvet-yacheyki-zalivka-fon/
  • https://vremya-ne-zhdet.ru/vba-excel/vyravnivaniye-teksta-v-yacheyke/
  • https://vremya-ne-zhdet.ru/vba-excel/funktsiya-format/

NikolayUh

6 / 5 / 1

Регистрация: 02.05.2015

Сообщений: 181

1

15.04.2018, 22:16. Показов 7439. Ответов 21

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Экспортирую данные из DataGridView в Excel:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Private Sub ToExcel()
        Dim xlApp As Excel.Application
        Dim xlWorkBook As Excel.Workbook
        Dim xlWorkSheet As Excel.Worksheet
        Dim misValue As Object = System.Reflection.Missing.Value
        Dim i As Integer
        Dim j As Integer
 
        xlApp = New Excel.Application
        xlApp.Visible = True
        xlWorkBook = xlApp.Workbooks.Add(misValue)
        xlWorkSheet = xlWorkBook.Sheets("Лист1")
 
 
        For i = 0 To Grid1.RowCount - 1
            For j = 0 To Grid1.ColumnCount - 1
                For k As Integer = 1 To Grid1.Columns.Count
 
                    xlWorkSheet.Cells(1, k) = Grid1.Columns(k - 1).HeaderText
                    xlWorkSheet.Cells(i + 1, j + 1) = _
                        Grid1(j, i).Value.ToString()
                Next
            Next
        Next
 
        xlWorkSheet.Cells(i + 1, j + 1).Columns.AutoFit()
        xlWorkSheet.SaveAs("C:DM.xls")
        xlWorkBook.Close()
        xlApp.Quit()
 
        releaseObject(xlApp)
        releaseObject(xlWorkBook)
       releaseObject(xlWorkSheet)
 
        'MsgBox("Ваш файл сохранен в C:DM.xls")
    End Sub
 
    Private Sub ReleaseObject(ByVal obj As Object)
        'процедура выгрузки объектов из памяти
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
            MessageBox.Show("Exception occured while releasing object " + ex.ToString())
        Finally
            GC.Collect()
        End Try
    End Sub

И теперь мне нужно следующее:
1.что бы все используемые ячейки имели все границы , я так понимаю что по окончанию экспорта нужно задать регион и задать ему Borders.LineStyle = True ;
2.что бы текст в первой строке (шапка таблицы) был «жирным»;
3. что бы цвет фона в первой строке (шапка таблицы) был серым;
4.что бы ширина столбцов автоматически устанавливалась по макс. содержимому ячейки, думаю что нужно как то программно выделить регион и задать ему Columns.AutoFit;
5.таблица DataGridView может содержать помимо текстовых данных ещё и рисунки, как экспортировать грид с рисунками в Excel.
Пытался сам разобраться, но не смог. Буду благодарен за помощь.



0



forlife

15 / 13 / 6

Регистрация: 13.03.2013

Сообщений: 130

17.04.2018, 17:28

2

Я экспортировал данные не из DataGridView, а из DataTable, и форматировал ячейки сразу после занесения туда данных.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 Private Sub WriteToExcel(ByVal Filename As String, ByVal tbl As DataTable)
 
        Dim xlApp As Excel.Application = Nothing
        Dim xlbook As Excel.Workbook = Nothing
        Dim xlsheet As Excel.Worksheet = Nothing
        xlApp = New Excel.Application()
 
        Try
            xlApp.Visible = False
            xlbook = xlApp.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet)
            xlbook.Activate()
 
            xlsheet = xlbook.Sheets.Item(1)
            xlsheet.Select()
            xlsheet.Name = "Отчет"
            With xlbook.ActiveSheet
                 
                ' Пишем и форматируем названия столбцов из DataGridView
                For n As Integer = 1 To DataGridView1.Columns.Count - 1
                    .cells(1, n) = DataGridView1.Columns(n).HeaderText ' Пишем данные в ячейку
                    .cells(1, n).Select() ' Выделяем только что записанную ячейку
                    xlApp.Selection.Font.ColorIndex = 1 ' Задаём цвет текста
                    xlApp.Selection.Font.Name = "Century Gothic" ' Задаем шрифт
                    xlApp.Selection.Font.Bold = True ' Задаём жирный шрифт
                    xlApp.Selection.Font.Size = 12 ' Задаём размер текста
                    xlApp.Selection.Borders.Weight = 3 ' Задаём толщину внешних границ ячейки
                    xlApp.Selection.HorizontalAlignment = -4108 ' Задаём вырввнивание текста внутри ячейки
                Next
 
                ' Пишем и форматируем ячейки с данными из DataTable
                For i As Integer = 0 To tbl.Rows.Count - 1
                    For j As Integer = 1 To tbl.Columns.Count - 1
                        .Cells(i + 2, j) = tbl.Rows(i).Item(j)
                        .cells(i + 2, j).Select()
                        xlApp.Selection.Font.Name = "Century Gothic"
                        xlApp.Selection.Font.ColorIndex = 1
                        xlApp.Selection.Font.Size = 10
                        xlApp.Selection.Borders.LineStyle = 1
                        xlApp.Selection.HorizontalAlignment = -4152
                    Next
                Next
            End With
 
            xlsheet.UsedRange.Columns.AutoFit()
 
            xlbook.SaveAs(Filename)
            xlbook.Close()
            xlApp.Quit()
 
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        Finally
            xlsheet = Nothing
            xlbook = Nothing
            xlApp = Nothing
            KillProc("excel")
        End Try
 
    End Sub

Код не мой. Я его лишь под себя поправил. И всё бы ничего, код работает, но не очень быстро. Уверен есть более правильные и скоростные решения.

Добавлено через 38 секунд

Цитата
Сообщение от NikolayUh
Посмотреть сообщение

4.что бы ширина столбцов автоматически устанавливалась по макс. содержимому ячейки, думаю что нужно как то программно выделить регион и задать ему Columns.AutoFit;

VB.NET
1
xlsheet.UsedRange.Columns.AutoFit()

Добавлено через 1 минуту
Всё форматирование делал с помощь макросов. Записывал их в Excel, потом переносил в свой код.



1



ovva

4278 / 3417 / 827

Регистрация: 02.02.2013

Сообщений: 3,308

Записей в блоге: 2

17.04.2018, 22:03

3

Лучший ответ Сообщение было отмечено NikolayUh как решение

Решение

Можно так. С сохранением книги и освобождением ресурсов полагаю справитесь сами.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    DataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText
    Dim eApp As New XLS.Application
    Dim eBooks As XLS.Workbooks = eApp.Workbooks
    Dim eBook As XLS.Workbook = eBooks.Add
    Dim eSheet As XLS.Worksheet = eBook.ActiveSheet
    Dim eRange As XLS.Range = eSheet.Range("C2")
    eSheet.Name = "Test"
    DataGridView1.SelectAll()
    If DataGridView1.GetCellCount(DataGridViewElementStates.Selected) > 0 Then
        Try
            Clipboard.Clear()
            Clipboard.SetDataObject(DataGridView1.GetClipboardContent(), False)
            eRange.PasteSpecial(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteAll, Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationAdd)
            Dim eRng As XLS.Range = eSheet.UsedRange
            eRng.AutoFormat(32)
            'добавляем недостающее
            With eRng.Borders(7) 'xlEdgeLeft = 7
                .LineStyle = 1 'xlContinuous = 1
                .Weight = 2 'xlThin = 2
                .ColorIndex = -4105 'xlAutomatic = -4105
            End With
            With eRng.Borders(10) 'xlEdgeRight = 10
                .LineStyle = 1
                .Weight = 2
                .ColorIndex = -4105
            End With
            With eRng.Borders(11) 'xlInsideVertical = 11
                .LineStyle = 1
                .Weight = 2
                .ColorIndex = -4105
            End With
            With eRng.Borders(12) 'xlInsideHorizontal = 12
                .LineStyle = 1
                .Weight = 2
                .ColorIndex = -4105
            End With
            eSheet.Range("A1").Select()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End If
    eApp.Visible = True
End Sub



3



forlife

15 / 13 / 6

Регистрация: 13.03.2013

Сообщений: 130

19.04.2018, 16:53

4

ovva, код работает очень быстро, что не может не радовать, но есть пара вопросов:

1. поменял строку

VB.NET
1
Dim eRange As XLS.Range = eSheet.Range("C2")

на

VB.NET
1
Dim eRange As XLS.Range = eSheet.Range("A1")

но итоговая таблица в Excel начинается с «B1». Столбец «А» остается пустым. Как исправить?
2. Что происходит в строке

VB.NET
1
eRng.AutoFormat(32)

Понял, что там происходит определенное форматирование текста и таблицы, но как это работает, не понимаю. Как добавить туда свои параметры? Как отдельно форматировать заголовок таблицы и тело таблицы?



0



ovva

4278 / 3417 / 827

Регистрация: 02.02.2013

Сообщений: 3,308

Записей в блоге: 2

19.04.2018, 17:45

5

1. Для начала напомню, что в DataGridView различают заголовки столбцов и заголовки строк, причем последние часто остаются не заполненными. В предложенном коде есть такая строка

VB.NET
1
DataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText

т.е. в копию будут включаться заголовки строк и столбцов. А т.к. заголовки строк не заполнены то в Excel имеем пустой столбец слева. Как этого избежать? Например, всегда, уже в Excel, удалять пустой столбец или отказаться от передачи заголовков и заполнять заголовки столбцов в коде.
2.

VB.NET
1
eRng.AutoFormat(32)

Это действие соответствует функции Excel «Автоформат» и 32 это одна из многочисленных аргументов-констант этой функции, а именно xlRangeAutoFormatTable1. Список этих констант можно посмотреть через Object Browser в Excel/VB: Enum XlRangeAutoFormat. Возможно, вас устроит какой-то иной формат и последующие строки программы (после ‘добавляем недостающее) вам не понадобятся.



0



qawaq

36 / 34 / 9

Регистрация: 27.11.2011

Сообщений: 425

19.04.2018, 17:57

6

Я сейчас играюсь с экспортом в эксель.
Только не из дата грида а из бд у меня такой код

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    Public Sub exportexcel(a As Integer) ' Подготовка выгрузки в эксель
        Dim b As Integer = exportindex
        Select Case a
            Case 1
                b = 2
                Exc = CreateObject("Excel.Application")
                Exc.workbooks.add
                Exc.visible = True
                Exc.sheets(1).Range("A1:" + Form1.alfavit(flagcolumn) + "1").Borders.LineStyle = True
                Exc.sheets(1).Range("A1:" + Form1.alfavit(flagcolumn) + "1").ColumnWidth = 20
                Exc.sheets(1).Range("A1:" + Form1.alfavit(flagcolumn) + "1").WrapText = True
                For i As Integer = 0 To flagcolumn
                    Exc.sheets(1).cells(1, i + 1).value = find.Columnname(i)
                Next i
                If flagselect = True Then findexport("`WHERE " + selestr, b) Else findexport("", b)
            Case 2
                b = exportindex
                If flagselect = True Then findexport("`WHERE " + selestr, b) Else findexport("", b)
            Case 3
                b = exportindex
                findexport("`WHERE id=" + """" + docs((DataGridView1.CurrentRow.Index + 1)).ToString() + """", b)
        End Select
    End Sub
    ' выгрузка в эксель
    Public Sub findexport(findstr As String, i As Integer) ' выгрузка в эксель
        Form1.Sqlcon.Open()
        Form1.cmd.CommandText = "SELECT * FROM `" + flagid.ToString() + findstr ' + "`WHERE " + findstr 'текст запрос на чтение пользователя
        Try
            Form1.reader = Form1.cmd.ExecuteReader() 'выполнить скул запрос
            While Form1.reader.Read() 'пока выполняеется запрос выполняеем
                For j As Integer = 1 To flagcolumn
                    Exc.sheets(1).cells(i, j).value = Form1.reader(Form1.alfavit(j)).ToString()
                Next j
                i = i + 1
                'End If
            End While
        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString(), ex.Source.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
        exportindex = i
        Exc.sheets(1).Range("A2:" + Form1.alfavit(flagcolumn) + (i - 1).ToString()).Borders.LineStyle = True
        Exc.sheets(1).Range("A2:" + Form1.alfavit(flagcolumn) + (i - 1).ToString()).WrapText = True
        Form1.reader.Close() 'закрыть чтение
        Form1.cmd.Parameters.Clear() 'очистить параметры
        Form1.Sqlcon.Close()
    End Sub

Думаю вполне можно заменить Exc.sheets(1).cells(i, j).value = Form1.reader(Form1.alfavit(j)).ToString() на Exc.sheets(1).cells(i, j).value =DataGridView1.Rows(i).Cels(j).Value.RoString()

Хотя я не про и не уверен. И если кто то пркоменитрует мою выгрузку то буду рад.



0



15 / 13 / 6

Регистрация: 13.03.2013

Сообщений: 130

19.04.2018, 18:02

7

Цитата
Сообщение от ovva
Посмотреть сообщение

Список этих констант можно посмотреть через Object Browser в Excel/VB: Enum XlRangeAutoFormat. Возможно, вас устроит какой-то иной формат и последующие строки программы (после ‘добавляем недостающее) вам не понадобятся.

Нашел, обязательно почитаю! Спасибо!

Но всё же, если я решу, что хочу сам отформатировать таблицу. Как это можно сделать? Например заголовок таблицы жирным 16 Arial с жирными внешними границами, а тело таблицы со стандартными границами (включая все внутренние), 14 шрифтом Courier New, с автоматической шириной столбцов по максимальному содержимому.

Для понимания работы с Excel так сказать.

Миниатюры

Форматирование ячеек Excel
 



0



4278 / 3417 / 827

Регистрация: 02.02.2013

Сообщений: 3,308

Записей в блоге: 2

19.04.2018, 18:59

8

Цитата
Сообщение от forlife
Посмотреть сообщение

хочу сам отформатировать таблицу. Как это можно сделать?

Под заголовком «‘добавляем недостающее» как раз и дается пример самостоятельного форматирования таблицы:
Граница по левой стороне
With eRng.Borders(7) ‘xlEdgeLeft = 7
Граница по правой стороне
With eRng.Borders(10) ‘xlEdgeRight = 10
Заполнение, вертикальные линии
With eRng.Borders(11) ‘xlInsideVertical = 11
Заполнение, горизонтальные линии
With eRng.Borders(12) ‘xlInsideHorizontal = 12
Для очерчивания границ области есть также eRng.BorderAround
Стиль линии (сплошная, пунктир и т.д.)
.LineStyle = 1 ‘xlContinuous = 1
Толщина линии
.Weight = 2 ‘xlThin = 2
Цвет линии
.ColorIndex = -4105 ‘xlAutomatic = -4105
Соответствующие константы, как уже писал, можно посмотреть через Object Browser.
Шрифт для всей таблицы
eRng.Font.Bold = FontStyle.Bold
eRng.Font.Color = Color.Red
eRng.Font.Size = 14
Шапку таблицы придется выделить отдельно и отдельно провести настройку.
В приведенном коде ширина столбцов определяется по максимальной строке.



1



NikolayUh

6 / 5 / 1

Регистрация: 02.05.2015

Сообщений: 181

20.04.2018, 00:02

 [ТС]

9

что за

VB.NET
1
 XLS

как его объявлять или какая ссылка нужна или что импортировать?

Добавлено через 7 минут
XLS заменил на Excel, вроде заработало.



0



ovva

4278 / 3417 / 827

Регистрация: 02.02.2013

Сообщений: 3,308

Записей в блоге: 2

20.04.2018, 00:10

10

Цитата
Сообщение от NikolayUh
Посмотреть сообщение

что за
vb.netВыделить код
1
*XLS
как его объявлять или какая ссылка нужна или что импортировать?

Просто импорт в программе был объявлен так

VB.NET
1
Imports XLS = Microsoft.Office.Interop.Excel



1



6 / 5 / 1

Регистрация: 02.05.2015

Сообщений: 181

20.04.2018, 00:34

 [ТС]

11

ovva, ваш код экспорта в excel почему то в столбике С2 выдаёт формат даты, то есть запись 17/1 отображает как 17 янв.. Как это исправить?



0



ovva

4278 / 3417 / 827

Регистрация: 02.02.2013

Сообщений: 3,308

Записей в блоге: 2

21.04.2018, 00:15

12

Цитата
Сообщение от NikolayUh
Посмотреть сообщение

почему то в столбике С2 выдаёт формат даты

До копирования определите формат поля

VB.NET
1
eSheet.Columns("С").NumberFormat = "@"



0



6 / 5 / 1

Регистрация: 02.05.2015

Сообщений: 181

21.04.2018, 09:13

 [ТС]

13

Спасибо, но кол-во столбцов может быть разное, в следующий раз может столбец «J» или столбец «K» выдать подобный сюрприз, необходимо что бы все столбцы имели текстовый формат.



0



ovva

4278 / 3417 / 827

Регистрация: 02.02.2013

Сообщений: 3,308

Записей в блоге: 2

21.04.2018, 16:07

14

Лучший ответ Сообщение было отмечено NikolayUh как решение

Решение

Цитата
Сообщение от NikolayUh
Посмотреть сообщение

что бы все столбцы имели текстовый формат

VB.NET
1
2
3
4
5
6
'...
Dim c0 As Integer = eRange.Column + 1, cn As Integer = c0 + DataGridView1.ColumnCount - 1
Dim r0 As Integer = eRange.Row, rn As Integer = r0 + DataGridView1.RowCount - 1
Dim eRF As XLS.Range = eSheet.Range(eSheet.Cells(r0, c0), eSheet.Cells(rn, cn))
eRF.NumberFormat = "@"
'...



3



NikolayUh

6 / 5 / 1

Регистрация: 02.05.2015

Сообщений: 181

24.04.2018, 00:31

 [ТС]

15

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Private Sub ToExcel()
        Dim sd As New SaveFileDialog
        sd.Filter = "Документ Excel(*.xlsx)|*.xlsx"
        sd.FileName = Label1.Text
        If sd.ShowDialog = System.Windows.Forms.DialogResult.OK Then
 
            Grid1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText
            Dim eApp As New Excel.Application
            Dim eBooks As Excel.Workbooks = eApp.Workbooks
            Dim eBook As Excel.Workbook = eBooks.Add
            Dim eSheet As Excel.Worksheet = eBook.ActiveSheet
            Dim eRange As Excel.Range = eSheet.Range("B2")
            eSheet.Name = "Отчёт"
 
            '====================================================
            Dim c0 As Integer = eRange.Column + 1, cn As Integer = c0 + Grid1.ColumnCount - 1
            Dim r0 As Integer = eRange.Row, rn As Integer = r0 + Grid1.RowCount - 1
            Dim eRF As Excel.Range = eSheet.Range(eSheet.Cells(r0, c0), eSheet.Cells(rn, cn))
            eRF.NumberFormat = "@"
            '====================================================
            
Grid1.SelectAll()
            If Grid1.GetCellCount(DataGridViewElementStates.Selected) > 0 Then
                Try
                    Clipboard.Clear()
                    Clipboard.SetDataObject(Grid1.GetClipboardContent(), False)
                    eRange.PasteSpecial(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteAll, Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationAdd)
                    Dim eRng As Excel.Range = eSheet.UsedRange
                    eRng.AutoFormat(32)
                    'добавляем недостающее
                    With eRng.Borders(7) 'xlEdgeLeft = 7
                        .LineStyle = 1 'xlContinuous = 1
                        .Weight = 2 'xlThin = 2
                        .ColorIndex = -4105 'xlAutomatic = -4105
                    End With
                    With eRng.Borders(10) 'xlEdgeRight = 10
                        .LineStyle = 1
                        .Weight = 2
                        .ColorIndex = -4105
                    End With
                    With eRng.Borders(11) 'xlInsideVertical = 11
                        .LineStyle = 1
                        .Weight = 2
                        .ColorIndex = -4105
                    End With
                    With eRng.Borders(12) 'xlInsideHorizontal = 12
                        .LineStyle = 1
                        .Weight = 2
                        .ColorIndex = -4105
                    End With
                    'eRng.Rows(1).Font.Bold = True
                    'eRng.Rows(1).Interior.Color = vbCyan
 
                    eSheet.Range("A1").Select()
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End If
 
            eApp.Visible = False
 
            eSheet.SaveAs(sd.FileName)
 
            eBooks.Close()
            eApp.Quit()
 
            ReleaseObject(eApp)
            ReleaseObject(eBooks)
            ReleaseObject(eSheet)
        End If
 
        sd.Dispose()
    End Sub
 
Private Sub ReleaseObject(ByVal obj As Object)
        'процедура выгрузки объектов из памяти
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
            MessageBox.Show("Exception occured while releasing object " + ex.ToString())
        Finally
            GC.Collect()
        End Try
    End Sub

И в результате всё равно :
значение в гриде 17/1 в Excel выдаёт как 17 Янв.. Я надо что бы выдавал точно как в гриде — 17/1



0



4278 / 3417 / 827

Регистрация: 02.02.2013

Сообщений: 3,308

Записей в блоге: 2

24.04.2018, 13:58

16

Цитата
Сообщение от NikolayUh
Посмотреть сообщение

значение в гриде 17/1 в Excel выдаёт как 17 Янв

У меня на вашем же коде все отрабатывает без проблем. Правда есть разница с вами, я работаю с Office 2003. Возможно,
• Установка текстового стиля не успевает отработать до вставки значений (и нужна какая то пауза)
• В версиях выше 2003, для NumberFormat текстовой стиль определяется каким-то другим кодом



0



1292 / 993 / 141

Регистрация: 01.10.2009

Сообщений: 3,153

Записей в блоге: 1

24.04.2018, 20:26

17

ovva,

Не по теме:

может еще и на XP?



0



6 / 5 / 1

Регистрация: 02.05.2015

Сообщений: 181

28.04.2018, 04:13

 [ТС]

18

ни у кого нет больше вариантов?



0



Модератор

Эксперт .NET

3878 / 3200 / 482

Регистрация: 27.01.2014

Сообщений: 5,844

28.04.2018, 04:57

19

NikolayUh, как вариант, перед экспортом в Эксель, прогнать грид и в ячейки с таким форматом «17/1» добавить в начало строки кавычку одинарную ‘…
Либо попробуйте создать шаблон с заранее выставленными форматами ячеек.



0



6 / 5 / 1

Регистрация: 02.05.2015

Сообщений: 181

02.05.2018, 16:38

 [ТС]

20

Шаблон заранее не возможно создать, потому что количество столбцов и ячеек может быть разное в зависимости от выбора пользователя.



0



Like this post? Please share to your friends:
  • Форматирование ячеек в excel примеры
  • Форматирование ячейки excel в зависимости от условия
  • Форматирование ячеек табличного процессора ms excel
  • Форматирование ячеек в excel при общем доступе
  • Форматирование ячеек в excel презентация