Макрос для форматирования таблиц в excel

В данном примере описаны макросы для автоматического форматирования или спроса формата для ячеек таблиц Excel средствами VBA.

VBA-макрос: заливка, шрифт, линии границ, ширина столбцов и высота строк

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

запыления планов работ.

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

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

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

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

Код Visual Basic.

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

Sub SbrosFormat()
If TypeName(Selection) <> "Range" Then Exit Sub
With Selection
.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

VBA-код макроса.

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

сбросить форматирование таблицы на исходный формат.

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



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

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

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

Модификация исходного кода макроса для форматирования

Если необходимо сделать так чтобы текст выравнивался не по центру относительно горизонтали, а по правую сторону ячейки, тогда измените константу xlHAlignCenter на xlHAlignRight. Она находиться в свойстве .HorizontalAlignment. Сделайте это следующим образом:

.HorizontalAlignment = xlHAlignRight.

Таким же образом можно выровнять текст по левую сторону изменив значение константы на xlHAlignLeft. Или можно выровнять положение текста по ширине ячейки используя константу xlHAlignJustify.

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

Если хотите выровнять текс к верху ячейки, тогда воспользуйтесь константой xlHAlignTop.

Если нужно применить для границ ячеек толстую и пунктирную линию в синем цвете, смодифицируйте инструкцию, отвечающую за формат линий:

.Borders.LineStyle = xlDash

.Borders.Color = vbBlue

.Borders.Weight = xlMedium

Описание настройки форматирования для линий границ ячеек. Мы будем получать разные дополнительные типы линий границ если для свойства LineStyle присваивать такие константы:

  • xlDoshDot – применяется для рисования пунктирных линий в границах ячеек;
  • xlDouble – рисует двойную линию;
  • xlHairLine – рисует тонкую линию;
  • xlThick – для рисования очень толстой линии.

Для настройки цвета линий Excel предлагает всего 8 констант для определенных цветов. Константы для настройки цвета линий границ для свойства Color:

  • vbBlack – черный;
  • vbWhite – белый;
  • vbRed – красный;
  • vbGreen –зеленый;
  • vbBlue – синий;
  • vbYellow – желтый;
  • vbMagenta – алый;
  • vbCyan – голубой.

Но при необходимости присвоить линиям границ другие цвета можно вместо константы для свойства Color записать функцию RGB(). Достаточно лишь в аргументе этой функции указать код цвета по шкале от 0 и до 255.

Если нужно применить толстую линию только для границ выделенного диапазона, тогда перед инструкцией End With добавьте следующую строку кода:

.BorderAround xlContinuous, xlMedium, vbBlack

Описание: В первом аргументе для метода BorderAround можно записать также другой стиль линии. Во втором – толщину линии, а в третьем – цвет. Константы, которые можно присвоить в качестве значений для этих аргументов можно использовать те же, которые мы использовали для свойств: LineStyle, Weight, Color.

Если нужно экспонировать первую строку для выделенного диапазона с помощью жирного и курсивного шрифта значений ячеек. А также заполнить ячейки первой строки заливкой с голубым цветом, тогда в самом конце кода макроса перед последней инструкцией End Sub следует добавить несколько строк с VBA-кодом:

.Rows(1).Font.Bold = True

.Rows(1).Font.Italic = True

.Rows(1).Interior.Color = vbCyan

Если хотите присвоить такой же формат для не только для первой строки, но и для первого столбца выделенного диапазона, тогда скопируйте и вставьте ниже эти 3 строчки кода. После в последних трех строках измените свойство Rows на Columns.

.Columns (1).Font.Bold = True

.Columns (1).Font.Italic = True

.Columns (1).Interior.Color = vbCyan

Если нужно задать особенный формат для экспонирования последней строки выделенного диапазона, тогда измените число 1 в аргументе свойства Rows на число всех выделенных строк .Rows.Count. Например, добавьте в конец кода еще такую строку:

.Rows(.Rows.Count).Font.Bold = True

Полная версия модифицированного кода макроса выглядит так:

Sub SbrosFormat()
If TypeName(Selection) <> "Range" Then Exit Sub
With Selection
.HorizontalAlignment = xlVAlignCenter
.VerticalAlignment = xlVAlignCenter
.WrapText = True
.Borders.LineStyle = xlDash
.Borders.Color = vbBlue
.Borders.Weight = xlMedium
.Font.ColorIndex = xlColorIndexAutomatic
.Interior.ColorIndex = xlColorIndexAutomatic
.Columns.AutoFit
.Rows.AutoFit
.BorderAround xlContinuous, xlMedium, vbBlack
.Rows(1).Font.Bold = True
.Rows(1).Font.Italic = True
.Rows(1).Interior.Color = vbCyan
.Columns(1).Font.Bold = True
.Columns(1).Font.Italic = True
.Columns(1).Interior.Color = vbCyan
.Rows(.Rows.Count).Font.Bold = True
End With
End Sub

Пример работы измененного кода VBA-макроса:

Пример после изменений в коде.

В данном примере вы ознакомились с базовыми возможностями форматирования с помощью VBA-макросов. Уверен, что теперь вы сможете самостоятельно найти практическое применение этим исходным кодам.

Пример макроса. Форматируем таблицу.

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

Итак, есть таблица

и мы хотим ее отформатировать так:

  • шапка и последняя (итоговая) строки — жирным шрифтом, текст шапки — по центру
  • граница всей таблицы — сплошной жирной линией
  • границы ячеек внутри — пунктирной линией

Запускаем на запись макрос

«Меню»

«Сервис»

«Макрос»

«Начать запись»

.

Дальше по шагам:

  1. Выделяем всю таблицу.
  2. Правой кнопкой вызываем контекстное меню и выбираем «Формат ячеек«.
  3. Выбираем вкладку «Граница«. Выбираем тип линии «сплошная жирная» и щелкаем кнопку «внешние«, затем тип линии «пунктир» и щелкаем кнопку «внутренние«.
  4. Щелкаем ОК. Границы должны появиться.
  5. Выделяем первую строку таблицы и щелкаем на панели инструментов  «форматирование» кнопки «по центру» и «полужирный«.
  6. Выделяем последнюю строку таблицы и щелкаем на панели инструментов  «форматирование» кнопку «полужирный«.

Останавливаем запись макроса и открываем его для редактирования

«Меню»

«Сервис»

«Макрос»

«Макросы»

кнопка

«Изменить»

Получаем такой код:

Справа от команд я записал, что выполняет команда.

Глядя на макрос мы видим жесткую привязку к диапазонам. Надо от этого избавиться.

Удаляем строки со второй по четвертую, а именно
Range(«B4:F12»).Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone

Удаляем строку  
Range(«B4:F4»).Select   
и вместо следующей строки
With Selection
пишем
With Selection.Rows(1)  — так мы ссылаемся на первую строку выделенного диапазона

Вместо строки
Selection.Font.Bold = True
пишем
Selection.Rows(1).Font.Bold = True  — опять же ссылаемся на первую строку и делаем текст в ней жирным.

Удаляем строку
Range(«B12:F12»).Select  
и вместо следующей строки
Selection.Font.Bold = True
пишем
Selection.Rows(Selection.Rows.Count).Font.Bold = True — ссылаемся на последнюю строку и делаем текст в ней жирным.

Теперь можно проверить макрос.

Для этого выделяем нужную таблицу и запускаем макрос  

«Меню»

«Сервис»

«Макрос»

«Макросы»

кнопка

«Выполнить»

.

Похожие по тематике посты — еще почитать:

  1. Что делает макрос для выбора диапазона
  2. Код макроса для выбора диапазона
  3. Как работает макрос
  4. Что делает макрос для изменения форматирования диапазона
  5. Код макроса для изменения форматирования диапазона
  6. Как работает макрос
  7. Что делает макрос для изменения форматирования диапазона без выделения диапазона
  8. Код макроса для изменения форматирования диапазона без выделения диапазона
  9.  Что делает макрос для изменения форматирования диапазона через позиции ячеек
  10. Код макроса для изменения форматирования диапазона через позиции ячеек
  11. Как использовать
  12. Скачать файл

Ссылка на это место страницы:
#zadacha1

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

Ссылка на это место страницы:
#formula1

  1. Sub VibratDiapazon()
  2. Range("D5:D16").Select
  3. End Sub

Ссылка на это место страницы:
#kak1

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

Ссылка на это место страницы:
#zadacha2

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

Ссылка на это место страницы:
#formula2

  1. Sub IzmenitFormat()
  2. Range("D5:D16").Select
  3. Selection.NumberFormat = "#,##0"
  4. Selection.Font.Bold = True
  5. Selection.Interior.ColorIndex = 36
  6. End Sub

Ссылка на это место страницы:
#kak2

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

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

Ссылка на это место страницы:
#zadacha3

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

Ссылка на это место страницы:
#formula3

  1. Sub IzmenitFormatWith()
  2. With Range("D5:D16")
  3. .NumberFormat = "#,##0"
  4. .Font.Bold = True
  5. .Interior.ColorIndex = 36
  6. End With
  7. End Sub

Ссылка на это место страницы:
#zadacha4

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

Адрес ячеек — это удобный способ выбора диапазонов через код. Он требует только позиции строк и столбцов в качестве параметров. Ячейка (5, 4) относится к строке 5, столбцу 4 (или ячейка D5). 

Ячейки (16, 4) относится к строке 16, столбцу 4 (или ячейки D16). Если вы хотите выбрать диапазон ячеек, просто укажите два пункта в объект Range

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

Ссылка на это место страницы:
#formula4

  1. Sub IzmenitFormatWith()
  2. With Range("D5:D16")
  3. .NumberFormat = "#,##0"
  4. .Font.Bold = True
  5. .Interior.ColorIndex = 36
  6. End With
  7. End Sub

Ссылка на это место страницы:
#touse

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

Ссылка на это место страницы:
#file

Файлы статей доступны только зарегистрированным пользователям.

1. Введите свою почту

2. Нажмите Зарегистрироваться

3. Обновите страницу
Вместо этого блока появится ссылка для скачивания материалов.

Привет! Меня зовут Дмитрий. С 2014 года Microsoft Cretified Trainer. Вместе с командой управляем этим сайтом. Наша цель — помочь вам эффективнее работать в Excel. 

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

Подписывайтесь на нас в соц.сетях:

0 / 0 / 0

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

Сообщений: 12

1

22.03.2011, 11:54. Показов 9647. Ответов 28


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

Здравствуйте, необходимо отформатировать таблицы ( написать макросы ) для нескольких примеров в архиве.
Задания не сложные, но т.к. мои познания в VBA не большие — это доставляет большие трудности.

вот примеры:

Заранее спасибо!

файл сюда прицепи



0



11482 / 3773 / 677

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

Сообщений: 11,145

22.03.2011, 16:41

2

Что мешает включить запись макросов?
Лень или просто нежелание?
Пусть форумчане думают!?



0



0 / 0 / 0

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

Сообщений: 12

23.03.2011, 09:30

 [ТС]

3

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

Что мешает включить запись макросов?
Лень или просто нежелание?
Пусть форумчане думают!?

как это решит мою задачу? у меня таблицы не статические. каждый раз колличество полей или строк может меняться. нужнен макрос ( цикл по значениям таблицы с условием ). или хотябы пример макроса кода.

алгоритм тут легкий, но записать его в VBA я не могу, из за незнания языка…

или подскажите как записать макрос на одном из примеров.

вот примеры:
ссылка 1
http://www.sendspace.com/file/ny898i

либо ссылка 2
[ATTACH]68590[/ATTACH]



0



11482 / 3773 / 677

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

Сообщений: 11,145

23.03.2011, 12:03

4

как записать макрос

Добавлено через 1 час 43 минуты

каждый раз колличество полей или строк может меняться

Миллион раз обсуждалось: нахождение последней заполненной ячейки



0



fox31

0 / 0 / 0

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

Сообщений: 12

24.03.2011, 16:36

 [ТС]

5

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Macro()
    Dim i As Integer
    i = 3
    Do Until i = 255
    i = i + 1
    If Range(" I , 1").Columns.Find("ВСЕГО") Then
    Cells.Next
    Range("A5 : D1").Interior.ColorIndex = 2
    
    End If
    Exit Do
    Loop
    End Sub

выдает ошибку при запуске макроса. в чем ошибка?

прохожусь по 1му столбцу до 255 если находит слово «ВСЕГО» выделяет цветом область следующей строки с A5 : D1



0



1508 / 478 / 56

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

Сообщений: 8,008

24.03.2011, 16:51

6

а почему 255?
А не лучше
Количество_строк = ActiveSheet.Rows.Count ‘в Microsoft Office Excel 2003 — 256
если Вы новичёк то зря пользуетесь Do Until …
Interior — ???
‘задаём цвет шрифта для … ячейки равным …
Worksheets(«Лист1»).Range(«a1»).Font.ColorIndex = 3 ‘красный

Добавлено через 6 минут
немного не в тему, чтобы не плодить тем
А как по уму узнать, что между столбцами Экселя N и X = 14



0



fox31

0 / 0 / 0

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

Сообщений: 12

24.03.2011, 17:01

 [ТС]

7

переделал немного код

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Macro()
    Dim i As Long
    i = 1
    Do Until Cells(i, 1).Value = ""
    i = i + 1
    If Cells(i, 1).Value = "ВСЕГО" Then
    Rows(A1, D1).Select
    Rows("A5 , D1").Interior.ColorIndex = 5
    
    End If
    Exit Do
    Loop
    End Sub

идет по 1му столбцу до пустой ячейки и красит ячейки в строках с A5 до D1
Ципихович Эндрю спасибо, попробую
запускается нормально, но окрашивания нет.



0



11482 / 3773 / 677

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

Сообщений: 11,145

24.03.2011, 17:01

8

Когда спрашиваешь где ошибка — говори какую строчку веделяет отладчик
Я так думаю, что здесь:
If Range(» I , 1″).



0



1508 / 478 / 56

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

Сообщений: 8,008

24.03.2011, 17:06

9

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

спасибо, попробую
запускается нормально, но окрашивания нет.

так внимательно какую поставили ячейку!!!!!!! на окрашивание



0



0 / 0 / 0

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

Сообщений: 12

24.03.2011, 17:19

 [ТС]

10

Цитата
Сообщение от Ципихович Эндрю
Посмотреть сообщение

так внимательно какую поставили ячейку!!!!!!! на окрашивание

это я сказал по своему переделанному коду, не вашему варианту
пс мне изменить нужно не цвет шрифта а цвет ячеек

Добавлено через 9 минут

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

Когда спрашиваешь где ошибка — говори какую строчку веделяет отладчик
Я так думаю, что здесь:
If Range(» I , 1″).

да, тогда в этом ошибка оказалась



0



1508 / 478 / 56

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

Сообщений: 8,008

24.03.2011, 17:23

11

цвет ячеек, легко

Range

(«A5»).Interior.ColorIndex = 5



0



0 / 0 / 0

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

Сообщений: 12

24.03.2011, 17:26

 [ТС]

12

Цитата
Сообщение от Ципихович Эндрю
Посмотреть сообщение

цвет ячеек, легко

Range

(«A5»).Interior.ColorIndex = 5

это вариант пробовал.
виднимо, что то не так в условии цикла, что не окрашивает



0



1508 / 478 / 56

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

Сообщений: 8,008

24.03.2011, 17:29

13

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

Range

раньше же у Вас было Rows



0



0 / 0 / 0

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

Сообщений: 12

24.03.2011, 17:30

 [ТС]

14

Цитата
Сообщение от Ципихович Эндрю
Посмотреть сообщение

раньше же у Вас было Rows

да, но пробовал писать и Range



0



1508 / 478 / 56

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

Сообщений: 8,008

24.03.2011, 17:31

15

короче полный последний код



0



Alex77755

11482 / 3773 / 677

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

Сообщений: 11,145

24.03.2011, 17:44

16

Это у тебя во втором примере?
Попробуй так

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub Macro()
Dim i As Long
Dim RNG As Range
Dim RK
Dim R1
Set RNG = Cells.Find(What:="ИТОГО", After:=ActiveCell, LookIn:=xlValues, LookAt:= _
        xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False)
R1 = RNG.Row
RK = Columns(RNG.Column).Rows(65536).End(xlUp).Row
Range(Cells(R1, RNG.Column), Cells(RK, RNG.Column)).Interior.ColorIndex = 6
End Sub



1



mc-black

2784 / 716 / 106

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

Сообщений: 1,443

24.03.2011, 17:55

17

Я не читал топик, взял последний пример кода и подключил телепатические способности. Вот что из этого вышло (исправлено 3 бага):

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub Macro()
    Dim i As Long
    i = 1
    Do Until Cells(i, 1).Value = ""
        If Cells(i, 1).Value = "ВСЕГО" Then
            Range(Cells(i, 1), Cells(i, 4)).Interior.ColorIndex = 5
            Exit Do
        End If
        i = i + 1
    Loop
End Sub

А не работало, так как в теле цикла вне условий стояло Exit Do.



0



0 / 0 / 0

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

Сообщений: 12

24.03.2011, 17:56

 [ТС]

18

Это у тебя во втором примере?
Попробуй так

Да во 2м, спсибо, работает отлично. но код ваш для меня немного не понятен

скажите, пожалуйста как можно организовать цикл по вашему коду? (чтобы он все столбцы «итого» прорисовывал) все попытки сделать цикл у меня приводили к зависанию экселя и vba редактора



0



Busine2009

Заблокирован

29.03.2011, 10:12

19

fox31,
в поле для справки введите Find.
Найдите то ли Find Method, то ли Find Object. Там есть пример, как цикл сделать.



1



fox31

0 / 0 / 0

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

Сообщений: 12

29.03.2011, 11:27

 [ТС]

20

получается так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub Macro()
Dim RNG As Range
Dim RK
Dim R1
With Range("a1:y500")
Set RNG = Cells.Find(What:="ВСЕГО", After:=ActiveCell, LookIn:=xlValues, LookAt:= _
        xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False)
    If Not RNG Is Nothing Then
    firstAddress = RNG.Address
     Do
R1 = RNG.Row
RK = Columns(RNG.Column).Rows(65536).End(xlUp).Row
Range(Cells(R1, RNG.Column), Cells(RK, RNG.Column)).Interior.ColorIndex = 6
Loop While Not RNG Is Nothing And RNG.Address <> firstAddress
End If
End With
End Sub

но опять же действует для одного значения «ИТОГО»



0



На чтение 7 мин. Просмотров 2k.

Итог: Экономите тонны времени, автоматически форматируя числа в области ваших сводных таблиц с помощью макроса VBA. Форматирование чисел автоматически применяется при перетаскивании поля в область «Значения» за один шаг.

Уровень мастерства: Средний

Number Formatting Automatically Applied GIF2

Содержание

  1. Видео
  2. Скачать файл
  3. Проблема с форматами чисел сводных таблиц
  4. Макрос автоматического форматирования чисел
  5. Как я могу использовать эту функцию?
  6. Как работает макрос?
  7. Будущие улучшения

Видео

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

Скачать файл

Загрузите
файл, содержащий макросы.

Pivot Table Automatic Number Formatting Macro.xlsm (28.4 KB)

Надстройка PivotPal (платная) также имеет эту функцию и может быть загружена и установлена.

Второе видео, объясняющее макрос, доступно ниже.

Проблема с форматами чисел сводных таблиц

Обычно, когда мы добавляем поле в область значений сводной
таблицы, ячейки форматируются в формате общего числа. Это формат по умолчанию
для всех ячеек на листе, и сводная таблица НЕ меняет его.

К сожалению, общий числовой формат делает номера уродливыми. Как вы можете видеть на скриншоте ниже, общий формат не добавляет запятые/точки для разделителей тысяч, количество десятичных знаков не фиксировано.

Pivot Table General Formatting Used by Default

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

Итак, как мы можем изменить форматирование по умолчанию на
что-то, кроме General?

Я создал макрос, который автоматически применяет
форматирование чисел при добавлении поля в область значений. Я также добавил
эту функцию в надстройку PivotPal. Если вы не хотите связываться с макросами,
вы можете скачать и установить надстройку, чтобы получить эту функцию.

Макрос автоматического форматирования чисел

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

Number Formatting Automatically Applied Field Added to Values Area

Какой формат чисел он использует?

Макрос определяет числовой формат, используемый в диапазоне исходных данных поля. В приведенном ниже примере столбец «Доход» в диапазоне исходных данных отформатирован в формате «Финансовый». Таким образом, макрос обнаруживает это и автоматически применяет этот числовой формат к полю «Доход» в области значений.

Number Formatting from Source Data Range is Detected and Applied

Если столбец в диапазоне исходных данных не отформатирован, то применяется числовой формат по умолчанию. Числовой формат по умолчанию в настоящее время установлен в формате запятой [0] (#, 000), но вы можете изменить это в коде макроса или в надстройке PivotPal.

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

Default Number Formatting Applied if Source Data Column is Not Formatted

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

Макрос будет работать с любой существующей сводной таблицей или новой сводной таблицей.

Автоматическое форматирование чисел может быть включено / выключено нажатием кнопки в меню правой кнопки мыши на сводной таблице. Эта кнопка добавлена с макросом, который включен в загружаемый файл.

Automatic Number Formatting Pivot Table Right Click Menu Button

Как я могу использовать эту функцию?

Есть два способа реализовать эту функцию.

Вариант 1. Добавьте макросы в личную книгу макросов.

Вы можете скачать файл, содержащий макросы, и добавить модули кода в свою личную книгу макросов (PMW).

Pivot Table Automatic Number Formatting Macro.xlsm (28.4 KB)

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

Изучите мою статью и серию видео в Персональной рабочей книги для макросов, чтобы узнать все об этом инструменте для Excel.

Вариант 2. Получить надстройку PivotPal

Эта функция также была добавлена в надстройку PivotPal. Это платная надстройка.

" width="640" height="360"

Вы можете скачать и установить PivotPal, чтобы получить эту функцию. Вам не нужно знать VBA или связываться с любым кодом для этой опции. Просто скачайте и установите надстройку, и кнопка «Автоформатирование чисел» будет добавлена в меню, вызываемое правой кнопкой мыши.

Нажмите здесь, чтобы узнать больше о PivotPal

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

Видео ниже объясняет в деталях, как работает макрос.

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

Class Module for PivotTableUpdate Auto Number Formatting App Event

Макрос использует цикл For Next Loop для циклического прохождения всех полей в области значений (поля данных) и проверяет свойство NumberFormat, чтобы увидеть, отформатированы ли они в общем формате. Если поле содержит общее форматирование, то макрос пытается получить форматирование для поля в диапазоне исходных данных. Если он не найден или является общим, то макрос применяет заданный вами формат чисел по умолчанию. Так или иначе, ячейки в области значений НИКОГДА не будут отформатированы с общим форматом.

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

Решение использует События приложения для мониторинга изменений в любой сводной таблице в любой открытой книге. Это означает, что вы можете добавить модули кода в свою личную книгу макросов или файл надстройки, код будет выполняться на любой открытой книге. Вам НЕ нужно добавлять макросы в каждую книгу, которая содержит сводные таблицы.

Вот две хорошие статьи от Chip Pearson и Microsoft.

Модули кода также содержат макросы для добавления кнопки автоматического форматирования чисел в контекстное меню (контекстное меню). Это работает как кнопка переключения, которая позволяет вам включать / выключать функцию.

* Важное примечание. Это решение является полным обходным решением очень распространенной и трудоемкой проблемы в Excel. В настоящее время событие PivotTableUpdate будет срабатывать, когда в сводную таблицу вносятся какие-либо изменения или когда обновляется сводная таблица.

Итак, если у вас есть существующая сводная таблица с общим
форматированием и вы обновите сводную таблицу, макрос запустится, чтобы
изменить форматирование на исходный / стандартный числовой формат. Если вы
хотите сохранить формат чисел как Общий в сводной таблице, отключите
автоматическое форматирование чисел перед обновлением / изменением сводной
таблицы.

Если поле в области значений уже отформатировано с
использованием чего-то отличного от General, то макрос НЕ изменит числовой
формат при выполнении обновления / модификации. Макрос ТОЛЬКО изменяет
форматирование чисел с общего на формат источника / по умолчанию.

Будущие улучшения

Я использую эту функцию в течение нескольких недель, и у меня уже есть идеи по ее улучшению.

# 1 — Запускать макрос можно только при добавлении нового поля в область значений.

Как я упоминал выше, макрос запускается каждый раз, когда сводная таблица изменяется или обновляется. Это не вызвало никаких проблем для меня, потому что я никогда не хочу оставлять область значений в формате General. Однако мы могли бы улучшить это, так что макрос запускается только тогда, когда новое поле добавляется в область значений. Это, вероятно, потребовало бы от нас хранения количества полей данных, которые в настоящий момент находятся в активной сводной таблице, с дополнительным мониторингом с помощью событий Worksheet_Change и Worksheet_Activate.

# 2 — Интеллектуальное форматирование чисел

Включение форматирования из диапазона исходных данных — это здорово, но в некоторых случаях агрегация вызывает необходимость в другом формате. Например, мы могли бы использовать стандартный формат номера бухгалтерского учета в столбце исходных данных для дохода. Когда мы добавляем это поле в область значений, оно может суммироваться с гораздо большими числами. Таким образом, мы могли бы вместо этого использовать числовой формат тысяч (500 000 долларов) или миллионов (5,5 миллионов долларов США).

Intelligent Automatic Number Formatting for Pivot Tables

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

Другой вариант — поместить любимые форматы чисел в контекстное меню для быстрого доступа. Есть пробный взгляд на будущую особенность …

My Number Formats Pivot Table Right Click Menu

Опять же, если вам не нужны макросы, функция автоматического форматирования чисел включена в мою надстройку PivotPal.

Какие предложения у вас есть для функций? Пожалуйста,
оставьте комментарий ниже с предложениями или вопросами. Спасибо!

Макрос форматирования заголовка таблицы

Результат работы макроса форматирования заголовка таблицы

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

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

Что он делает: (действия выполняются с выделенным диапазоном ячеек)

  • устанавливает выравнивание текста ячеек по центру
  • разрешает перенос текста ячеек по словам
  • закрашивает ячейки серым цветом
  • рисует рамку вокруг ячеек
  • закрепляет строку, расположенную непосредственно под выделенным заголовком
  • (чтобы заголовок таблицы не прокручивался при скроллинге)
Sub ФорматированиеВыделенногоЗаголовка()
    On Error Resume Next
    Dim ra As Range: Set ra = Selection
    With ra
        .Font.Bold = True
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = True
        .Interior.ColorIndex = 15
        With .Borders
            .LineStyle = xlContinuous
            .Weight = xlThin
        End With
    End With
    Set ra = Intersect(ra.Cells(ra.Cells.Count).Offset(1).EntireRow, ra.Cells(1).EntireColumn)
    ra.Select: ActiveWindow.FreezePanes = True
End Sub
  • 11871 просмотр

Не получается применить макрос? Не удаётся изменить код под свои нужды?

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

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

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

Что он делает: (действия выполняются с выделенным диапазоном ячеек)

  • устанавливает выравнивание текста ячеек по центру
  • разрешает перенос текста ячеек по словам
  • закрашивает ячейки серым цветом
  • рисует рамку вокруг ячеек
  • закрепляет строку, расположенную непосредственно под выделенным заголовком
  • (чтобы заголовок таблицы не прокручивался при скроллинге)

Sub ФорматированиеВыделенногоЗаголовка()

On Error Resume Next

Dim ra As Range: Set ra = Selection

With ra

.Font.Bold = True

.HorizontalAlignment = xlCenter

.VerticalAlignment = xlCenter

.WrapText = True

.Interior.ColorIndex = 15

With .Borders

.LineStyle = xlContinuous

.Weight = xlThin

End With

End With

Set ra = Intersect(ra.Cells(ra.Cells.Count).Offset(1).EntireRow, ra.Cells(1).EntireColumn)

ra.Select: ActiveWindow.FreezePanes = True

End Sub

  • 8906 просмотров

Форматирование таблицы макросом

light26

Дата: Пятница, 26.08.2011, 18:09 |
Сообщение № 1

Группа: Друзья

Ранг: Старожил

Сообщений: 1341


Репутация:

91

±

Замечаний:
0% ±


2007, 2010, 2013

Всем привет.
Мой первый неудачный опыт с макросами. В принципе, это вообще мой первый опыт с макросами )))
А первый блин, как известно, комом…
Имею файл с данными в экселевской таблице (см. вложение), который сформирован автоматически другой программой
В оригинале у книги 1 лист. Еще 2 добавил для примера. Так вот, 1 лист — то, что формирует программа. 2 лист — то, что получается, если задать одинаковую ширину столбцам и высоту строкам. 3 лист — то, что хотелось бы получить.
Решил последовать многочисленным советам начать изучение макросов с записи своего.
Включил запись, отформатировал последовательно таблицу,-привел ее в тот вид, который меня устраивает,-остановил запись макроса, выделил 1 лист и выполнил записанный макрос. А он взялся матом ругаться (((. Я тело-то макроса открыл, а че толку — почти ничего не понимаю. Разобрался в процентах 10 строк. А мат начинается именно на этой строке

Код

Selection.Delete Shift:=xlToLeft

Че делать? Как? Почему?..
Вот прилагаю тело макроса. Полностью, как оно в окне VBA выглядит:
[vba]

Код

Sub Как_надо()

‘ Как_надо Макрос


          With Selection
              .HorizontalAlignment = xlGeneral
              .VerticalAlignment = xlTop
              .WrapText = True
              .Orientation = 0
              .AddIndent = False
              .IndentLevel = 0
              .ShrinkToFit = False
              .ReadingOrder = xlContext
              .MergeCells = True
          End With
          Selection.UnMerge
          Range(«I4:X4»).Select
          With Selection
              .HorizontalAlignment = xlGeneral
              .VerticalAlignment = xlTop
              .WrapText = True
              .Orientation = 0
              .AddIndent = False
              .IndentLevel = 0
              .ShrinkToFit = False
              .ReadingOrder = xlContext
              .MergeCells = True
          End With
          Selection.UnMerge
          Rows(«1:1»).RowHeight = 15.75
          Rows(«1:25»).Select
          Selection.RowHeight = 15
          Rows(«9:9»).Select
          Rows(«9:9»).EntireRow.AutoFit
          Columns(«A:AG»).Select
          Selection.ColumnWidth = 5
          Range(«K2»).Select
          Selection.Cut Destination:=Range(«A2»)
          Range(«I4»).Select
          Selection.Cut Destination:=Range(«A4»)
          Range(«A4»).Select
          ActiveCell.FormulaR1C1 = «За период»
          With ActiveCell.Characters(Start:=1, Length:=9).Font
              .Name = «Arial»
              .FontStyle = «обычный»
              .Size = 10
              .Strikethrough = False
              .Superscript = False
              .Subscript = False
              .OutlineFont = False
              .Shadow = False
              .Underline = xlUnderlineStyleNone
              .ColorIndex = 1
              .TintAndShade = 0
              .ThemeFont = xlThemeFontNone
          End With
          Range(«C:C,G:G,I:I,K:K,M:M,Q:Q,U:U,W:W,Y:Y,AA:AA,AD:AD»).Select
          Range(«AD1»).Activate
          Selection.Delete Shift:=xlToLeft
          Range(«A2:V2»).Select
          With Selection
              .HorizontalAlignment = xlCenter
              .VerticalAlignment = xlTop
              .WrapText = True
              .Orientation = 0
              .AddIndent = False
              .IndentLevel = 0
              .ShrinkToFit = False
              .ReadingOrder = xlContext
              .MergeCells = False
          End With
          Selection.Merge
          Range(«A4:V4»).Select
          With Selection
              .HorizontalAlignment = xlCenter
              .VerticalAlignment = xlTop
              .WrapText = True
              .Orientation = 0
              .AddIndent = False
              .IndentLevel = 0
              .ShrinkToFit = False
              .ReadingOrder = xlContext
              .MergeCells = False
          End With
          Selection.Merge
          Columns(«A:A»).EntireColumn.AutoFit
          Columns(«B:B»).EntireColumn.AutoFit
          Columns(«C:C»).EntireColumn.AutoFit
End Sub

[/vba]
P.S. Excel у меня 2007

К сообщению приложен файл:

7429301.xls
(70.0 Kb)


Я не волшебник. Я только учусь

Сообщение отредактировал light26Пятница, 26.08.2011, 18:20

 

Ответить

RAN

Дата: Пятница, 26.08.2011, 23:13 |
Сообщение № 2

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

То, что этот макрос ругается, не удивительно.
Удивительно, как такой макрос записать удалось? surprised


Быть или не быть, вот в чем загвоздка!

 

Ответить

_Boroda_

Дата: Суббота, 27.08.2011, 00:02 |
Сообщение № 3

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Посмотри такой вариант.
Спациально на стал никаких извращение-хитростей делать, чтобы понятнее было.
[vba]

Код

Sub Макрос1()
Application.ScreenUpdating = 0 ‘отключить обновление экрана (чтобы не моргало)
r_ = Range(«A» & Rows.Count).End(xlUp).Row ‘кол-во строк
‘c_ = Cells(10, Columns.Count).End(xlToLeft).Column’кол-во столбцов (у нас вроде постоянно)
     Range(«A2:AG4»).Merge True ‘объединить A2:AG4 по строкам
     Rows(«1:5»).UnMerge ‘убрать объединение в строках 1-5
     Range(Range(«A9»), ActiveCell.SpecialCells(xlLastCell)).UnMerge ‘убрать объединение в ячейках от А9 и до конца таблицы
     For i = 33 To 2 Step -1 ‘цикл от последнего столбца таблицы до второго
         If Cells(10, i) = «» Then Columns(i).Delete ‘если в строке 10 столбца ничего нет — удалить столбец
     Next ‘конец цикла
     Range(«A2:V4»).Merge True ‘объединить A2:V4 по строкам
     Range(«D1:V1»).ColumnWidth = 5 ‘установить ширину столбцов
     Range(«C1»).ColumnWidth = 6.57
     Range(«B1»).ColumnWidth = 5.43
     Rows(«5»).Delete ‘убить строку 5
     Range(«A1:A» & r_).RowHeight = 15 ‘ установить высоту строк
     Range(«A8»).RowHeight = 26.25
Application.ScreenUpdating = 1 ‘включить обновление экрана
End Sub

[/vba]
Вроде итог такой же, как должен быть, правда там еще надо бы кое что поделать, например в ячейках G5 и R5

К сообщению приложен файл:

7429301_.xls
(59.0 Kb)


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

light26

Дата: Суббота, 27.08.2011, 12:54 |
Сообщение № 4

Группа: Друзья

Ранг: Старожил

Сообщений: 1341


Репутация:

91

±

Замечаний:
0% ±


2007, 2010, 2013

Quote (RAN)

Удивительно, как такой макрос записать удалось?

Quote (light26)

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

RAN, я его не сам писал. Его писал Excel или VBA. Кто там из них за это отвечает…)))
Так в чем же, все-таки, косяк?!


Я не волшебник. Я только учусь

Сообщение отредактировал light26Суббота, 27.08.2011, 12:56

 

Ответить

light26

Дата: Суббота, 27.08.2011, 13:01 |
Сообщение № 5

Группа: Друзья

Ранг: Старожил

Сообщений: 1341


Репутация:

91

±

Замечаний:
0% ±


2007, 2010, 2013

Quote (_Boroda_)

‘c_ = Cells(10, Columns.Count).End(xlToLeft).Column’кол-во столбцов (у нас вроде постоянно

Да там смысел не в том, чтобы задать определенную ширину/высоту столбцов/строк, а в том, чтобы удалить все лишнее. Привести таблицу в «божеский вид» )


Я не волшебник. Я только учусь

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Макрос для флажка excel
  • Макрос для условного форматирования в excel
  • Макрос для удаления файла excel
  • Макрос для удаления строк по значению в excel
  • Макрос для удаления строк в excel по условию макрос