Макрос excel создает таблицу

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

Создание и удаление умной таблицы

Создание умной таблицы

Создается умная таблица Excel с помощью следующего кода:

ActiveSheet.ListObjects.Add(xlSrcRange, Range(«$A$1:$L$15»), , xlNo).Name _

= «МояТаблица1»

В данном примере:

ActiveSheet — лист, на котором создается таблица, может быть любой лист рабочей книги Excel.

Range(«$A$1:$L$15») — диапазон, который преобразуется в таблицу. Можно использовать и такую форму: Range(Cells(1, 1), Cells(15, 12)), где индексы строк и столбцов можно заменить переменными.

xlNo — указывает, что первая строка выбранного диапазона не содержит заголовки столбцов (граф) будущей таблицы, и их необходимо добавить. В этом случае будет добавлена дополнительная строка с наименованиями столбцов по умолчанию: Столбец1, Столбец2, Столбец3 и т.д., которые в дальнейшем можно переименовать (количество строк в таблице, включая строку заголовков, получится на одну больше, чем в указанном диапазоне). Если в диапазоне уже содержатся заголовки столбцов будущей таблицы, то следует указать вместо xlNo значение xlYes. В этом случае первая строка указанного диапазона будет преобразована в строку заголовков, а если она будет не заполнена, то добавятся названия столбцов по умолчанию: Столбец1, Столбец2, Столбец3 и т.д. (количество строк в таблице, включая строку заголовков, будет то же, что и в указанном диапазоне).

МояТаблица1 — имя, присваиваемое создаваемой таблице. Имя должно быть без пробелов: при указании в коде VBA названия таблицы с пробелами, во время его выполнения Excel заменит пробелы знаками подчеркивания (по крайней мере, так происходит в Excel 2016).

Таблица будет создана со стилем по умолчанию (TableStyleMedium2 в Excel 2016).

Стиль умной таблицы

Присвоение стиля таблице (изменение стиля) осуществляется с помощью свойства TableStyle объекта ListObjects:

ActiveSheet.ListObjects(«МояТаблица1»).TableStyle = «TableStyleMedium15»

Свойство TableStyle может принимать следующие значения:

  • TableStyleLight (светлый) с индексом от 1 до 21 (в Excel 2016);
  • TableStyleMedium (средний) с индексом от 1 до 28 (в Excel 2016);
  • TableStyleDark (темный) с индексом от 1 до 11 (в Excel 2016).

Например, TableStyleLight5, TableStyleMedium24, TableStyleDark8.

Чтобы отменить стиль таблицы в коде VBA, необходимо свойству TableStyle присвоить пустую строку:

ActiveSheet.ListObjects(«МояТаблица1»).TableStyle = «»

Этому коду соответствует выбор в разделе «Конструктор» на ленте инструментов Excel самого первого значка стилей в разделе «Светлый».

Добавление строки итогов

Строка итогов умной таблицы добавляется следующим образом:

ActiveSheet.ListObjects(«МояТаблица1»).ShowTotals = True

Удаляется строка итогов умной таблицы так:

ActiveSheet.ListObjects(«МояТаблица1»).ShowTotals = False

Удаление умной таблицы

Удалить умную таблицу очень просто:

ActiveSheet.ListObjects(«МояТаблица1»).Delete

Создание пользовательской таблицы

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

Для создания такой таблицы необходимо:

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

Подробнее о создании пользовательской таблицы в Примере 2.

Примеры создания таблиц

Задание для примеров

Набор данных для создания таблиц

Набор данных для примеров создания таблиц

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

  • в табличной части 5 граф: № п/п, Наименование, Количество, Цена и Сумма;
  • сколько наименований добавил пользователь неизвестно.

Нам необходимо:

  • определить количество строк;
  • добавить строку заголовков;
  • отобразить сетку (границы ячеек);
  • добавить строку итогов.

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

Пример 1 — умная таблица

Упаковываем набор данных из задания в умную таблицу:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Sub test1()

‘Объявляем переменную для присвоения ей количества строк

Dim a As Long

‘Определяем количество строк

a = Cells(1, 1).CurrentRegion.Rows.Count

‘Создаем умную таблицу с добавлением строки заголовков

ActiveSheet.ListObjects.Add(xlSrcRange, Range(Cells(1, 1),Cells(a, 5)), , xlNo).Name _

= «ТоварныйЧек1»

‘Изменяем названия граф

Cells(1, 1) = «№ п/п»

Cells(1, 2) = «Наименование»

Cells(1, 3) = «Количество»

Cells(1, 4) = «Цена»

Cells(1, 5) = «Сумма»

‘Добавляем строку итогов

ActiveSheet.ListObjects(«ТоварныйЧек1»).ShowTotals = True

‘Стиль оставляем по умолчанию

End Sub

Результат выполнения кода Примера 1 получится такой:

Умная таблица из заданного набора данных

Умная таблица из заданного набора данных

Пример 2 — «обычная» таблица

Упаковываем набор данных из задания в пользовательскую таблицу:

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

Sub test2()

‘Объявляем переменную для присвоения ей количества строк

Dim a As Long

‘Определяем количество строк

a = Cells(1, 1).CurrentRegion.Rows.Count

‘Добавляем строку заголовков

Cells(1, 1).EntireRow.Insert

‘Указываем названия граф

Cells(1, 1) = «№ п/п»

Cells(1, 2) = «Наименование»

Cells(1, 3) = «Количество»

Cells(1, 4) = «Цена»

Cells(1, 5) = «Сумма»

‘Добавляем сетку

Range(Cells(1, 1), Cells(a + 1, 5)).Borders.LineStyle = True

‘Добавляем строку итогов

Cells(a + 2, 4) = «Итого:»

With Cells(a + 2, 5)

.FormulaR1C1 = «=SUM(R[-« & a & «]C:R[-1]C)»

.Borders.LineStyle = True

.Font.Bold = True

End With

‘Выделяем заголовки жирным шрифтом и

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

With Range(Cells(1, 1), Cells(1, 5))

.Font.Bold = True

.EntireColumn.AutoFit

End With

End Sub

Результат выполнения кода Примера 2 получится такой:

Пользовательская таблица из заданного набора данных

Пользовательская таблица из заданного набора данных

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


О работе с умной таблицей (обращение к ячейкам, строкам и столбцам; добавление и удаление строк и столбцов) рассказано в статье VBA Excel. Работа с умной таблицей


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

Создание сводных таблиц макросом

Источник информации для сводных таблиц всегда один и тот же – база данных. Набор данных образующих базу для обработки в Excel может быть не только на листах рабочей книги, а также и во внешних источниках.

Для описания способа создания сводных таблиц средствами процедур VBA будет использоваться таблица, которая содержит данные по месяцам о оборотах семи магазинов фирмы за последние несколько лет деятельности.

Тестовая база для примера.

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

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

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

В данном примере создание сводной таблицы VBA-макросом будет достаточно простым. Простота решения будет достигнута за счет симуляции использования подобных параметров и действий, которые предоставляет к распоряжению мастер сводных таблиц в Excel. Используя экземпляр объекта PivotCaches запишем настройки своей сводной таблицы присвоив ей определенное имя. Это позволит потом непосредственно ссылаться на сводную таблицу в любой части кода. Для создания сводной таблицы используя макрос будем использовать метод PivotTableWizard. На этом же шаге будем использовать возможности объекта PivotFields, в котором определим структуру сводной таблицы с учетом исходных данных источника.

Написание кода макросов в Excel всегда начинается с открытия VBA-редактора (ALT+F11): «РАЗРАБОТЧИК»-«Код»-«Visual Basic».

Код-Visual Basic.

Затем создадим модуль где будет храниться исходный код. Для этого выберите инструмент в редакторе VBA: «Insert»-«Module». В появившемся окне модуля введите следующий VBA-код макроса:

Sub CreateTableM()
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:="Лист1!A1:D21").CreatePivotTable TableDestination:="", TableName:="ТаблицаМ"
With ActiveSheet
.Name = "Анализ"
.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
End With
With ActiveSheet.PivotTables("ТаблицаМ")
.SmallGrid = True
.PivotFields("Оборот").Orientation = xlDataField
.PivotFields("Год").Orientation = xlPageField
.PivotFields("Месяц").Orientation = xlRowField
.PivotFields("Магазины").Orientation = xlColumnField
End With
End Sub

Исходный код макроса.

Теперь достаточно лишь запустить макрос выбрав инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«CreateTableM»-«Выполнить»:

Сгенерирована сводная таблица.

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



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

Данный исходный код макроса позволяет автоматически сгенерировать сводную таблицу, такую же как показано на рисунке 4. Первая строка кода выглядит весьма необычно, но жизненно необходима для дальнейшей работы программы. Она содержит набор базовых параметров для коллекции PivotCaches, которые будут применены к создаваемой сводной таблице. В первом свойстве SourceType объявляется источник для загрузки данных в бедующую сводную таблицу. Параметр xlDatabase говорит нам о том, что исходные данные берутся с рабочего листа Excel.

Используя свойство SourceData задаем ссылку на диапазон ячеек, в котором находиться исходные данные предназначенные для последующей обработки. Указывая адрес ссылки в форме Лист1!A1:D21, мы определяем целый диапазон таблицы с исходными данными включая ее заголовки столбцов. Оба свойства (SourceType и SourceData) являются здесь аргументами для метода Add, который выполняет функцию сбора информации – аналогично инструкциям выполняемых при работе с мастером сводных таблиц. Функция создания сводной таблицы реализуется методом .CreatePivotTable, для которого так же необходимо указать следующие параметры.

Свойство TanleDestination позволяет установить место для вставки будущей сводной таблицы. Если есть необходимость вставить таблицу в конкретном месте выбранного листа, тогда следует указать здесь адрес ячейки для вставки. А если же необходимо создать сводную таблицу на новом листе, тогда достаточно указать пустую строку (“”) в качестве параметра. С помощью свойства TableName присваиваем внутреннее имя будущей таблицы, в данном примере это «ТаблицаМ». Обратите внимание, что название таблицы отличается от названия листа, в котором она будет находится. Благодаря присвоению внутреннего имени для создаваемой таблицы, появляется возможность отличать ее от многих других таблиц. Но самое главное преимущество – это возможность непосредственно ссылаться к таблице через имя, вместо того чтобы каждый раз указывать место и диапазон, где будет находиться сводная таблица.

Далее с помощью инструкции конструктора With собираем блок инструкций методов, свойств и параметров структуры. Все дальнейшие опции будут реализованы внутри свойства ActiveSheet. То есть будут касаться листа, в котором будет создана сводная таблица.

Свойством Name мы определяем имя для нового листа – в данном примере это имя «Анализ». Если нужно задать для нового листа имя такое же как у новой сводной таблицы (Таблица М), тогда эту задачу лучше всего реализовать именно на данном этапе написания кода макроса.

В следующей строке определяем место на новом листе, где будет сгенерирована сводная таблица. Указывая для параметра TanleDestination свойство:

ActiveSheet.Cells(3,1)

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

Читайте также: Макрос для настройки полей и форматирования сводной таблицы.

В следующих строках кода можно определить в каких полях должны находиться отобранные данные из исходной таблицы. Эта часть исходного кода должна начинаться с очередной инструкции конструктора With и заканчиваться инструкцией End With. А внутри конструктора указываться все параметры полей сводной таблицы.

Содержание

  1. Что такое макрос?
  2. Запись макроса в Excel
  3. Первая программа на VBA Excel
  4. Запуск редактора Visual Basic
  5. Альтернативный вариант открытия файла
  6. Создание «умной» таблицы
  7. Стиль «умной» таблицы
  8. Добавление строки итогов
  9. Отображение вкладки “Разработчик” в ленте меню
  10. Знакомство с редактором VBA
  11. Создание сводных таблиц макросом
  12. Примеры макросов для автоматизации работы
  13. Окна редактора Visual Basic

Что такое макрос?

Для начала немного о терминологии.

Макрос – это код, написанный на встроенном в Excel языке VBA (Visual Basic for Application). Макросы могут создаваться как вручную, так и записываться автоматически с помощью так называемого макрорекодера.

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

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

Теперь давайте погрузимся и посмотрим, как записать макрос в Excel.

Теперь давайте запишем очень простой макрос, который выбирает ячейку и вводит в нее текст, например “Excel”.

Вот шаги для записи такого макроса:

  1. Перейдите на вкладку “Разработчик”.
  2. В группе “Код” нажмите кнопку “Запись макроса”. Откроется одноименное диалоговое окно.
  3. В диалоговом окне “Запись макроса” введите имя для своего макроса, например “ВводТекста”. Есть несколько условий именования, которые необходимо соблюдать при назначении макроса. Например, вы не можете использовать пробелы между ними. Обычно я предпочитаю сохранять имена макросов как одно слово, с разными частями с заглавным первым алфавитом. Вы также можете использовать подчеркивание для разделения двух слов – например, “Ввод_текста”.
  4. Если вы хотите, то можете задать сочетание клавиш. В этом случае мы будем использовать ярлык Ctrl + Shift + N. Помните, что сочетание, которое вы указываете, будет отменять любые существующие горячие клавиши в вашей книге. Например, если вы назначили сочетание Ctrl + S, вы не сможете использовать это для сохранения рабочей книги (вместо этого, каждый раз, когда вы его используете, он выполняет макрос).
  5. В поле “Сохранить в” убедитесь, что выбрана опция “Эта книга”. Этот шаг гарантирует, что макрос является частью рабочей книги. Он будет там, когда вы сохраните его и снова откроете, или даже если вы поделитесь файлом с кем-то.
  6. Введите описание при необходимости. Обычно я этого не делаю, но если у вас много макросов, лучше указать, чтобы в будущем не забыть что делает макрос.
  7. Нажмите “ОК”. Как только вы нажмете OK, Excel начнет записывать ваши действия. Вы можете увидеть кнопку “Остановить запись” на вкладке “Разработчик”, которая указывает, что выполняется запить макроса.
  8. Выберите ячейку A2.
  9. Введите текст “Excel” (или вы можете использовать свое имя).
  10. Нажмите клавишу Enter. Вы попадете на ячейку A3.
  11. Нажмите кнопку “Остановить запись” на вкладке “Разработчик”.

Поздравляем! Вы только что записали свой первый макрос в Excel. Хотя макрос не делает ничего полезного, но он поможет нам понять как работает макрорекордер в Excel.

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

  1. Удалите текст в ячейке A2. Это нужно, чтобы проверить будет ли макрос вставлять текст в ячейку A2 или нет.
  2. Выберите любую ячейку – кроме A2. Это нужно проверить, выбирает ли макрос ячейку A2 или нет.
  3. Перейдите на вкладку “Разработчик”.
  4. В группе “Код” нажмите кнопку “Макросы”.
  5. В диалоговом окне “Макрос” щелкните макрос “ВводТекста”.
  6. Нажмите кнопку “Выполнить”.

Вы увидите, что как только вы нажмете кнопку “Выполнить”, текст “Excel” будет вставлен в ячейку A2 и выбрана ячейка A3. Это происходит за миллисекунды. Но на самом деле макрос последовательно выполнил записанные действия.

Примечание. Вы также можете запустить макрос с помощью сочетания клавиш Ctrl + Shift + N (удерживайте клавиши Ctrl и Shift, а затем нажмите клавишу N). Это тот же самый ярлык, который мы назначили макросу при его записи.

Первая программа на VBA Excel

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

  1. Откройте стандартный модуль двойным кликом по его ссылке в проводнике. Поместите в него курсор и нажмите кнопку «Procedure…» во вкладке «Insert» главного меню. Та же ссылка будет доступна при нажатии на вторую кнопку после значка Excel на панели инструментов.

В результате откроется окно добавления шаблона процедуры (Sub).

  1. Наберите в поле «Name» имя процедуры: «Primer1», или скопируйте его отсюда и вставьте в поле «Name». Нажмите кнопку «OK», чтобы добавить в модуль первую и последнюю строки процедуры.

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

  1. Вставьте внутрь шаблона процедуры следующую строку: MsgBox "Привет".

Функция MsgBox выводит информационное сообщение с указанным текстом. В нашем примере – это «Привет».

  1. Проверьте, что курсор находится внутри процедуры, и запустите ее, нажав клавишу «F5». А также, запустить процедуру на выполнение можно, нажав на треугольник (на изображении под пунктом меню «Debug») или на кнопку «Run Sub/UserForm» во вкладке «Run» главного меню редактора VBA Excel.


Если вы увидели такое сообщение, как на изображении, то, поздравляю – вы написали свою первую программу!

Запуск редактора Visual Basic

Простейший способ запустить редактор Visual Basic в Excel – нажать комбинацию клавиш Alt+F11 (то есть нажать клавишу Alt и, удерживая её, нажать клавишу F11). После этого откроется окно редактора Visual Basic, как показано на картинке ниже. Имейте ввиду, что окно Excel остается открытым и находится позади окна редактора.

Альтернативный вариант открытия файла

 Set objExcel = New Excel.Application Set wb = objExcel.Workbooks wb.Open fname, local:=True Set ws = wb.Item(1).ActiveSheet 

При открытии файла можно использовать доп.параметры (приведу некоторые):

UpdateLinks – обновлять или нет внешние ссылки при открытии файла;
ReadOnly – открытие в режиме только для чтения;
Format – используемый при открытии разделитель (1 – символ tab, 2 – запятые, 3 – пробелы, 4 – точка с запятой, 5 – без разделителя, 6 – пользовательский разделитель, заданный в Delimiter);
Delimiter – пользовательский разделитель (в случае, если Format = 6);
Origin – тип операционной системы (xlMacintosh, xlWindows или xlMSDOS);
Local – использование в Excel языка такого же, как в открываемом файле.

Теперь можно выполнять какие-то действия с открытым файлом, просто обращаясь через wb и ws.

 ws.Cells(1, 1).Value = "Test" ws.Cells(1, 1).Font.Size = 18 ' Поменять размер шрифта ws.Cells(1, 1).HorizontalAlignment = xlCenter ' 

Создание «умной» таблицы

Создается «умная» таблица Excel с помощью следующего кода:

ActiveSheet.ListObjects.Add(xlSrcRange, Range(“$A$1:$L$15”), , xlNo).Name _

= “МояТаблица1”

В данном примере:

ActiveSheet – лист, на котором создается таблица, может быть любой лист рабочей книги Excel.

Range(“$A$1:$L$15”) – диапазон, который преобразуется в таблицу. Можно использовать и такую форму: Range(Cells(1, 1), Cells(15, 12)), где индексы строк и столбцов можно заменить переменными.

xlNo – указывает, что первая строка выбранного диапазона не содержит заголовки столбцов (граф) будущей таблицы, и их необходимо добавить. В этом случае будет добавлена дополнительная строка с наименованиями столбцов по умолчанию: Столбец1, Столбец2, Столбец3 и т.д., которые в дальнейшем можно переименовать (количество строк в таблице, включая строку заголовков, получится на одну больше, чем в указанном диапазоне). Если в диапазоне уже содержатся заголовки столбцов будущей таблицы, то следует указать вместо xlNo значение xlYes. В этом случае первая строка указанного диапазона будет преобразована в строку заголовков, а если она будет не заполнена, то добавятся названия столбцов по умолчанию: Столбец1, Столбец2, Столбец3 и т.д. (количество строк в таблице, включая строку заголовков, будет то же, что и в указанном диапазоне).

МояТаблица1 – имя, присваиваемое создаваемой таблице. Имя должно быть без пробелов: при указании в коде VBA названия таблицы с пробелами, во время его выполнения Excel заменит пробелы знаками подчеркивания (по крайней мере, так происходит в Excel 2016).

Таблица будет создана со стилем по умолчанию (TableStyleMedium2 в Excel 2016).

Стиль «умной» таблицы

Присвоение стиля таблице (изменение стиля) осуществляется с помощью свойства TableStyle объекта ListObjects:

ActiveSheet.ListObjects(“МояТаблица1”).TableStyle = “TableStyleMedium15”

Свойство TableStyle может принимать следующие значения:

  • TableStyleLight (светлый) с индексом от 1 до 21 (в Excel 2016);
  • TableStyleMedium (средний) с индексом от 1 до 28 (в Excel 2016);
  • TableStyleDark (темный) с индексом от 1 до 11 (в Excel 2016).

Например, TableStyleLight5, TableStyleMedium24, TableStyleDark8.

Чтобы отменить стиль таблицы в коде VBA, необходимо свойству TableStyle присвоить пустую строку:

ActiveSheet.ListObjects(“МояТаблица1”).TableStyle = “”

Этому коду соответствует выбор в разделе «Конструктор» на ленте инструментов Excel самого первого значка стилей в разделе «Светлый».

Добавление строки итогов

Строка итогов «умной» таблицы добавляется следующим образом:

ActiveSheet.ListObjects(“МояТаблица1”).ShowTotals = True

Удаляется строка итогов «умной» таблицы так:

ActiveSheet.ListObjects(“МояТаблица1”).ShowTotals = False

Отображение вкладки “Разработчик” в ленте меню

Перед тем как записывать макрос, нужно добавить на ленту меню Excel вкладку “Разработчик”. Для этого выполните следующие шаги:

  1. Щелкните правой кнопкой мыши по любой из существующих вкладок на ленте и нажмите «Настроить ленту». Он откроет диалоговое окно «Параметры Excel».
  2. В диалоговом окне «Параметры Excel» у вас будут параметры «Настроить ленту». Справа на панели «Основные вкладки» установите флажок «Разработчик».
  3. Нажмите «ОК».

В результате на ленте меню появится вкладка “Разработчик”

Знакомство с редактором VBA

  1. Создайте новую книгу Excel и сохраните ее как книгу с поддержкой макросов с расширением .xlsm. В старых версиях Excel по 2003 год – как обычную книгу с расширением .xls.
  2. Нажмите сочетание клавиш «левая_клавиша_Alt+F11», которое откроет редактор VBA. С правой клавишей Alt такой фокус не пройдет. Также, в редактор VBA можно перейти по ссылке «Visual Basic» из панели инструментов «Разработчик» на ленте быстрого доступа. Если вкладки «Разработчик» на ленте нет, ее следует добавить в настройках параметров Excel.

В левой части редактора VBA расположен проводник проекта, в котором отображены все открытые книги Excel. Верхней строки, как на изображении, у вас скорее всего не будет, так как это – личная книга макросов. Справа расположен модуль, в который записываются процедуры (подпрограммы) с кодом VBA. На изображении открыт модуль листа, мы же далее создадим стандартный программный модуль.

  1. Нажмите кнопку «Module» во вкладке «Insert» главного меню. То же подменю откроется при нажатии на вторую кнопку после значка Excel на панели инструментов.

После нажатия кнопки «Module» вы увидите ссылку на него, появившуюся в проводнике слева.

Создание сводных таблиц макросом

Источник информации для сводных таблиц всегда один и тот же – база данных. Набор данных образующих базу для обработки в Excel может быть не только на листах рабочей книги, а также и во внешних источниках.

Для описания способа создания сводных таблиц средствами процедур VBA будет использоваться таблица, которая содержит данные по месяцам о оборотах семи магазинов фирмы за последние несколько лет деятельности.

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

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

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

В данном примере создание сводной таблицы VBA-макросом будет достаточно простым. Простота решения будет достигнута за счет симуляции использования подобных параметров и действий, которые предоставляет к распоряжению мастер сводных таблиц в Excel. Используя экземпляр объекта PivotCaches запишем настройки своей сводной таблицы присвоив ей определенное имя. Это позволит потом непосредственно ссылаться на сводную таблицу в любой части кода. Для создания сводной таблицы используя макрос будем использовать метод PivotTableWizard. На этом же шаге будем использовать возможности объекта PivotFields, в котором определим структуру сводной таблицы с учетом исходных данных источника.

Написание кода макросов в Excel всегда начинается с открытия VBA-редактора (ALT+F11): «РАЗРАБОТЧИК»-«Код»-«Visual Basic».

Затем создадим модуль где будет храниться исходный код. Для этого выберите инструмент в редакторе VBA: «Insert»-«Module». В появившемся окне модуля введите следующий VBA-код макроса:

SubCreateTableM()
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:="Лист1!A1:D21").CreatePivotTable TableDestination:="", TableName:="ТаблицаМ"
WithActiveSheet
.Name ="Анализ"
.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
End With
WithActiveSheet.PivotTables("ТаблицаМ")
.SmallGrid =True
.PivotFields("Оборот").Orientation = xlDataField
.PivotFields("Год").Orientation = xlPageField
.PivotFields("Месяц").Orientation = xlRowField
.PivotFields("Магазины").Orientation = xlColumnField
End With
End Sub

Теперь достаточно лишь запустить макрос выбрав инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«CreateTableM»-«Выполнить»:

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

Примеры макросов для автоматизации работы

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

Макрос для поиска ближайшего значения заданному на всех листах книги Excel.
Готовое решение для поиска на всех листах рабочей книги как точного, так и максимально приближенного исходного значения. VBA код макрос для нахождения и получения числа с любого листа книги.

Макрос для слияния данных при серийной печати рассылок в Excel.
Альтернатива инструменту слияния в Word для печати рассылок прямо из Excel. Исходный код макроса, который выполняет слияние данных для серийной печати рассылок.

Макросы для фильтра сводной таблицы в Excel.
Как автоматизировать фильтр в сводных таблицах с помощью макроса? Исходные коды макросов для фильтрации и скрытия столбцов в сводной таблице.

Макрос позволяет рассчитать процент в сводной таблице Excel.
Как быстро преобразовать значения сводной таблицы на доли в процентном соотношении к общим итогам по строкам и по столбцам? Исходные коды макросов для работы с процентами.

Макрос для настройки полей и форматирования сводной таблицы.
Управление полями сводной таблицы с помощью макроса. Исходный код VBA-макроса для настройки и изменения структуры в сводных таблицах.

Макрос для создания сводной таблицы в Excel.
Как автоматически сгенерировать сводную таблицу с помощью макроса? Исходный код VBA для создания и настройки сводных таблиц на основе исходных данных.

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

VBA макрос для поиска скрытых строк и столбцов на листе Excel.
Поиск всех скрытых строк и столбцов на рабочем листе с помощью VBA-макроса. Исходные коды макросов для получения сводной информации о скрытых строках и столбцах рабочего листа.

Макрос для копирования и переименования листов Excel.
Как одновременно копировать и переименовывать большое количество листов одним кликом мышкой? Исходный код макроса, который умеет одновременно скопировать и переименовать любое количество листов.

Окна редактора Visual Basic

В процессе работы в редакторе Visual Basic в Excel могут быть открыты различные окна. Управление окнами осуществляется в меню View, которое находится в верхней части окна редактора VBA.

Источники

  • https://micro-solution.ru/excel/vba/first-macros
  • https://vremya-ne-zhdet.ru/vba-excel/nachinayem-programmirovat-s-nulya/
  • https://office-guru.ru/excel/redaktor-visual-basic-v-excel-451.html
  • https://codernotes.ru/articles/vba/rabota-s-excel-fajlom-iz-vba.html
  • https://vremya-ne-zhdet.ru/vba-excel/sozdaniye-tablitsy/
  • https://exceltable.com/vba-macros/makros-svodnoy-tablicy
  • https://exceltable.com/vba-macros/

Запись макроса для создания сводной таблицы

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

Прежде всего создайте таблицу данных,
похожую на представленную на рис. 19.1.
Пусть эта таблица имеет заголовки Год,
Район, Категория товара и Объем
продаж
.

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

Выделите таблицу данных и начните запись
макроса. Выполните команду Данные >
Сводная таблица
. В первом диалоговом
окне мастера сводных таблиц установите
переключатели в списке или базе данных
Microsoft Excel
и сводная таблица. Щелкните
на кнопке Далее. В следующем диалоговом
окне удостоверьтесь, что выбран весь
диапазон таблицы данных, и щелкните на
кнопке Далее. В третьем диалоговом
окне мастера сводных таблиц установите
переключатель новый лист и щелкните на
кнопке Готово. В рабочую книгу будет
добавлен новый лист, содержащий пустую
сводную таблицу (рис. 19.5).

Рис. 19.5. После завершения работы мастера
сводных таблиц на новом рабочем листе
отобразится пустой макет сводной таблицы

Рис. 19.6. Законченная сводная таблица

Перетащите из панели Сводные таблицы
поле Год в область сводной таблицы,
помеченную словами Перетащите сюда
поля страниц
. Перетащите поле Район
в область, помеченную словами Перетащите
сюда поля строк
. Далее перетащите в
область столбцов сводной таблицы поле
Категория товара, а в область данных
— поле Объем продаж. Законченная
сводная таблица показана на рис. 19.6.
Остановите запись макроса.

Прежде чем исследовать код макроса,
поэкспериментируйте со сводной таблицей.
В поле списка рядом с полем Год
щелкните на кнопке со стрелкой,
направленной вниз, в открывшемся списке
выберите 1997 и щелкните на кнопке
ОК. В сводной таблице отобразится
информация, относящаяся только к 1997
году. Щелкните в поле Категория товара
на кнопке со стрелкой, направленной
вниз, и снимите флажки Бытовая
электротехника
и Средства
автоматизации
. Щелкните на кнопке
ОК, теперь в сводной таблице будут
представлены только данные по средствам
связи. Проделав описанные операции в
обратном порядке, восстановите
первоначальный вид сводной таблицы.

Исследование кода макроса

Перейдите в редактор Visual Basic и в окне
проектов найдите текущую книгу. Откройте
папку Modules и затем Module1 — вы увидите
код макроса в виде процедуры
МояСводнаяТаблица (если такое имя
вы дали своему макросу). Полный код этой
процедуры приведен в листинге 19.1.

Листинг 19.1. Процедура МояСводнаяТаблица

l:Sub
МояСводнаяТаблица()

2:
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDataBase, _

3: 
SourceData:= «Лист1!R1C1:R37C4»).CreatePivotTable
_

    TableDestination:=»»,
TableName:»= «СводнаяТаблица1»

4:
ActiveSheet.PivotTableWizard _

5: 
TableDestination:=ActiveSheet.Cells(3,1)

6:
ActiveSheet.Cells(3,1).Select

7:
ActiveSheet.PivotTables(«СводнаяТаблица1»).SmallGrid
= False

8:
With ActiveSheet.PivotTables(«СводнаяТаблица1»).
_

    PivotFields(«Год»)

9: 
.Orientation = xlPageField

10: 
.Position = 1

11:
End With

12:
With ActiveSheet.PivotTables(«СводнаяТаблица1»).
_

     PivotFields(«Район»)

13: 
.Orientation = xlRowField

14: 
.Position = 1

15:
End With

16:
With ActiveSheet.PivotTables(«СводнаяТаблица1»).
_

     PivotFields(«Категория
товара»)

17: 
.Orientation = xlColumnField

18: 
.Position = 1

19:
End With

20:
With ActiveSheet.PivotTables(«СводнаяТаблица1»].
_

     PivotFields(«Объем
продаж»)

21: 
.Orientation = xlDataField

22: 
.Position = 1

23: 
End With

24:End
Sub

Первый оператор в этой процедуре
выполняет метод Add (Добавить)
применительно к коллекции PivotCaches
(Основные кэши). На самом деле в этом
операторе выполняются два метода. В
дополнение к метолу Add, создающему
элемент коллекции PivotCaches, исполняется
еще метод CreatePivotTable (Создать сводную
таблицу), название которого говорит
само за себя:

ActiveWorkbook.PivotCaches.Add(SourceType:=xlDataBase,
SourceData:= _

 «Лист1!R1C1:R37C4″).CreatePivotTable
TableDestination:=»», _

 TableName:=
«СводнаяТаблица1»

Обратите внимание, что в методе
CreatePivotTable аргумент TableDestination
принимает значение пустой строки — для
Excel это является указанием создать
сводную таблицу на новом рабочем листе.
После создания нового рабочего листа
и сводной таблицы задается ряд свойств:

ActiveSheet.PivotTableWizard
TableDestination:=ActiveSheet. _

 Cells(3,
1)

ActiveSheet.Cells(3,1).Select

ActiveSheet.PivotTables(«СводнаяТаблица1»).SmallGrid
= False

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

With
ActiveSheet.PivotTables(«СводнаяТаблица1»).PivotFields(«Год»]

 .Orientation
= xlPageField

 .Position
= 1

End
With

With
ActiveSheet.PivotTables(«СводнаяТаблица1»).PivotFields(«Район»)

 .Orientation
= xlRowField

 .Position
= 1

End
With

With
ActiveSheet.PivotTables(«СводнаяТаблица1»).
_

 PivotFields(«Категория
товара»)

 .Orientation
= xlColumnField

 .Position
= 1

End
With

With
ActiveSheet.PivotTables(«СводнаяТаблица1»).
_

 PivotFields»Объем
продаж»)

 .Orientation
= xlDataField

 .Position
= 1

End
With

Если сейчас вы попытаетесь выполнить
макрос еще раз, то получите сообщение
об ошибке, так как сводная таблица с тем
именем, которое указано в аргументе
TableName (Имя таблицы), уже создана.
Чтобы сделать процедуру более гибкой,
внесите в ее код изменения, показанные
в листинге 19.2 (измененные и новые
операторы выделены полужирным шрифтом).

Листинг 19.2. Измененная процедура
МояСводнаяТаблица

1:Sub
МояСводнаяТаблица()

2:
Dim
ptSales As PivotTable

3:

4:
Set
ptSales = ActiveWorkbook.PivotCaches.Add _

    (SourceType:=xlDataBase,
SourceData:=

5: 
«Лист1!R1C1:R37C4″).CreatePivotTable(TableDestination:=»»)

6:
ActiveSheet.PivotTableWizard _

    TableDestination:=ActiveSheet.Cells(3,1)

7:
ActiveSheet.Cells(3,1).Select

8:
ptSales.SmallGrid
= False

9:
With ptSales.PivotFields(«Год»)

10: 
.Orientation = xlPageField

11: 
.Position = 1

12:
End With

13:
With ptSales.PivotFields(«Район»)

14: 
.Orientation = xlRowField

15: 
.Position = 1

16:
End With

17:
With ptSales.PivotFields(«Категория
товара»)

13: 
.Orientation = xlColumnField

19: 
.Position = 1

20:
End With

21:
With ptSales.PivotFields(«Объем
продаж»)

22: 
.Orientation = xlDataField

23: 
.Position = 1

24:
End With

25:End
Sub

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

Резюме

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

0 / 0 / 0

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

Сообщений: 6

1

Добавление новой таблицы кнопкой и макросом

28.02.2013, 17:46. Показов 2606. Ответов 9


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

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



0



200 / 98 / 2

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

Сообщений: 261

01.03.2013, 09:38

2

чтобы добавить новую таблицу достаточно создать новый лист — кнопкой внизу экрана Excel или Shift+F11



1



0 / 0 / 0

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

Сообщений: 6

01.03.2013, 10:00

 [ТС]

3

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

чтобы добавить новую таблицу достаточно создать новый лист — кнопкой внизу экрана Excel или Shift+F11

это не решит мою проблему но все равно спасибо, мне необходимо что бы все работало на одном листе



0



0 / 0 / 0

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

Сообщений: 6

01.03.2013, 12:40

 [ТС]

4

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

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

Например: в ячейках R7C3:R47C18 находится таблица, она сгруппирована 10Rx46R и в этой же таблице есть график он строится на =Лист1!R12C4:R22C16, вопрос возможно ли написать макрос для добавление в последующим ниже порядке (R48C3:R88C18) новой таблицы и графика с помощью кнопки при этом данные графика строились уже на =Лист1!R53C4:R63C16 и так после каждого нажатия кнопки?



0



Alex77755

11482 / 3773 / 677

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

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

01.03.2013, 14:06

5

Запиши макрос копирования и вставки блока и у тебя будет половина решения.
А со второй скорей всего придется писать вучную: изменение адресов рядов.

Добавлено через 10 минут
Назначение будет как-то так:

Visual Basic
1
2
3
4
5
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveChart.PlotArea.Select
    Application.CutCopyMode = False
    ActiveChart.SeriesCollection(1).Values = "=Лист1!R56C6:R56C16"
    ActiveChart.SeriesCollection(1).Name = "=Лист1!R56C4"



1



MaximuZ

0 / 0 / 0

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

Сообщений: 6

01.03.2013, 15:38

 [ТС]

6

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

Запиши макрос копирования и вставки блока и у тебя будет половина решения.
А со второй скорей всего придется писать вучную: изменение адресов рядов.

Добавлено через 10 минут
Назначение будет как-то так:

Visual Basic
1
2
3
4
5
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveChart.PlotArea.Select
    Application.CutCopyMode = False
    ActiveChart.SeriesCollection(1).Values = "=Лист1!R56C6:R56C16"
    ActiveChart.SeriesCollection(1).Name = "=Лист1!R56C4"

кнопка получится одноразовой а постоянен изменение адресов рядов вручную теряет смысл кнопки но все равно спасибо



0



11482 / 3773 / 677

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

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

01.03.2013, 15:41

7

кнопка получится одноразовой

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



0



0 / 0 / 0

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

Сообщений: 6

01.03.2013, 16:27

 [ТС]

8

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

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

Если идет выкачка из базы то можно воспользоваться надстройкой PowerPivot и напрямую все тянуть с помощью Екселя….возможные объемы более 10 мильенов строк…скорость фантастика….для многомерного анализа данных — просто сказка. А вот как сделать чтоб постоянно не менять адреса строк в макросе это вопрос?????



0



11482 / 3773 / 677

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

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

01.03.2013, 17:50

9

Лучше, как говорится, мухи отдельно — котлеты отдельно. Был вопрос один

проблема возникла в написании макроса для добавление новой таблицы с помощью кнопки

Посмотрев на файл первое что у меня возникло: Наверное там не больше дисятка клиентов, раз выбран такой формат: на каждого клиента своя диаграмма и пр. Если клиентов будет до 1000, то и книга будет весить много, да и наверняка начнутся тормоза. А теперь оказывается, что записей 10 мильонов строк.
Тогда надо сначала обрисовать общую задачу в общих чертах, потом ваше видение желаемого результата.
Если данные тянутся из базы, то зачем делать на каждого пользователя таблицу и график? выбрали из списка нужного клиента и в единственной таблице отображайте данные



0



0 / 0 / 0

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

Сообщений: 6

01.03.2013, 18:17

 [ТС]

10

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

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

Идея про базу у меня возникла в процессе переписки на форуме, так что прости если что ни так)))) как говорится одна голова хорошо а две еще лучше)))))



0



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

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

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

Table of Contents

Как включить макросы в Excel

В Excel нажмите комбинацию клавиш alt + F11. Это приведет вас к редактору VBA в MS Excel. Затем щелкните правой кнопкой мыши папку Microsoft Excel Objects слева и выберите Insert => Module. Это место, где сохраняются макросы. Чтобы использовать макрос, вам нужно сохранить документ Excel как макрос. Из табуляции File => Save as, выберите Save as macro-enabled Workbok (расширение .xlsm) Теперь пришло время написать свой первый макрос!

1. Копирование данных из одного файла в другой.

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

Sub CopyFiletoAnotherWorkbook()
    
        Sheets("Example 1").Range("B4:C15").Copy
    
        Workbooks.Add
    
        ActiveSheet.Paste
    
        Application.DisplayAlerts = False
    
        ActiveWorkbook.SaveAs Filename:="C:TempMyNewBook.xlsx"
    
        Application.DisplayAlerts = True
End Sub

2. Отображение скрытых строк

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

Sub ShowHiddenRows()
    Columns.EntireColumn.Hidden = False
    Rows.EntireRow.Hidden = False
End Sub

3. Удаление пустых строк и столбов

Пустые строки в Excel — может быть проблемой для обработки данных. Вот как избавиться от них:

Sub DeleteEmptyRowsAndColumns()
    
        Dim MyRange As Range
        Dim iCounter As Long
    
        Set MyRange = ActiveSheet.UsedRange
        
        For iCounter = MyRange.Rows.Count To 1 Step -1
    
           If Application.CountA(Rows(iCounter).EntireRow) = 0 Then
               Rows(iCounter).Delete
               
               
           End If
    
        Next iCounter
    
        For iCounter = MyRange.Columns.Count To 1 Step -1
    
               If Application.CountA(Columns(iCounter).EntireColumn) = 0 Then
                Columns(iCounter).Delete
               End If
    
        Next iCounter      
End Sub

4. Нахождение пустых ячеек

Sub FindEmptyCell()
    ActiveCell.Offset(1, 0).Select
       Do While Not IsEmpty(ActiveCell)
          ActiveCell.Offset(1, 0).Select
       Loop
End Sub

#### 5. Заполнение пустых ячеек

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

Sub FindAndReplace()
    
        Dim MyRange As Range
        Dim MyCell As Range
    
        Select Case MsgBox("Can't Undo this action.  " & _
                            "Save Workbook First?", vbYesNoCancel)
            Case Is = vbYes
            ThisWorkbook.Save
            Case Is = vbCancel
            Exit Sub
        End Select
    
        Set MyRange = Selection
    
        For Each MyCell In MyRange
    
            If Len(MyCell.Value) = 0 Then
                MyCell = 0
            End If
    
        Next MyCell
End Sub

#### 6. Сортировка данных

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

NB: Здесь нам нужно поставить этот код в Sheet1 (папка Microsoft Excel Objects), а не в Module1 (папка Modules):

Private Sub Worksheet_BeforeDoubleClick (ByVal Target as Range, Cancel As Boolean)
    
        Dim LastRow As Long
    
        LastRow = Cells (Rows.Count, 1) .End (xlUp) .Row
    
        Rows ("6:" & LastRow) .Sort _
        Key1: = Cells (6, ActiveCell.Column), _
        Order1: = xlAscending
End Sub

#### 7. Удаление пустых пространств

Иногда данные в книге содержат дополнительные пробелы (whitespace charachters), которые могут мешать анализу данных и коррумпировать формулы. Вот один макрос, который удалит все пробелы из предварительно выбранного диапазона ячеек:

Sub TrimTheSpaces()
    
        Dim MyRange As Range
        Dim MyCell As Range
    
        Select Case MsgBox("Can't Undo this action.  " & _
                            "Save Workbook First?", vbYesNoCancel)
            Case Is = vbYes
            ThisWorkbook.Save
            Case Is = vbCancel
            Exit Sub
        End Select
    
        Set MyRange = Selection
    
        For Each MyCell In MyRange
    
            If Not IsEmpty(MyCell) Then
                MyCell = Trim(MyCell)
            End If
    
        Next MyCell
End Sub

#### 8. Выделение дубликатов цветом

Иногда в нескольких столбцах, которые мы хотели бы осветить, есть повторяющиеся значения. Этот макрос делает именно это:

Sub HighlightDuplicates()
    
        Dim MyRange As Range
        Dim MyCell As Range
    
        Set MyRange = Selection 
    
        For Each MyCell In MyRange 
    
            If WorksheetFunction.CountIf(MyRange, MyCell.Value) > 1 Then
                MyCell.Interior.ColorIndex = 36
            End If
    
        Next MyCell
End Sub

#### 9. Выделение десяти самых высоких чисел

Этот код будет отображать десять самых высоких чисел из набора ячеек:

Sub TopTen()
    Selection.FormatConditions.AddTop10
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1)
            .TopBottom = xlTop10Top
            
            .Rank = 10
            .Percent = False
        End With
        With Selection.FormatConditions(1).Font
            .Color = -16752384
            .TintAndShade = 0
        End With
        With Selection.FormatConditions(1).Interior
            .PatternColorIndex = xlAutomatic
            .Color = 13561798
            .TintAndShade = 0
        End With
    Selection.FormatConditions(1).StopIfTrue = False
End Sub

Вы можете легко настроить код, чтобы выделить различное количество чисел.

#### 10. Выделение данных больших чем данные число

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

Sub HighlightGreaterThanValues()
    Dim i As Integer
    i = InputBox("Enter Greater Than Value", "Enter Value")
    Selection.FormatConditions.Delete
    
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, Formula1:=i
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1)
            .Font.Color = RGB(0, 0, 0)
            .Interior.Color = RGB(31, 218, 154)
        End With
End Sub

Вы тоже можете настроить этот код, чтобы выделить более низкие чисел.

#### 11. Выделение ячеек комментариями
Простой макрос, который выделяет все ячейки, содержащие комментарии:

Sub HighlightCommentCells()
    Selection.SpecialCells(xlCellTypeComments).Select
    Selection.Style= "Note"
End Sub

#### 12. Выделение ячеек со словами с ошибками

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

 Sub ColorMispelledCells()
    For Each cl In ActiveSheet.UsedRange
        If Not Application.CheckSpelling(Word:=cl.Text) Then _
        cl.Interior.ColorIndex = 28
    Next cl
End Sub

13. Создание сводной таблицы

Вот как создать сводную таблицу в MS Excel (версия 2007). Особенно полезно, когда вы делаете индивидуальный отчет каждый день. Вы можете оптимизировать создание сводной таблицы следующим образом:

Sub PivotTableForExcel2007()
    Dim SourceRange As Range
    Set SourceRange = Sheets("Sheet1").Range("A3:N86")
    ActiveWorkbook.PivotCaches.Create( _
    SourceType:=xlDatabase, _
    SourceData:=SourceRange, _
    Version:=xlPivotTableVersion12).CreatePivotTable _
    TableDestination:="", _
    TableName:="", _
    DefaultVersion:=xlPivotTableVersion12
End Sub

14. Отправка активного файла по электронной почте

Мой любимый код VBA. Он позволяет вам прикреплять и отправлять файл, с которым вы работаете, с предопределенным адресом электронной почты, заголовком сообщения и телом сообщения! Сначала Вам нужно сделать референцию в Excel на Microsoft Outlook (в редакторе Excel VBA, нажмите tools => references и выберите Microsoft Outlook).

Sub SendFIleAsAttachment()
    
    
        Dim OLApp As Outlook.Application
        Dim OLMail As Object
    
        Set OLApp = New Outlook.Application
        Set OLMail = OLApp.CreateItem(0)
        OLApp.Session.Logon  
    
        With OLMail
        .To = "admin@datapigtechnologies.com; mike@datapigtechnologies.com"
        .CC = ""
        .BCC = ""
        .Subject = "This is the Subject line"
        .Body = "Hi there"
        .Attachments.Add ActiveWorkbook.FullName
        .Display  
        End With
    
        Set OLMail = Nothing
        Set OLApp = Nothing
End Sub

15. Вставка всех графиков Excel в презентацию PowerPoint

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

Sub SendExcelFiguresToPowerPoint()
    
    
        Dim PP As PowerPoint.Application
        Dim PPPres As PowerPoint.Presentation
        Dim PPSlide As PowerPoint.Slide
        Dim i As Integer
    
        Sheets("Slide Data").Select
            If ActiveSheet.ChartObjects.Count < 1 Then
                MsgBox "No charts existing the active sheet"
                Exit Sub
            End If
    
        Set PP = New PowerPoint.Application
        Set PPPres = PP.Presentations.Add
        PP.Visible = True
    
            For i = 1 To ActiveSheet.ChartObjects.Count
            
                ActiveSheet.ChartObjects(i).Chart.CopyPicture _
                Size:=xlScreen, Format:=xlPicture
                Application.Wait (Now + TimeValue("0:00:1"))
            
                ppSlideCount = PPPres.Slides.Count
                Set PPSlide = PPPres.Slides.Add(SlideCount + 1, ppLayoutBlank)
                PPSlide.Select
            
                PPSlide.Shapes.Paste.Select
                PP.ActiveWindow.Selection.ShapeRange.Align msoAlignCenters, True
                PP.ActiveWindow.Selection.ShapeRange.Align msoAlignMiddles, True
            Next i
    
        Set PPSlide = Nothing
        Set PPPres = Nothing
        Set PP = Nothing
End Sub

16. Вставка таблицы Excel в MS Word

Таблицы Excel обычно помещаются внутри текстовых документов. Вот один автоматический способ экспорта таблицы Excel в MS Word:

 Sub ExcelTableInWord()
    
    
        Dim MyRange As Excel.Range
        Dim wd As Word.Application
        Dim wdDoc As Word.Document
        Dim WdRange As Word.Range
    
       Sheets("Revenue Table").Range("B4:F10").Cop
    
        Set wd = New Word.Application
        Set wdDoc = wd.Documents.Open _
        (ThisWorkbook.Path & "" & "PasteTable.docx")
        wd.Visible = True
    
        Set WdRange = wdDoc.Bookmarks("DataTableHere").Rangе
    
        On Error Resume Next
        WdRange.Tables(1).Delete
        WdRange.Paste 
    
        WdRange.Tables(1).Columns.SetWidth _
        (MyRange.Width / MyRange.Columns.Count), wdAdjustSameWidth
    
        wdDoc.Bookmarks.Add "DataTableHere", WdRange
    
        Set wd = Nothing
        Set wdDoc = Nothing
        Set WdRange = Nothing
End Sub

17. Извлечение слов из текста

Мы можем использовать формулы, если хотим извлечь определенное количество символов. Но что, если мы хотим извлечь только одно слово из предложения или диапазон слов в ячейке? Для этого мы можем сами создать функцию Excel с помощью VBA. Это одна из самых удобных функций VBA, поскольку она позволяет создавать собственные формулы, которые отсутствуют в MS Excel. Давайте продолжим и создадим две функции: findword() и findwordrev():

Function FindWord(Source As String, Position As Integer) As String
     On Error Resume Next
     FindWord = Split(WorksheetFunction.Trim(Source), " ")(Position - 1)
     On Error GoTo 0
End Function

Function FindWordRev(Source As String, Position As Integer) As String
     Dim Arr() As String
     Arr = VBA.Split(WorksheetFunction.Trim(Source), " ")
     On Error Resume Next
     FindWordRev = Arr(UBound(Arr) - Position + 1)
     On Error GoTo 0
End Function

Отлично, мы уже создали две новые функции в Excel! Теперь попробуйте использовать их в Excel. Функция = FindWordRev (A1,1) берет последнее слово из ячейки A1. Функция = FindWord (A1,3) берет третье слово из ячейки A1 и т. Д.

18. Защита данных в MS Excel

Иногда мы хотим защитить данных нашего файла, чтобы только мы могли его изменять. Вот как это сделать с VBA:

Sub ProtectSheets()
    
        Dim ws As Worksheet
    
        For Each ws In ActiveWorkbook.Worksheets
    
        ws.Protect Password:="1234"
        Next ws
End Sub

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

© 2018 Атанас Йонков


Литература:
1. ExcelChamps.com: Top 100 Useful Excel Macro [VBA] Codes Examples.
2. Michael Alexander, John Walkenbach (2012). 101 Ready-To-Use Excel Macros.
3. BG Excel.info: 14 ready-to-use Macros for Excel.


Excel Macros — Overview

An Excel macro is an action or a set of actions that you can record, give a name, save and run as many times as you want and whenever you want. When you create a macro, you are recording your mouse clicks and keystrokes. When you run a saved macro, the recorded mouse clicks and keystrokes will be executed in the same sequence as they are recorded.

Macros help you to save time on repetitive tasks involved in data manipulation and data reports that are required to be done frequently.

Macro and VBA

You can record and run macros with either Excel commands or from Excel VBA.

VBA stands for Visual Basic for Applications and is a simple programming language that is available through Excel Visual Basic Editor (VBE), which is available from the DEVELOPER tab on the Ribbon. When you record a macro, Excel generates VBA code. If you just want to record a macro and run it, there is no need to learn Excel VBA. However, if you want to modify a macro, then you can do it only by modifying the VBA code in the Excel VBA editor.

You will learn how to record a simple macro and run it with Excel commands in the chapter — Creating a Simple Macro. You will learn more about macros and about creating and / or modifying macros from Excel VBA editor in the later chapters.

Personal Macro Workbook

A macro can be saved in the same workbook from where you recorded it. In that case, you can run the macro from that workbook only and hence you should keep it open. Excel gives you an alternative way to store all your macros. It is the personal macro workbook, where you can save your macros, which enables you to run those macros from any workbook.

You will learn about Personal Macro Workbook in the chapter — Saving all your Macros in a Single Workbook.

Macro Security

Macros will be stored as VBA code in Excel. As with the case of any other code, macro code is also susceptible to malicious code that can run when you open a workbook. This is a threat to your computer. Microsoft provided with the Macro Security facility that helps you in protecting your computer from such macro viruses.

You will learn more about this in the chapter — Macro Security.

Absolute References and Relative References

While recording a macro, you can use either absolute references or relative references for the cells on which you are clicking. Absolute references make your macro run at the same cells where you recorded the macro. On the other hand, relative references make your macro run at the active cell.

You will learn about these in the chapters — Using Absolute References for a Macro and Using Relative References for a Macro.

Macro Code in VBA

You can record and run macros from Excel even if you do not know Excel VBA. However, if you have to modify a recorded macro or create a macro by writing VBA code, you should learn Excel VBA. You can refer to the Excel VBA tutorial in this tutorials library for this

However, you should know how to view the macro code. You can learn how to access VBA editor in Excel and about the different parts of the VBA editor in the chapter – Excel VBA.

You can learn how to view the macro code in Excel VBA editor and you can understand the macro code in the chapter — Understanding Macro Code.

Assigning Macros to Objects

You can assign a macro to an object such as a shape or a graphic or a control. Then, you can run the macro by clicking on that object. You will learn about this in the chapter — Assigning Macros to Objects.

Running Macros

Excel provides several ways to run a macro. You can choose the way you want to run a macro. You will learn about these different possible ways of running a macro in the chapter — Running a Macro.

Creating a Macro Using VBA Editor

If you decide to write the macro code, you can learn it in the chapter — Creating a Macro Using VBA Editor. However, the prerequisite is that you should have Excel VBA knowledge.

Editing a Macro

You can modify macro code in Excel VBA editor. If you want to make extensive changes, you should have Excel VBA knowledge. But, if you want to make only minor changes to the code or if you want to copy the VBA code from a recorded macro to another macro, you can refer to the chapter — Editing a Macro.

You can rename a macro and even delete it. You will learn about this also in the same chapter.

User Forms

A Form is normally used to collect required information. It will be self-explanatory making the task simple. Excel User Forms created from Excel VBA editor serve the same purpose, providing the familiar options such as text boxes, check boxes, radio buttons, list boxes, combo boxes, scroll bars, etc. as controls.

You will learn how to create a User Form and how to use the different controls in the chapter – User Forms.

Debugging Macro Code

At times, a macro may not run as expected. You might have created the macro or you might be using a macro supplied to you by someone. You can debug the macro code just as you debug any other code to uncover the defects and correct them. You will learn about this in the chapter — Debugging Macro Code.

Configuring a Macro to Run on Opening a Workbook

You can make your macro run automatically when you open a workbook. You can do this either by creating an Auto_Run macro or by writing VBA code for workbook open event. You will learn this in the chapter — Configuring a Macro to Run on Opening a Workbook.

Excel Macros — Creation

You can create a macro with Excel commands by recording the key strokes and mouse clicks, giving the macro a name and specifying how to store the macro. A macro thus recorded can be run with an Excel command.

Suppose you have to collect certain results repeatedly in the following format −

Format

Instead of creating the table each time, you can have a macro to do it for you.

Recording a Macro

To record a macro do the following −

  • Click the VIEW tab on the Ribbon.
  • Click Macros in the Macros group.
  • Select Record Macro from the dropdown list.

Record

The Record Macro dialog box appears.

  • Type MyFirstMacro in the Macro name box.

  • Type A Simple Macro in the Description box and click OK.

Record Macro

Remember that whatever key strokes and mouse clicks you do, will be recorded now.

  • Click in the cell B2.

  • Create the table.

  • Click in a different cell in the worksheet.

  • Click the VIEW tab on the Ribbon.

  • Click Macros.

  • Select Stop Recording from the dropdown list.

Stop Recording

Your macro recording is completed.

The first step to click on a particular cell is important as it tells where exactly the macro has to start placing the recorded steps. Once you are done with the recording, you have to click Stop Recording to avoid recording of unnecessary steps.

Running a Macro

You can run the macro you have recorded any number of times you want. To run the macro, do the following −

  • Click on a new worksheet.

Note the active cell. In our case, it is A1.

  • Click the VIEW tab on the Ribbon.

  • Click Macros.

  • Select View Macros from the dropdown list.

View

The Macro dialog box appears.

Macro Dialog Box

Only the macro that you recorded appears in the Macros list.

  • Click the macro name – MyFirstMacro in the Macro dialog box. The description you typed while recording the macro will get displayed. Macro description allows you to identify for what purpose you have recorded the macro.

  • Click the Run button. The same table that you have created while recording the macro will appear in just a split of a second.

Macros List

You have discovered the magic wand that Excel provides you to save time on mundane tasks. You will observe the following −

  • Though the active cell before running the macro was A1, the table is placed in the cell B2 as you have recorded.

  • In addition, the active cell became E2, as you have clicked that cell before you stopped recording.

You can run the macro in multiple worksheets with different active cells before running the macro and observe the same conditions as given above. Just keep a note of this and you will understand later in this tutorial why it has occurred so.

You can also have a macro recording that places your recorded steps in the active cell. You will learn how to do this as you progress in the tutorial.

Storing a Macro

You might wonder how to save the macros that are created. In this context you need to know −

  • Storing a macro
  • Saving a macro enabled file

As and when you create a macro, you can choose where to store that particular macro. You can do this in the Record Macro dialog box.

Click the box — Store macro in. The following three options are available −

  • This Workbook.
  • New Workbook.
  • Personal Macro Workbook

Store Macro

This Workbook

This is the default option. The macro will be stored in your current workbook from where you created the macro.

New Workbook

This option, though available, is not recommended. You will be asking Excel to store the macro in a different new workbook and mostly it is not necessary.

Personal Macro Workbook

If you create several macros that you use across your workbooks, Personal Macro Workbook provides you with the facility to store all the macros at one place. You will learn more about this option in the next chapter.

Saving a Macro Enabled File

If you had chosen This Workbook as the option for storing the macro, you would need to save your workbook along with the macro.

Try to save the workbook. By default, you would be asking Excel to save the workbook as an .xls file. Excel displays a message saying that an Excel feature VB project cannot be saved in a macro free workbook, as shown below.

This Workbook

Note − If you click Yes, Excel will save your workbook as a macro free .xls file and your macro that you stored with This Workbook option will not get saved. To avoid this, Excel provides you an option to save your workbook as a macro-enabled workbook that will have .xlsm extension.

  • Click No in the warning message box.
  • Select Excel Macro-Enabled Workbook (*.xlsm) in the Save as type.
  • Click Save.

Save File

You will learn more about these in later chapters in this tutorial.

Excel Macros — Macros in a Single Workbook

Excel provides you with a facility to store all your macros in a single workbook. The workbook is called Personal Macro Workbook — Personal.xlsb. It is a hidden workbook stored on your computer, which opens every time you open Excel. This enables you to run your macros from any workbook. There will be a single Personal Macro Workbook per computer and you cannot share it across computers. You can view and run the macros in your Personal Macro Workbook from any workbook on your computer.

Saving Macros in Personal Macro Workbook

You can save macros in your Personal Macro Workbook by selecting it as the storing option while recording the macros.

Select Personal Macro Workbook from the drop down list under the category Store macro in.

Personal Macro

  • Record your second macro.
  • Give macro details in the Record Macro dialog box as shown below.
  • Click OK.

Second Macro

Your recording starts. Create a table as shown below.

Recording Starts

  • Stop recording.

  • Click the VIEW tab on the Ribbon.

  • Click Macros.

  • Select View Macros from the dropdown list. The Macro dialog box appears.

View Macros

The macro name appears with a prefix PERSONAL.XLSB! indicating that the Macro is in the Personal Macro Workbook.

Save your workbook. It will get saved as an .xls file as the macro is not in your workbook and close Excel.

You will get the following message regarding saving the changes to the Personal Macro Workbook −

Save

Click the Save button. Your macro is saved in the Personal.xlsb file on your computer.

Hiding / Unhiding Personal Macro Workbook

Personal Macro Workbook will be hidden, by default. When you start Excel, the personal macro workbook is loaded but you cannot see it because it is hidden. You can unhide it as follows −

  • Click the VIEW tab on the Ribbon.

  • Click Unhide in the Window group.

View Tab

The Unhide dialog box appears.

Unhide

PERSONAL.XLSB appears in the Unhide workbook box and click OK.

Personal XLSB

Now you can view the macros saved in the personal macro workbook.

To hide the personal macro workbook, do the following −

  • Click on the personal macro workbook.
  • Click the VIEW tab on the Ribbon.
  • Click Hide on the Ribbon.

Running Macros Saved in Personal Macro Workbook

You can run the macros saved in personal macro workbook from any workbook. To run the macros, it does not make any difference whether the personal macro workbook is hidden or unhidden.

  • Click View Macros.
  • Select the macro name from the macros list.
  • Click the Run button. The macro will run.

Adding / Deleting Macros in Personal Macro Workbook

You can add more macros in personal macro workbook by selecting it for Store macro in option while recording the macros, as you had seen earlier.

You can delete a macro in personal macro workbook as follows −

  • Make sure that the personal macro workbook is unhidden.
  • Click the macro name in the View Macros dialog box.
  • Click the Delete button.

If the personal macro workbook is hidden, you will get a message saying “Cannot edit a macro on a hidden workbook”.

Hidden Workbook

Unhide the personal macro workbook and delete the selected macro.

The macro will not appear in the macros list. However, when you create a new macro and save it in your personal workbook or delete any macros that it contains, you will be prompted to save the personal workbook just as in the case you saved it first time.

Excel Macros — Security

The macros that you create in Excel would be written in the programming language VBA (Visual Basic for Applications). You will learn about the Excel macro code in later chapters. As you are aware, when there is an executable code, there is a threat of viruses. Macros are also susceptible to viruses.

What are Macro Viruses?

Excel VBA in which the Macros are written has access to most Windows system calls and executes automatically when workbooks are opened. Hence, there is a potential threat of the existence of a virus written as a macro and is hidden within Excel that are executed on opening a workbook. Therefore, Excel macros can be very dangerous to your computer in many ways. However, Microsoft has taken appropriate measures to shield the workbooks from macro viruses.

Microsoft has introduced macro security so that you can identify which macros you can trust and which you cannot.

Macro Enabled Excel Workbooks

The most important Excel macro security feature is — file extensions.

Excel workbooks will be saved with .xlsx file extension by default. You can always trust workbooks with .xlsx file extension, as they are incapable of storing a macro and will not carry any threat.

Excel workbooks with macros are saved with .xlsm file extension. They are termed as Macro Enabled Excel Workbooks. Before you open such workbooks, you should make sure that the macros they contain are not malicious. For this, you must ensure that you can trust the origin of this type of workbooks.

Ways of Trusting Macro Enabled Workbook

Excel provides three ways to trust a macro enabled workbook.

  • Placing the macro enabled workbooks in a trusted folder

  • Checking if a macro is digitally signed

  • Enabling security alert messages before opening macro enabled workbooks

Placing the macro enabled workbooks in a trusted folder

This is the easiest and best way to manage macro security. Excel allows you to designate a folder as a trusted location. Place all your macro-enabled workbooks in that trusted folder. You can open macro-enabled workbooks that are saved to this location without warnings or restrictions.

Checking if a macro is digitally signed

Digital signatures confirm the identity of the author. You can configure Excel to run digitally signed macros from trusted persons without warnings or restrictions. Excel will also warn the recipient if it has been changed since the author signed it.

Enabling security alert messages before opening macro enabled workbooks

When you open a workbook, Excel warns you that the workbook contains macros and asks whether you wish to enable them. You can click the Enable Content button if the source of the workbook is reliable.

Security

You can set any of these three options in the Trust Center in the Excel Options.

If you work in an organization, the system administrator might have changed the default settings to prevent anyone from changing the settings. Microsoft advises that you do not change security settings in the Trust Center as the consequences can be loss of data, data theft or security compromises on your computer or network.

However, you can learn the macro security settings in the following sections and check if they are to be changed. You have to use your own instinct to decide on any of these options based on the context and your knowledge of the file origin.

Macro Security Settings in Trust Center

The macro settings are located in the Trust Center in the Excel Options. To access the Trust Center, do the following −

  • Click the FILE tab on the Ribbon.

  • Click Options. The Excel Options dialog box appears.

  • Click Trust Center in the left pane.

  • Click the Trust Center Settings button under Microsoft Excel Trust Center.

Macro Settings

The Trust Center dialog box appears.

Trust Center

You will see various options available in the Excel Trust Center in the left pane. You will learn about the options related to Excel macros in the following sections.

Macro Settings

Macro settings are located in the Trust Center.

Macro Settings

Under Macro Settings, four options are available.

  • Disable all macros without notification − If this option is chosen, Macros and security alerts about macros are disabled.

  • Disable all macros with notification − Macros are disabled, but security alerts appear if there are macros present. You can enable macros on a case-by-case basis.

  • Disable all macros except digitally signed macros − Macros are disabled but security alerts appear if there are macros present. However, if the macro is digitally signed by a trusted publisher, the macro runs if you trust the publisher. If you have do not trust the publisher, you will be notified to enable the signed macro and trust the publisher.

  • Enable all macros (not recommended, susceptible to macro viruses) − If this option is chosen, all macros run. This setting makes your computer vulnerable to potentially malicious code.

You have an additional security option under Developer Macro Settings with a Check box.

  • Trust access to the VBA project object model.

    • This option allows programmatic access to the Visual Basic for Applications (VBA) object model from an automation client.

    • This security option is for code written to automate an Office program and manipulate the VBA environment and object model.

    • It is a per-user and per-application setting, and denies access by default, hindering unauthorized programs from building harmful self-replicating code.

    • For automation clients to access the VBA object model, the user running the code must grant access. To turn on access, select the check box.

Defining a Trusted Location

If you think that a macro-enabled workbook is from a reliable source, it is better to move the file to the trusted location identified by Excel, instead of changing the default Trust Center settings to a less-safe macro security setting.

You can find the trusted folder settings in the Trust Center.

Click the Trusted Locations in the Trust Center dialog box. The Trusted Locations set by Microsoft Office appear on the right side.

Trusted Location

You can add new locations, remove the existing locations and modify the existing locations. The identified trusted locations will be treated by Microsoft office as reliable for opening files. However, if you add or modify a location, ensure that the location is secure.

You can also find the options that office does not recommend, such as locations on internet.

Digitally Signed Macros from Reliable Sources

Microsoft provides an option to accommodate digitally signed macros. However, even if a macro is digitally signed, you need to ensure that it is from a trusted publisher.

You will find the trusted publishers in in the Trust Center.

  • Click Trusted Publishers in the Trust Center dialog box. A list of certificates appear on the right side with the details – Issued To, Issued By and Expiration Date.

  • Select a certificate and click View.

Trusted Publishers

The certificate information is displayed.

As you have learnt earlier in this chapter, you can set an option to run a macro that is digitally signed only if you trust the publisher. If you do not trust the publisher, you will be notified to enable the signed macro and trust the publisher.

Using Warning Messages

The Message Bar displays security alert when there are macros in the file that you are opening. The yellow Message Bar with a shield icon alerts you that the macros are disabled.

Warning Messages

If you know that the macro or macros are from a reliable source, you can click n the Enable Content button on the Message Bar, to enable the macros.

You can disable the Message Bar option if you do not want security alerts. On the other hand, you can enable the Message Bar option to increase security.

Enabling / Disabling Security Alerts on the Message Bar

You can enable / disable security alerts with Message Bars as follows −

  • Click the FILE tab on the Ribbon.
  • Click Options. The Excel Options dialog box appears.
  • Click Trust Center.
  • Click the Trust Center Settings button.
  • Click Message Bar.

The Message Bar Settings for all Office Applications appear.

Message Bar

There are two options under — Showing the Message Bar.

Option 1 − Show the Message Bar in all applications when active content such as macros is blocked.

  • This is the default option. The Message Bar appears when potentially unsafe content has been disabled.

  • If you had selected — Disable all macros without notification in the Macro Settings of the Trust Center, this option is not selected and the Message Bar does not appear.

Showing Message

Option 2 − Never show information about blocked content.

If this option if selected, it disables the Message Bar and no alerts appear about security issues, regardless of any security settings in the Trust Center.

Blocked

Excel Macros — Absolute References

Excel macros can be recorded either with absolute references or relative references. A macro recorded with absolute references places the recorded steps exactly in the cells where it was recorded, irrespective of the active cell. On the other hand, a macro recorded with relative references can perform the recorded tasks at different parts on the worksheet.

You will learn about absolute references for macro in this chapter. You will learn about relative references in the next chapter.

Suppose you have to submit a report about your team’s work at the end of every day in the following format −

Absolute Reference

Now, the report should be placed in the cell B2 and should be in the given format.

A sample filled in report will be as shown below −

Sample

Except for the data in the following cells, the information is constant for every report that you generate for the project.

  • C3 – Report for Date.
  • C13 – No. of Tasks Completed Today.
  • C14 – Total No. of Tasks Completed.
  • C15 – % Work Complete.

Of these also, in C3 (Report for Date) you can place the Excel function = TODAY () that places the date of your report without your intervention. Further, in cell C15, you can have the formula C14/C12 and format the cell C15 as percentage to have the % Work Complete calculated by Excel for you.

This leaves you with only two cells – C13 and C14 that need to be filled in by you every day. Hence, it would be ideal to have information for the rest of the cells, every time you have to create the report. This saves time for you and you can do the mundane activity of reporting in just few minutes.

Now, suppose you have to send such reports for three projects. You can imagine the time you can save and take up more challenging work for the day and of course get the accolades from your management.

You can achieve this by recording a macro per project and running them on a day-to-day basis to generate the required reports in a matter of just few minutes. However, every time you run the macro, the report should appear on the worksheet as given above, irrespective of the active cell. For this, you have to use absolute references.

Ensuring Absolute References

To record a macro with absolute references, you have to ensure that the macro is being recorded starting from the cell where the steps have to start. This means, in the case of the example given in the previous section, you need to do the following −

  • Start recording the macro.
  • Create a new worksheet.
  • Click in any cell other than B2 in the new worksheet.
  • Click in the cell B2.
  • Continue recording the macro.

This will create a new worksheet for every new report and get the report format placed in the cell B2 every time you run the macro.

Note − The first three steps given above are essential.

  • If you do not create a new worksheet, when you run the macro, it places whatever you recorded on the same worksheet at the same place. This is not what you want. You need to have every report on a different worksheet.

  • If you do not click in a different cell at the beginning of the recording, even if the active cell is B2, Excel places the recorded steps in the active cell. When you run the macro, it will place the recorded report format at any part of the worksheet based on the active cell. By explicitly clicking in a cell other than B2 and then the the cell B2, you are telling the recorder to always place your macro steps in the cell B2.

Recording a Macro

You can start recording the macro with the Record Macro command on the Ribbon under the VIEW tab → Macros. You can also click the Start Recording Macro button present on left side of the Excel task bar.

Recording Macro

  • Start recording the macro. The Record Macro dialog box appears.

  • Give a meaningful name to identify the macro as a report of a particular project.

  • Select This Workbook under Store macro in, as you will produce reports from this specific workbook only.

  • Give a description to your macro and click OK.

Description

Your macro starts recording.

  • Create a new worksheet. This ensures your new report will be on a new worksheet.

  • Click in any cell other than B2 in the new worksheet.

  • Click in the cell B2. This ensures that the macro places your recorded steps in B2 always.

  • Create the format for the report.

  • Fill in the static information for the project report.

  • Place = TODAY () in C3 and = C14/C12 in the cell C15.

  • Format the cells with dates.

Stop recording the macro.

Stop Record

You can stop recording the macro either with the Stop Recording command on the Ribbon under VIEW tab → Macros or by clicking the Stop Recording Macro button present on left side of the Excel task bar.

Taskbar

Your Project Report macro is ready. Save the workbook as a macro-enabled workbook (with .xlsm extension).

Running a Macro

You can generate any number of reports in a few seconds just by running the macro.

  • Click the VIEW button on the Ribbon.
  • Click Macros.
  • Select View Macros from the dropdown list. The Macro dialog box appears.
  • Click the macro Report_ProjectXYZ.
  • Click the Run button.

A new worksheet will be created in your workbook, with the report stencil created in it in the cell B2.

Excel Macros — Relative References

Relative reference macros record an offset from the active cell. Such macros will be useful if you have to repeat the steps at various places in the worksheet.

Suppose you are required to analyze the data of voters collected from 280 constituencies. For each constituency, the following details are collected −

  • Constituency name.
  • Total population in the constituency.
  • Number of voters in the constituency.
  • Number of male voters, and
  • Number of female voters.

The data is provided to you in a worksheet as given below.

Relative References

It is not possible to analyze the data in the above format. Therefore, arrange the data in a table as shown below.

Table

If you attempt to arrange the given data in the above format −

  • It takes substantial amount of time to arrange the data from the 280 constituencies

  • It can be error prone

  • It becomes a mundane task not allowing you to focus on technical things

The solution is to record a macro so that you can complete the task in not more than a few seconds. The macro needs to use relative references, as you will move down the rows while arranging the data.

Using Relative References

In order to let the macro recorder know that it has to use relative references, do the following −

  • Click the VIEW tab on the Ribbon.

  • Click Macros.

  • Click Use Relative References.

Relative Reference

Preparing the Data Format

The first step in arranging the above given data is to define the data format in a table with headers.

Create the row of headers as shown below.

Preparing

Recording a Macro

Record the macro as follows −

  • Click Record Macro.

  • Give a meaningful name, say, DataArrange to the macro.

  • Type = row ()- 3 in the cell B4. This is because the S. No. is the current row number – the 3 rows above it.

  • Cut the cells B5, B6, B7, B8 and B9 and paste it in the cells C4 to C8 respectively.

  • Now click in the cell B5. Your table looks as shown below.

Macro Recording

The first data set is arranged in the first row of the table. Delete the rows B6 – B11 and click in the cell B5.

First Data Set

You can see that the active cell is B5 and the next data set will be placed here.

Stop recording the macro. Your macro for arranging the data is ready.

Running a Macro

You need to run the macro repeatedly to complete the data arrangement in the table as given below.

The active cell is B5. Run the macro. The second data set will be arranged in the second row of the table and the active cell will be B6.

Macro Running

Run the macro again. The third data set will be arranged in the third row of the table and the active cell will become B7.

Run the Macro

Each time you run the macro, the active cell advances to the next row, facilitating the repetition of recorded steps at the appropriate positions. This is possible because of the relative references in macro.

Run the macro until all the 280 data sets are arranged into 280 rows in the table. This process takes a few seconds and as the steps are automated, the entire exercise is error free.

Excel Macros — VBA

Excel stores the macros as Excel VBA (Visual Basic for Applications) code. After recording a macro, you can view the code that is generated, modify it, copy a part of it, etc. You can even write a macro code yourself if you are comfortable with programming in VBA.

You will learn how to create a macro, by writing a VBA code, in the chapter — Creating a Macro Using VBA Editor. You will learn how to modify a macro by editing VBA code in the chapter — Editing a Macro. You will learn the Excel VBA features in this chapter.

Developer Tab on the Ribbon

You can access macro code in VBA from the Developer tab on the Ribbon.

Developer

If you do not find the Developer tab on the Ribbon, you need to add it as follows −

  • Right click on the Ribbon.

  • Select Customize the Ribbon from the dropdown list.

Customize Ribbon

The Excel Options dialog box appears.

  • Select Main Tabs from Customize the Ribbon dropdown list.

  • Check the box – Developer in the Main Tabs list and click OK. The developer tab appears.

Excel Options

Developer Commands for Macros

You need to know the commands that are for macros under the developer tab.

Click the DEVELOPER tab on the Ribbon. The following commands are available in the Code group −

  • Visual Basic
  • Macros
  • Record Macro
  • Use Relative References
  • Macro Security

Controls

The Visual Basic command is used to open the VBA Editor in Excel and the Macros command is used to view, run and delete the macros.

You have already learnt the commands other than VBA Editor in the previous chapters.

VBA Editor

VBA Editor or VBE is the developer platform for VBA in Excel.

Open the workbook – MyFirstMacro.xlsm that you saved earlier in the chapter – Creating a Simple Macro, in this tutorial.

You can open the VBE in any of the two ways −

Option 1 − Click Visual Basic in the Code group under the Developer tab on the Ribbon.

VBA Editor

Option 2 − Click Edit in the Macro dialog box that appears when you click VIEW tab → Macros → View Macros

View Macro

VBE appears in a new window.

VBE

The name of your Excel macro enabled workbook name appears with the prefix – Microsoft Visual Basic for Applications.

You will find the following in the VBE −

  • Projects Explorer.
  • Properties.
  • Module window with Code.

Projects Explorer

Project Explorer is where you find the VBA project names. Under a project, you will find Sheet names and Module names. When you click a module name, the corresponding code appears on the right side in a window.

Properties Window

The Properties are the parameters for VBA objects. When you have an object such as command button, its properties will appear in the Properties window.

Module Window with Code

The code of a macro will be stored in a module in VBA. When you select a macro and click Edit, the code of the macro appears in the corresponding module window.

Excel Macros — Understanding Codes

When you record a macro, Excel stores it as a VBA code. You can view this code in the VBA editor. You can understand the code and modify it if you have substantial knowledge of Excel VBA. You can refer to the Excel VBA tutorial in this tutorials library to obtain a grasp on the language.

However, you can still view the macro code in Excel VBA editor and match it to the steps that you recorded in macro. You will learn how to view the code and understand it for the first macro that you created in this tutorial – MyFirstMacro.

Viewing a Macro Code in VBA Editor

To view a macro code, do the following −

  • Open the workbook in which you stored the macro.
  • Click VIEW tab on the Ribbon.
  • Click Macros.
  • Select View Macros from the dropdown list.

Viewing

The Macro dialog box appears.

  • Click MyFirstMacro in the macros list.
  • Click the Edit button.

Edit

The VBA editor opens and the code of the macro MyFirstMacro appears.

Macro

Understanding the Recorded Actions as Parts of Code

You can browse through the macro code and map them to your recorded steps.

  • Start reading the code.
  • Map the code to the recorded steps.

Understanding

Scroll down the code to view more code. Alternatively, you can enlarge the code window.

Enlarge Code

Observe that the code is simple. If you learn Excel VBA, you can create the macros by writing the code in the VBA editor.

You will learn how to write a VBA code to create a macro in the chapter — Creating a Macro Using VBA Editor.

Excel Macros — Assigning Macros to Objects

Suppose you have created a macro that you need to execute several times. For example, the macros that you have created for absolute references and relative references. Then, it would be easy for you if you can run the macro using a mouse click. You can accomplish this by assigning the macro to an object such as a shape or a graphic or a control.

In this chapter, you will learn how to include an object in your workbook and assign a macro to it.

Recall the macro that you created using relative references. The macro arranges the data given in one column into a table to facilitate data analysis.

Recall

Assigning a Macro to a Shape

You can insert a shape in your worksheet that is in a meaningful form with self-explanatory text, which when clicked runs the macro assigned to it.

  • Click the INSERT tab on the Ribbon.

  • Click Shapes in the Illustrations group.

  • Select any of the ready-made shapes that appear in the dropdown list. For example, the Flowchart shape – Preparation, as you are in the process of preparing the data.

Assigning

Draw the shape and format it.

Draw Shape

  • Right click on the shape and select Edit Text from the dropdown list.

  • Type text inside the shape — Run Macro.

  • Format the text.

Edit Text

  • Right click on the shape.
  • Select Assign Macro from the dropdown list.

Assign Macro

The Assign Macro dialog box appears. Click the macro name i.e. RelativeMacro and click OK.

Macro Name

The macro is assigned to the shape.

  • Click in the cell where you have to run the macro say B4.

  • Move the cursor (pointer) onto the shape. The cursor (pointer) changes to finger.

Cursor

Now click the shape. The macro will run. Just repeat the mouse clicks to run the macro several times and you are done with the task of arranging the data into a table in a matter of a few seconds.

Assigning a Macro to a Graphic

You can insert a graphic in the worksheet and assign a macro to it. The graphic can be chosen to visualize your macro. For example, you can have a graphic of table representing that the macro will arrange the data into a table.

  • Click the INSERT tab on the Ribbon.
  • Click Pictures in the Illustrations group.
  • Select a file that contains your graphic.

Graphic

The rest of the steps are the same as those of shape given in the previous section.

Assigning a Macro to a Control

Inserting a VBA control and assigning a macro to it makes your work look professional. You can insert VBA controls from the Developer tab on the Ribbon.

  • Click the DEVELOPER tab on the Ribbon.

  • Click Insert in the Controls group.

Insert

Select the Button icon under Form Controls from the dropdown list as shown in screenshot given below −

Form Controls

  • Click the cell on the worksheet where you want to insert the Button control. The Assign Macro dialog box appears.

  • Click the macro name and click OK.

Button Control

The control button with the assigned macro will be inserted.

Control Button

  • Right click on the button.
  • Click Edit Text.
  • Type – Run Macro.
  • Format Text and resize Button.

Type Run Macro

You can run the macro any number of times by just clicking the Button repeatedly.

Using Form Controls is an easy and effective way of interacting with the user. You will learn more about this in the chapter – Interacting with the User.

Excel Macros — Running a Macro

There are several ways of executing a macro in your workbook. The macro would have been saved in your macro enabled workbook or in your Personal macro workbook that you can access from any workbook as you had learnt earlier.

You can run a macro in the following ways −

  • Running a Macro from the View Tab
  • Running a Macro by pressing Ctrl plus a shortcut key
  • Running a Macro by clicking a button on the Quick Access Toolbar
  • Running a Macro by clicking a button in a Custom Group on the Ribbon
  • Running a Macro by clicking on a Graphic Object
  • Running a Macro from Developer Tab
  • Running a Macro from VBA Editor

Running a Macro from View Tab

You have already learnt running a macro from the View tab on the Ribbon. A quick recap −

  • Click the VIEW tab on the Ribbon.
  • Click Macros.
  • Select View Macros from the dropdown list.

Active Cell

The Macro dialog box appears.

  • Click the macro name.
  • Click the Run button.

Dialog Box

Running a Macro with Shortcut Key

You can assign a shortcut key (Ctrl + key) for a macro. You can do this while recording the macro in the Create Macro dialog box. Otherwise, you can add this later in the Macro Options dialog box.

Adding a Shortcut Key While Recording a Macro

  • Click the VIEW tab.
  • Click Macros.
  • Select Record Macro from the dropdown list.

The Create Macro dialog box appears.

  • Type a macro name
  • Type a letter, say q, in the box next to Ctrl + under Shortcut key.

Adding

Adding a Shortcut Key in Macro Options

  • Click the VIEW tab.
  • Click Macros.
  • Select View Macros from the dropdown list.

The Macro dialog box appears.

  • Select the macro name.
  • Click the Options button.

Shortcut Key

The Macro Options dialog box appears. Type a letter, say q, in the box next to Ctrl + under Shortcut key. Click OK.

Type a Letter

To run the macro with the shortcut key, press the Ctrl key and the key q together. The macro will run.

Note − You can use any lowercase or uppercase letters for the shortcut key of a macro. If you use any Ctrl + letter combination that is an Excel shortcut key, you will override it. Examples include Ctrl+C, Ctrl+V, Ctrl+X, etc. Hence, use your jurisdiction while choosing the letters.

Running a Macro through Quick Access Toolbar

You can add a macro button to the Quick Access Toolbar and run the macro by clicking it. This option would be useful when you store your macros in personal macro workbook. The added button will appear on the Quick Access Toolbar in whatever workbook you open, thus making it easy for you to run the macro.

Suppose you have a macro with the name MyMacro in your personal macro workbook.

To add the macro button to the Quick Access Toolbar do the following −

  • Right click on the Quick Access Toolbar.

  • Select Customize Quick Access Toolbar from the dropdown list.

Quick Access

The Excel Options dialog box appears. Select Macros from the dropdown list under the category- Choose commands from.

Commands

A list of macros appears under Macros.

  • Click PERSONAL.XLSB!MyMacro.
  • Click the Add button.

List

The macro name appears on the right side, with a macro button image.

To change the macro button image, proceed as follows −

  • Click the macro name in the right box.
  • Click the Modify button.

Modify

The Modify Button dialog box appears. Select one symbol to set it as the icon of the button.

Icon

Modify the Display name that appears when you place the pointer on the Button image on the Quick Access Toolbar to a meaningful name, say, Run MyMacro for this example. Click OK.

MyMacro

The Macro name and the icon symbol change in the right pane. Click OK.

Symbol

The macro button appears on the Quick Access Toolbar and the macro display name appears when you place the pointer on the button.

Pointer

To run the macro, just click the macro button on the Quick Access Toolbar.

Running a Macro in Custom Group

You can add a custom group and a custom button on the Ribbon and assign your macro to the button.

  • Right click on the Ribbon.
  • Select Customize the Ribbon from the dropdown list.

Custom Group

The Excel Options dialog box appears.

  • Select Main Tabs under Customize the Ribbon.
  • Click New Tab.

Excel Option

The New Tab (Custom) appears in Main Tabs list.

  • Click New Tab (Custom).
  • Click the New Group button.

The New Group (Custom) appears under New Tab (Custom).

  • Click New Tab (Custom).
  • Click the Rename button.

Custom

The Rename dialog box appears. Type the name for your custom tab that appears in Main tabs on the Ribbon, say — My Macros and click OK.

Rename

Note − All the Main tabs on the Ribbon are in uppercase letters. You can use your discretion to use uppercase or lowercase letters. I have chosen lowercase with capitalization of words so that it stands out in the standard tabs.

The new tab name changes to My Macros (Custom).

  • Click New Group (Custom).
  • Click the Rename button.

New Group

The Rename dialog box appears. Type the group name in the Display name dialog box and click OK.

Display Name

The new group name changes to Personal Macros (custom).

Click Macros in the left pane under Choose commands from.

Commands from

  • Select your macro name, say – MyFirstMacro from the macros list.
  • Click the Add button.

Macro List

The macro will be added under the Personal Macros (Custom) group.

Personal Macros

  • Click My Macros (Custom) in the list.
  • Click the arrows to move the tab up or down.

Arrows

The position of the tab in the main tabs list determines where it will be placed on the Ribbon. Click OK.

Position

Your custom tab – My Macros appears on the Ribbon.

Click the tab — My Macros. Personal Macros group appears on the Ribbon. MyFirstMacro appears in the Personal Macros group. To run the macro, just click on MyFirstMacro in the Personal Macros group.

Click Tab

Running a Macro by Clicking an Object

You can insert an object such as a shape, a graphic or a VBA control in your worksheet and assign a macro to it. To run the macro, just click the object.

For details on running a macro using objects, refer to chapter – Assigning Macros to Objects.

Running a Macro from the Developer Tab

You can run a macro from the Developer tab.

  • Click the Developer tab on the Ribbon.
  • Click Macros.

Developer Tab

The Macro dialog box appears. Click the macro name and then click Run.

Click Run

Running a Macro from VBA Editor

You can run a macro from the VBA editor as follows −

  • Click the Run tab on the Ribbon.
  • Select Run Sub/UserForm from the dropdown list.

UserForm

Creating a Macro Using VBA Editor

You can create a macro by writing the code in the VBA editor. In this chapter, you will learn where and how to write the code for a macro.

VBA Objects and Modules

Before you start coding for a Macro, understand the VBA Objects and Modules.

  • Open the macro-enabled workbook with your first macro.
  • Click the DEVELOPER tab on the Ribbon.
  • Click Visual Basic in the Code group.

Objects

The VBA editor window opens.

Window Opens

You will observe the following in the Projects Explorer window −

  • Your macro enabled workbook – MyFirstMacro.xlsm appears as a VBA Project.

  • All the worksheets and the workbook appear as Microsoft Excel Objects under the project.

  • Module1 appears under Modules. Your macro code is located here.

  • Click Module1.

  • Click the View tab on the Ribbon.

  • Select Code from the dropdown list.

Code

The code of your macro appears.

Code of Macro

Creating a Macro by Coding

Next, create a second macro in the same workbook – this time by writing VBA code.

You can do this in two steps −

  • Insert a command button.

  • Write the code stating the actions to take place when you click the command button.

Inserting a Command Button

  • Create a new worksheet.

  • Click in the new worksheet.

  • Click the DEVELOPER button on the Ribbon.

  • Click Insert in the Controls group.

  • Select the button icon from Form Controls.

Inserting Command

  • Click in the worksheet where you want to place the command button.
  • The Assign Macro dialog box appears.

Button1_Click

The Visual Basic editor appears.

Visual Basic

You will observe the following −

  • A new module – Module2 is inserted in the Project Explorer.
  • Code window with title Module2 (Code) appears.
  • A sub procedure Button1_Click () is inserted in the Module2 code.

Coding the Macro

Your coding is half done by the VBA editor itself.

For example, type MsgBox “Best Wishes to You!” in the sub procedure Button1_Click (). A message box with the given string will be displayed when the command button is clicked.

Message Box

That’s it! Your macro code is ready to run. As you are aware, VBA code does not require compilation as it runs with an interpreter.

Running the Macro from VBA Editor

You can test your macro code from the VBA editor itself.

  • Click the Run tab on the Ribbon.

  • Select Run Sub/UserForm from the dropdown list. The message box with the string you typed appears in your worksheet.

Macro From VBA

You can see that the button is selected. Click OK in the message box. You will be taken back to the VBA editor.

Running the Macro from Worksheet

You can run the macro that you coded any number of times from the worksheet.

  • Click somewhere on the worksheet.
  • Click the Button. The Message box appears on the worksheet.

Macro From Worksheet

You have created a macro by writing VBA code. As you can observe, VBA coding is simple.

Excel Macros — Editing

You have learnt how to write macro code in VBA editor in the previous chapter. You can edit the macro code, rename a macro and delete a macro.

If you master Excel VBA, writing code or modifying code for a macro is a trivial task. You can edit the macro code however you want. If you want to make only few simple changes in the macro code, you can even copy macro code from one place to another.

Copying a Macro Code

You have created two macros – MyFirstMacro and Button1_Click in the macro enabled workbook MyFirstMacro.xlsm. You have created the first macro by recording the steps and the second macro by writing code. You can copy code from the first macro into the second macro.

  • Open the workbook MyFirstMacro.xlsm.

  • Click the Developer tab on the Ribbon.

  • Click Visual Basic. The Visual Basic editor opens.

  • Open the code for Module1 (MyFirstMacro macro code) and Module2 (Button1_Click () macro code).

  • Click the Window tab on the Ribbon.

  • Select Tile Horizontally from the dropdown list.

You can view the code of the two macros in the tiled windows.

Copying

  • Copy the MsgBox line in the Module2 code.

  • Paste it above that line.

  • Modify the string as −

    MsgBox “Hello World!”

  • Copy the following code from Module1.

Copy Code

Paste it in the Module2 code in between the two MsgBox lines of code.

MsgBox

  • Click the Save icon to save the code.

  • Click the Button in the Excel sheet. A Message box appears with the message — Hello World! Click OK.

Hello World

The table data appears (according to the code that you copied) and message box appears with message — Best Wishes to You!

Table Data

You can modify the code in just a few steps. This is the easiest task for a beginner.

Renaming a Macro

Suppose you want to run the edited macro from any worksheet other than the one that has the command button. You can do it irrespective of button click by renaming the macro.

  • Click the VIEW tab on the Ribbon.
  • Click Macros.
  • Select View Macros from the dropdown list.

The Macro dialog box appears.

  • Click the macro name – Button1_Click.
  • Click the Edit button.

Renaming Macro

The macro code appears in the VBA editor.

Change the name that appears in the Sub line from Button1_Click to RenamedMacro. Leave Sub and parenthesis as they are.

RenamedMacro

Open the Macro dialog box. The macro name appears as you renamed.

Open Macro

  • Click RenamedMacro.
  • Click the Run button. The macro runs. Now a button click is not necessary.

Deleting a Macro

You can delete a macro that you have recorded or coded.

  • Open the Macros dialog box.
  • Click the macro name.
  • Click the Delete button.

Deleting Macro

The Delete confirmation message appears.

Delete Confirmation

Click Yes if you are sure to delete the macro. Otherwise, click No.

Excel Macros — UserForms

At times, you might have to collect information repeatedly from others. Excel VBA provides you with an easy way of handling this task- UserForm. As any other form that you fill up, UserForm makes it simple to understand, what information is to be provided. UserForm is user friendly in the way that the controls provided are self-explanatory, accompanied by additional instructions where necessary.

Major advantage of UserForm is that you can save on time that you spend on what and how the information is to be filled.

Creating a UserForm

To create a UserForm, proceed as follows −

  • Click the DEVELOPER tab on the Ribbon.
  • Click Visual Basic. A Visual Basic window for the workbook opens.
  • Click Insert,
  • Select UserForm from the dropdown list.

Creating UserForm

The UserForm appears on the right side of the window.

UserForm Appears

Understanding the UserForm

Maximize the UserForm.xlsx – UserForm1 window.

You are in the design mode now. You can insert controls on the UserForm and write code for the respective actions. The controls are available in the ToolBox. Properties of UserForm are in the Properties window. UserForm1 (caption of the UserForm) is given under Forms in the Projects Explorer.

Understanding UserForm

  • Change the caption of the UserForm to Project Report – Daily in the properties window.
  • Change the name of the UserForm to ProjectReport.

ProjectReport

The changes are reflected in the UserForm, properties and project explorer.

Controls in the ToolBox

A UserForm will have different components. As and when you click on any of the components, either you will be provided with instructions on what and how the information is to be provided or you will be provided with options (choices) to select from. All these are provided by means of ActiveX controls in the ToolBox of the UserForm.

Excel provides two types of controls – Form controls and ActiveX controls. You need to understand the difference between these two types of controls.

Form controls

Form controls are the Excel original controls that are compatible with earlier versions of Excel, starting with Excel version 5.0. Form controls are also designed for use on XLM macro sheets.

You can run macros by using Form controls. You can assign an existing macro to a control, or write or record a new macro. When the control is clicked, the macro. You have already learnt how to insert a command button from Form controls in the worksheet to run a macro. However, these controls cannot be added to a UserForm.

ActiveX controls

ActiveX controls can be used on VBA UserForms. ActiveX controls have extensive properties that you can use to customize their appearance, behavior, fonts and other characteristics.

You have the following ActiveX controls in the UserForm ToolBox −

  • Pointer
  • Label
  • TextBox
  • ComboBox
  • ListBox
  • CheckBox
  • OptionButton
  • Frame
  • ToggleButton
  • CommandButton
  • TabStrip
  • MultiPage
  • ScrollBar
  • SpinButton
  • Image

In addition to these controls, Visual Basic provides you with MsgBox function that can be used to display messages and/or prompt the user for an action.

In the next few sections, you will understand these controls and MsgBox. Then, you will be in a position to choose which of these controls are required to design your UserForm.

Label

You can use Labels for identification purpose by displaying descriptive text, such as titles, captions and / or brief instructions.

Example

Label

TextBox

You can use a TextBox that is a rectangular box, to type, view or edit text. You can also use a TextBox as a static text field that presents read-only information.

Example

TextBox

List Box

You can use a List Box to display a list of one or more items of text from which a user can choose. Use a list box for displaying large numbers of choices that vary in number or content.

  • Insert a ListBox on the UserForm.
  • Click on the ListBox.
  • Type ProjectCodes for Name in the Properties window of the ListBox.

There are three types of List Boxes −

  • Single-selection List box − A single-selection List Box enables only one choice. In this case, a list box resembles a group of option buttons, except that a list box can handle a large number of items more efficiently.

  • Multiple selection List Box − A multiple selection List Box enables either one choice or contiguous (adjacent) choices.

  • Extended-selection List Box − An extended-selection List Box enables one choice, contiguous choices and noncontiguous (or disjointed) choices.

You can select one of these types of List Boxes, from the Properties window.

ListBox

  • Right click on the UserForm.
  • Select View Code from the dropdown list. The code window of UserForm opens.
  • Click Initialize in the top right box of the code window.
  • Type the following under Private Sub UserForm_Initialize().
ProjectCodes.List = Array ("Proj2016-1", "Proj2016-2", "Proj2016-3", "Proj20164", "Proj2016-5") 

Initialize

  • Click the Run tab on the Ribbon.
  • Select Run Sub/UserForm from the dropdown list.

Select Run

Next, you can write code for actions on selecting an item in the list. Otherwise, you can just display the text that is selected, which is the case for filling the Project Code in the Report.

ComboBox

You can use ComboBox that combines a text box with a list box to create a dropdown list box. A combo box is more compact than a list box but requires the user to click the down arrow to display the list of items. Use a combo box to choose only one item from the list.

  • Insert a ComboBox on the UserForm.
  • Click the ComboBox.
  • Type ProjectCodes2 for Name in the Properties window of the ComboBox.

ComboBox

  • Right click on the UserForm.
  • Select View Code from the dropdown list.
  • The code window of UserForm opens.

Type the following as shown below.

ProjectCodes2.List = Array ("Proj2016-1", "Proj2016-2", "Proj2016-3", "Proj20164", "Proj2016-5") 

Code Window

  • Click the Run tab on the Ribbon.
  • Select Run Sub/UserForm from the dropdown list.

Run Tab

Click the down arrow to display the list of items.

Click Down Arrow

Click on the required item, say, Project2016-5. The selected option will be displayed in the combo box.

Required Item

CheckBox

You can use check boxes to select one or more options that are displayed by clicking in the boxes. The options will have labels and you can clearly visualize what options are selected.

A check box can have two states −

  • Selected (turned on), denoted by a tick mark in the box
  • Cleared (turned off), denoted by a clear box

You can use check boxes for selection of options in a combo box to save space. In such a case, the check box can have a third state also −

  • Mixed, meaning a combination of on and off states, denoted by a black dot in the box. This will be displayed to indicate multiple selections in the combo box with check boxes.

  • Insert check boxes in the UserForm as shown below.

CheckBox

  • Click the Run tab on the Ribbon.
  • Select Run Sub/UserForm from the dropdown list.
  • Click in the boxes for your selected options.

Boxes

OptionButton

You can use an option button, also known as the radio button to make a single choice within a limited set of mutually exclusive choices. An option button is usually contained in a group box or a frame.

An option button is represented by a small circle. An option button can have one of the following two states −

  • Selected (turned on), denoted by a dot in the circle
  • Cleared (turned off), denoted by a blank

Frame

You can use a frame control, also referred to as a group box to group related controls into one visual unit. Typically, option buttons, check boxes or closely related contents are grouped in a frame control.

A frame control is represented by a rectangular object with an optional label.

  • Insert a frame with caption “Choice”.

  • Insert two option buttons with captions “Yes” and “No” in the frame control. The options Yes and No are mutually exclusive.

Frame

  • Click the Run tab on the Ribbon.
  • Select Run Sub/UserForm from the dropdown list.
  • Click on your selected option.

Selected Option

ToggleButton

You can use a toggle button to indicate a state, such as Yes or No, or a mode, such as on or off. The button alternates between an enabled and a disabled state when it is clicked.

Insert a toggle button on UserForm as shown below −

TogglebButton

  • Click the Run tab on the Ribbon.

  • Select Run Sub/UserForm from the dropdown list. The toggle button will be in enabled state by default.

Default

Click the toggle button. The toggle button will be disabled.

Toggle Button

If you click the toggle button again, it will be enabled.

CommandButton

You can use a command button to run a macro that performs some actions when the user clicks on it. You have already learnt how to use a command button on a worksheet to run a macro.

Command button is also referred to as a push button. Insert a command button on the UserForm as shown below −

CommandButton

  • Right click on the command button.
  • Type the following code in the sub Commandbutton1_click ().
ProjectCodes2.DropDown 

CommandButton1

  • Click the Run tab on the Ribbon.
  • Select Run Sub/UserForm from the dropdown list.

Daily Report

Click the command button. The dropdown list of combo box opens, as it is the action that you have written in the code.

Combo Box

TabStrip

You can insert a tab strip that resembles Excel tabs on the UserForm.

ScrollBar

You can use a scroll bar to scroll through a range of values by clicking on the scroll arrows or by dragging the scroll box.

Insert a scroll bar on the UserForm by drawing it at the required position and adjust the length of the scroll bar.

ScrollBar

  • Right click on the scroll bar.
  • Select View Code from the dropdown list. The Code window opens.
  • Add the following line under sub ScrollBar1_Scroll().
TextBox2.Text = "Scrolling Values" 

Scrolling Value

  • Click the Run tab on the Ribbon.
  • Select Run Sub/UserForm from the dropdown list.

ScrollBar Report

Drag the scroll box. The Text – Scrolling Values will be displayed in the text box as you specified it as the action for scroll bar scroll.

Text Box

MsgBox ()

You can use the MsgBox () function to display a message when you click on something. It can be a guideline or some information or a warning or an error alert.

For example, you can display a message that values are being scrolled when you start scrolling the scroll box.

MsgBox Function

Message Box Icon Displays

You can use message-box icon displays that portray the specific message. You have the multiple message box icons to suit your purpose −

  • Type the following code under ScrollBar1_scroll.
MsgBox "Select Ok or Cancel", vbOKCancel, "OK  - Cancel Message" 
MsgBox "It's an Error!", vbCritical, "Run time result" 
MsgBox "Why this value", vbQuestion, "Run time result" 
MsgBox "Value Been for a Long Time", vbInformation, "Run time result" 
MsgBox "Oh Is it so", vbExclamation, "Run time result" 
  • Click the Run tab on the Ribbon.
  • Select Run Sub/UserForm from the dropdown list.
  • Drag the scroll box.

You will get the following message boxes successively.

Message Boxes

Designing UserForm

Now, you have an understanding of the different controls that you can use on a UserForm. Select the controls, group them if required and arrange them on the UserForm as per some meaningful sequence. Write the required actions as code corresponding to the respective controls.

Refer to the VBA tutorial in this tutorials library for an example of UserForm.

Excel Macros — Debugging a Code

You have learnt that the macro is stored as VBA code in Excel. You have also learnt that you can directly write code to create a macro in VBA editor. However, as with the case with any code, even the macro code can have defects and the macro may not run as you expected.

This requires examining the code to find the defects and correct them. The term that is used for this activity in software development is debugging.

VBA Debugging

VBA editor allows you to pause the execution of the code and perform any required debug task. Following are some of the debugging tasks that you can do.

  • Stepping Through Code
  • Using Breakpoints
  • Backing Up or Moving Forward in Code
  • Not Stepping Through Each Line of Code
  • Querying Anything While Stepping Through Code
  • Halting the Execution

These are just some of the tasks that you might perform in VBA’s debugging environment.

Stepping Through the Code

The first thing that you have to do for debugging is to step through the code while executing it. If you have an idea of which part of the code is probably producing the defect, you can jump to that line of the code. Otherwise, you can execute the code line by line, backing up or moving forward in the code.

You can step into the code either from Macro dialog box in your workbook or from the VBA editor itself.

Stepping into the code from the workbook

To step into the code from the workbook, do the following −

  • Click the VIEW tab on the Ribbon.
  • Click Macros.
  • Select View Macros from the dropdown list.

The Macro dialog box appears.

  • Click the macro name.
  • Click the Step into button.

Step into

VBA editor opens and the macro code appears in the code window. The first line in the macro code will be highlighted in yellow color.

Macro Code

Stepping into the code from the VBA editor

To step into the code from the VBA editor, do the following −

  • Click the DEVELOPER tab on the Ribbon.
  • Click Visual Basic. The VBA editor opens.
  • Click the module that contains the macro code.

The macro code appears in the code window.

Stepping

  • Click the Debug tab on the Ribbon.

  • Select Step into from the dropdown list.

Dropdown

The first line in the macro code will be highlighted. The code is in the debugging mode and the options in the Debug dropdown list will become active.

Active

Backing Up or Moving Forward in the Code

You can move forward or backward in the code by selecting Step Over or Step Out.

Not Stepping Through Each Line of Code

You can avoid stepping through each line code, if you identify a potential part of the code that needs to be discussed, by selecting Run to Cursor.

Using Breakpoints

Alternatively, you can set breakpoints at specific lines of code and execute the code, observing the results at each breakpoint. You can toggle a breakpoint and clear all breakpoints if and when required.

Using Watch

You can add a watch while debugging, to evaluate an expression and stop the execution when a variable attains a specific value. This means that you configure a watch expression, which will be monitored until it is true and then the macro will halt and leave you in break mode. VBA provides you with several watch types to select from, in order to accomplish what you are looking for.

Halting the Execution

During debugging, at any point of time, if you have found a clue on what is going wrong, you can halt the execution to decipher further.

If you are an experienced developer, the debugging terminology is familiar to you and VBA editor debugging options make your life simple. Even otherwise, it will not take much time to master this skill if you have learnt VBA and understand the code.

Excel Macros — Configuring a Macro

You can record a macro and save it with the name Auto_Open to run it whenever you open the workbook that contains this macro.

You can also write VBA code for the same purpose with the Open event of the workbook. The Open event runs the code in the sub procedure Workbook_Open () every time you open the workbook.

Recording an Auto_Open Macro

You can record an Auto_Run macro as follows −

  • Click the VIEW tab on the Ribbon.
  • Click Macros.
  • Click Record Macro. The Record Macro dialog box appears.
  • Type Auto_Run for the macro name.
  • Type a description and click OK.

Auto_open

  • Start recording the macro.
  • Stop Recording.
  • Save the workbook as macro enabled workbook.
  • Close the workbook.
  • Open the workbook. The macro Auto_Run will run automatically.

If you want Excel to start without running an Auto_Open macro, hold the SHIFT key when you start Excel.

Limitations of Auto_Open Macro

The following are the limitations of Auto_Open macro −

  • If the workbook in which you saved the Auto_Open macro contains code for workbook Open event, the code for the Open event will override the actions in the Auto_Open macro.

  • An Auto_Open macro is ignored when the workbook is opened by running code that uses the Open method.

  • An Auto_Open macro runs before any other workbooks open. Hence, if you record actions that you want Excel to perform on the default Book1 workbook or on a workbook that is loaded from the XLStart folder, the Auto_Open macro will fail when you restart Excel, because the macro runs before the default and startup workbooks open.

If you encounter any of these limitations, instead of recording an Auto_Open macro, you must write a code for the Open event as described in the next section.

VBA Code for Open Event of a Workbook

You can write code that will get executed when you open a workbook. VBA provides you with an event called open that incorporates a VBA procedure for the actions to be done on opening a workbook.

Open the workbook in which you stored the macro that you have written for the absolute references – Report_ProjectXYZ. When this macro is run, a new worksheet will be added in the workbook and the project report structure appears on the new worksheet.

You can write a macro code that will perform these actions when you open the workbook. That means when you open the Project Report workbook, a new worksheet with the report structure will be ready for you to enter the details.

Follow the below given procedure in VBA editor−

  • Double click on ThisWorkbook in Projects Explorer.

  • In the code window, select Workbook in the left dropdown list and Open in the right dropdown list. Sub Workbook_Open () appears.

Workbook_open

  • Click Modules in the Projects Explorer.

  • Double click on the module name that contains the macro code.

  • Copy the macro code from the module and paste it in the Sub WorkBook_Open ().

Sub Workbook_open

Save the macro-enabled workbook. Open it again. The macro runs and a new worksheet with the report structure is inserted.

Это продолжение перевода книги Зак Барресс и Кевин Джонс. Таблицы Excel: Полное руководство для создания, использования и автоматизации списков и таблиц (Excel Tables: A Complete Guide for Creating, Using and Automating Lists and Tables by Zack Barresse and Kevin Jones. Published by: Holy Macro! Books. First printing: July 2014. – 161 p.). Visual Basic for Applications (VBA) – это язык программирования, который можно использовать для расширения стандартных возможностей Excel. VBA позволяет автоматизировать сложные или повторяющиеся задачи. Например, VBA можно использовать для форматирования листа, получаемого ежедневно из внешнего источника, извлечения данных с веб-страницы раз в неделю или построения сложной пользовательской функции листа.

Предыдущая глава        Содержание    Следующая глава

Ris. 9.1. Redaktirovanie makrosov

Рис. 9.1. Редактирование макросов

Скачать заметку в формате Word или pdf

Вот некоторые примеры автоматизации Таблиц Excel:

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

Для работы с этой главой лучше всего, если у вас есть начальный уровень программирования, вы знакомы с объектной моделью и хотите расширить функциональность Таблиц Excel (см. Джон Уокенбах. Excel 2010. Профессиональное программирование на VBA). Среда VBA не русифицирована.

Один из самых простых способов начать работать с VBA – это использовать запись макросов. При этом действия, которые вы совершаете в Excel, записываются в среде VBA в виде инструкций. Не забудьте выключить запись макросов, когда автоматизированные действия будут завершены. Вы можете просматривать и редактировать код VBA, пройдя по меню Разработчик –> Макросы, выбрать имя макроса и нажать кнопку Изменить (рис. 9.1). Код, сгенерированный при записи макросов, не самый эффективный, и вы часто можете улучшить его с помощью редактирования.

Если вкладка Разработчик не видна, включите ее, пройдя по меню Файл –> Параметры –> Настроить ленту, и установив флажок на вкладке Разработчик.

VBA, Excel и объекты

Этот раздел можно пропустить, если у вас уже есть опыт работы с объектами в среде Excel VBA.

В среде VBA приложение Excel представляет объекты, к которым можно получить доступ, в виде объектной модели Excel. Основные объекты Excel:

  • Application – Приложение Excel.
  • Workbooks – коллекция всех книг, открытых в данный момент в приложении Excel. В общем случае коллекция – набор объектов. В этом случае коллекция Workbooks представляет собой набор отдельных объектов Workbook.
  • Workbook – одна книга.
  • Worksheets – коллекция всех листов в рабочей книге.
  • Worksheet – отдельный рабочий лист или вкладка в рабочей книге.
  • Cells – совокупность всех ячеек на листе.
  • Range – набор из одной или нескольких ячеек на одном листе. Клетки могут быть прерывистыми. Любая ссылка даже на одну ячейку является объектом Range.

Объекты имеют свойства. Каждый объект принадлежит родительскому объекту. Например, родителем объекта Workbook является объект Application, а родителем объекта Cell – объект Worksheet. Одним из исключений является объект Application, который не имеет родителя; это объект самого высокого уровня, доступный при просмотре объектной модели Excel. При описании контекста объекта или метода часто используются следующие термины:

  • Parent – родительский объект. Например, родительский объект для Cell – это Worksheet.
  • Member – член родительского объекта. Например, член объекта Worksheet – объект Cell. Член также может быть методом, который выполняет действие.

Когда вы ссылаетесь на объект, вы должны начать с самого высокого уровня. Чтобы найти каждый подчиненный объект, введите родительский объект, за которым следует точка, а затем дочерний элемент. Например, чтобы сослаться на значение ячейки A1 на листе Sheet1 в книге My Workbook.xlsx, используйте следующий синтаксис:

Application.Workbooks(«My Workbook.xlsm»).Worksheets(«Sheet1»).Cells(1,1).Value

Ссылки в VBA как правило используют синтаксис R1C1, а не А1.

Объектная модель Excel предоставляет объекты по умолчанию в зависимости от того, какой элемент приложения в данный момент активен. Например, следующий синтаксис ссылается на ячейку A1 на листе, активном в момент выполнения кода:

Хотя этот синтаксис работает, он не считается хорошей практикой. Мы рекомендуем использовать объект ActiveSheet, если вы действительно намеревались ссылаться на активный лист:

Application.ActiveSheet.Cells(1,1).Value

Единственный объект, который подразумевается во всей среде Excel VBA, – это объект Application, и его можно без проблем опустить. Поэтому следующие ссылки не являются неоднозначными в любом месте среды Excel VBA:

Workbooks(«My Workbook.xlsm»).Worksheets(«Sheet1»).Cells(1,1).Value

ActiveSheet.Cells(1,1).Value

Вы можете назначить ссылку на любой объект переменной, если эта переменная имеет тот же тип, что и объект, или определена как универсальный тип объекта. Основная причина для этого – удобство. Если вы ссылаетесь на объект повторно, то выделение переменной для ссылки на этот объект может привести к уменьшению объема кода, который будет легче читать и поддерживать. Например, вы можете назначить ссылку на Sheet1 переменной:

Dim TargetWorksheet As Worksheet

Set TargetWorksheet = Workbooks(«My Workbook.xlsm»).Worksheets(«Sheet1»)

Теперь ссылка на А1 может быть записана в виде:

TargetWorksheet.Cells(1,1).Value

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

Следует различать объекты, экземпляры объектов и ссылки на объекты. Объект включает в себя объектную модель (свойства и методы, которые ему принадлежат) и код, который управляет его поведением. Примером объекта является Worksheet. Экземпляр объекта является конкретным экземпляром этого объекта и включает в себя данные и значения свойств, связанные с этим экземпляром объекта. Листы Sheet1 и Sheet2 примеры экземпляров объектов. Переменная, ссылающаяся на объект, содержит ссылку на объект.

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

В дальнейшем описании мы используем следующие объекты:

  • ThisWorkbook – рабочая книга, в которой выполняется код. Это удобно, когда единственная книга, на которую ссылаются, является той, в которой находится код. С этой рабочей книгой работать легче, чем с рабочими книгами (My Workbook.xlsm), особенно когда имя рабочей книги может меняться.
  • Me – когда код находится в модуле кода листа, Me – это удобный способ ссылаться на объект листа, в котором находится код.

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

Объект ListObject

Excel использует объект ListObject для представления таблицы в объектной модели Excel. Он содержится в коллекции ListObjects, которая принадлежит объекту Worksheet. Используйте этот синтаксис для ссылки на Таблицу на листе:

ThisWorkbook.Worksheets(«Sheet1»).ListObjects(«Table1»)

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

Поскольку ListObjects – это набор таблиц, вы можете получить доступ к конкретной Таблице с помощью индекса:

ThisWorkbook.Worksheets(«Sheet1»).ListObjects(1)

Индекс (или позиция) объекта ListObject в коллекции ListObjects определяется порядком, в котором объекты ListObject были созданы на листе. Объект ListObject может быть назначен переменной, которая была определена как тип ListObject. Объект ListObject имеет ряд свойств и методов, используемых для доступа к таблицам и управления ими.

Свойства объекта Таблица

Пять свойств представляют собой основные части таблицы. Каждое из этих свойств является объектом диапазона Range. Два дополнительных свойства или коллекции предоставляют доступ к строкам и столбцам Таблицы. Каждая коллекция предоставляет доступ ко всем объектам ListRow и ListColumn в Таблице.

Свойство Range

Свойство Range возвращает всю таблицу, включая заголовок и итоговые строки. Тип объекта – Range. Свойство не может быть установлено.

Свойство HeaderRowRange

Свойство HeaderRowRange возвращает строку заголовка таблицы. Тип объекта – Range. Свойство не может быть установлено. Диапазон всегда представляет собой одну строку – строку заголовка – и распространяется на все столбцы таблицы. Если строка заголовка отключена, этому свойству присваивается значение Nothing.

Свойство DataBodyRange

Свойство DataBodyRange возвращает тело таблицы. Тип объекта – Range. Свойство не может быть установлено. Диапазон – это каждая строка между заголовком и общей строкой и распространяется на все столбцы таблицы. Если таблица не содержит строк, свойство DataBodyRange не возвращает Nothing (и ListRows.Count возвращает 0). Это единственный случай, когда свойство InsertRowRange возвращает объект диапазона, который можно использовать для вставки новой строки. В этом состоянии таблица выглядит как одна строка без каких-либо значений. Как только одна ячейка в таблице получает значение, InsertRowRange получает значение Nothing, а DataBodyRange – значение строк данных в таблице.

Свойство TotalRowRange

Свойство TotalRowRange возвращает итоговую строку Таблицы. Тип объекта – Range. Свойство не может быть установлено. Диапазон всегда представляет собой одну строку – строку итогов – и распространяется на все столбцы Таблицы. Если строка итогов отключена, это свойство имеет значение Nothing.

Свойство InsertRowRange

Свойство InsertRowRange возвращает текущую строку вставки Таблицы. Тип объекта – Range. Свойство не может быть установлено. В Excel 2007 и более поздних версиях InsertRowRange возвращает только первую строку данных и только тогда, когда таблица не содержит никаких данных. В противном случае он ничего не возвращает и фактически бесполезен.

Свойство ListRows

Свойство ListRows возвращает коллекцию всех строк в таблице DataBodyRange. Это тип объекта ListRows, который ведет себя очень похоже на объект Collection и содержит коллекцию объектов ListRow. Свойство не может быть установлено. На строки ссылаются по индексу, отсчитываемому от единицы (one-based index).[1] В пустой таблице нет строк. Метод Add объекта ListRows используется для вставки одной новой строки за один раз.

Свойство ListColumns

Свойство ListColumns возвращает коллекцию всех столбцов таблицы. Это тип объекта ListColumns, который ведет себя очень похоже на объект Collection и содержит коллекцию объектов ListColumn. Свойство не может быть установлено. На столбцы ссылается one-based. Таблица всегда содержит хотя бы один столбец.

Свойства структуры Таблиц

Таких свойств несколько. Все они являются членами объекта ListObject.

Свойство ShowAutoFilter возвращает или задает, включен ли Автофильтр. Свойство имеет логический тип. Если значение True, Автофильтр включен, False – отключен. Свойство представлено в пользовательском интерфейсе Excel, меню Данные –> Сортировка и фильтр –> Фильтр.

Свойство ShowAutoFilterDropDown возвращает или задает значение, указывающее отображается ли кнопка ниспадающего списка Автофильтра. Свойство имеет логический тип. Если значение True, кнопка отражается, False – не отражается. Если ShowAutoFilter имеет значение False, то свойство ShowAutoFilterDropDown изменить нельзя. Свойство представлено в пользовательском интерфейсе Excel, меню Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Кнопка фильтра.

Свойство ShowHeaders возвращает или задает, включена ли строка заголовка таблицы. Свойство имеет логический тип. Если значение True, строка заголовка таблицы включена, False – отключена. Свойство представлено в пользовательском интерфейсе Excel, меню Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Строка заголовков.

Свойство ShowTotals возвращает или задает включена ли строка итогов. Свойство имеет логический тип. Если значение True, строка итогов включена, False – отключена. Свойство представлено в пользовательском интерфейсе Excel, меню Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Строка итогов.

Свойства стилей Таблиц

Этих свойств также несколько. Все они являются членами объекта ListObject.

Свойство TableStyle возвращает или задает имя стиля таблицы. Свойство имеет тип Variant. Чтобы изменить стиль таблицы, необходимо задать имя нужного стиля. При назначении стиля таблицы к таблице применяются только элементы стиля, определенные в этом стиле (подробнее см. Глава 7. Форматирование Таблиц Excel). Чтобы определить имя стиля, наведите курсор мыши на нужный стиль в галерее стилей таблиц, пока Excel не отобразит имя этого стиля:

Ris. 9.2. Opredelenie imeni stilya tablitsy

Рис. 9.2. Определение имени стиля таблицы

Чтобы присвоить это имя свойству TableStyle, используйте код:

ActiveSheet.ListObjects(«qryCrosstab2»).TableStyle = «TableStyleLight21»

Здесь qryCrosstab2 – имя Таблицы. Внутренние имена всех встроенных стилей не содержат пробелов и английские, хотя имена, отображаемые на ленте, содержат пробелы и русифицированы. Чтобы узнать имя таблицы, которое нужно использовать в коде VBA, запустите запись макроса, присвойте стиль, завершите запись макроса, и посмотрите его код.

Свойство TableStyle представлено в пользовательском интерфейсе Excel в виде массива кнопок в группе Работа с таблицами –> Конструктор –> Стили таблиц.

Свойство ShowTableStyleColumnStripes возвращает или задает, форматируются ли нечетные столбцы таблицы иначе, чем четные столбцы. Свойство имеет логический тип. Если значение True, нечетные столбцы таблицы форматируются иначе, чем четные столбцы, как определено в заданном стиле таблицы. Нечетные столбцы форматируются с использованием параметров полосы первого столбца стиля таблицы, а четные строки форматируются с использованием параметров полосы второго столбца стиля таблицы. Если ShowTableStyleColumnStripes имеет значение False, столбцы таблицы не форматируются с использованием назначенного стиля таблицы. Свойство ShowTableStyleColumnStripes представлено в пользовательском интерфейсе Excel в виде флажка на ленте Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Чередующиеся столбцы.

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

Свойство ShowTableStyleRowStripes возвращает или задает, форматируются ли нечетные строки таблицы иначе, чем четные строки. Свойство имеет логический тип. Если значение True, нечетные строки таблицы форматируются иначе, чем четные строки, как определено в заданном стиле таблицы. Нечетные строки форматируются с использованием первой полосы строк стиля таблицы, а четные строки форматируются с использованием второй полосы строк стиля таблицы. Если свойству ShowTableStyleRowStripes присвоено значение False, строки таблицы не форматируются с использованием назначенного стиля таблицы. Это свойство эквивалентно флажку на ленте Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Чередующиеся строки.

Свойство ShowTableStyleFirstColumn возвращает или задает, выделяется ли первый столбец. Свойство имеет логический тип. Если значение True, первый столбец таблицы форматируется так, как определено в настройках первого столбца назначенного стиля таблицы. Если установлено значение False, первый столбец таблицы не форматируется в соответствии с заданным стилем таблицы. Это свойство представлено в пользовательском интерфейсе Excel в виде флажка на ленте Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Первый столбец.

Свойство ShowTableStyleLastColumn возвращает или задает, выделяется ли последний столбец. Свойство имеет логический тип. Если значение True, последний столбец таблицы форматируется так, как определено в настройках последнего столбца назначенного стиля таблицы. Если установлено значение False, последний столбец таблицы не форматируется в соответствии с заданным стилем таблицы. Это свойство представлено в пользовательском интерфейсе Excel в виде флажка на ленте Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Последний столбец.

Другие свойства объекта Таблицы

В следующих разделах рассматриваются свойства объекта таблицы для использования в VBA. Они отличаются от методов.

Свойство Active возвращает True, если активная ячейка находится в пределах таблицы, включая заголовок и итоговые строки; в противном случае оно возвращает False. Свойство имеет логический тип. Свойство не может быть установлено.

Свойство AlternativeText возвращает или задает замещающий текст таблицы. Свойство имеет строковый тип. Установка этого свойства перезаписывает любое предыдущее значение. Это свойство представлено в пользовательском интерфейсе Excel в диалоговом окне Замещающий текст, доступ к которому можно получить, щелкнув правой кнопкой мыши в любом месте таблицы и пройдя по меню Таблица –> Замещающий текст. Это свойство отображается и редактируется в текстовом поле Заголовок.

Ris. 9.3. Zameshhayushhij tekst

Рис. 9.3. Замещающий текст

Свойство AutoFilter – это объект AutoFilter со своими собственными свойствами и методами. Его можно использовать для проверки настроек Автофильтра и повторного применения или очистки настроек Автофильтра в таблице. Он не используется для установки фильтров; для этого используется метод AutoFilter объекта Range.

Свойство Comment возвращает или задает комментарий таблицы. Свойство имеет строковый тип. Это свойство, добавленное в Excel 2007, представлено в пользовательском интерфейсе Excel в диалоговом окне Диспетчер имен, доступ к которому можно получить, пройдя по меню Формулы –> Определенные имена –> Диспетчер имен. Комментарий (примечание) отображается в правом столбце, и вы можете изменить его, кликнув на кнопку Изменить (рис. 9.4). Напомним, поскольку все Таблицы именуются, их имена отражаются в окне Диспетчер имен.

Ris. 9.4. Dispetcher imen

Рис. 9.4. Диспетчер имен

Свойство DisplayName возвращает или задает имя таблицы. Свойство имеет строковый тип. При назначении имени применяются те же ограничения, что и при изменении имени таблицы в пользовательском интерфейсе Excel; например, оно не может дублировать иное имя и не может содержать пробелов. Это свойство, добавленное в Excel 2007, ведет себя почти так же, как и свойство Name, но при использовании свойства DisplayName присваиваемое имя должно соответствовать ограничениям на имя таблицы, иначе возникает ошибка. Это свойство представлено в пользовательском интерфейсе Excel в виде поля ввода текста Работа с таблицами –> Конструктор –> Свойства –> Имя таблицы.

Свойство Name возвращает или задает имя таблицы. Свойство имеет строковый тип. В отличие от свойства DisplayName, когда вы присваиваете значение свойству Name, Excel изменяет имя так, чтобы оно соответствовало правилам имени таблицы. Например, он меняет пробелы на подчеркивания и, если имя уже существует, добавляет к нему символ подчеркивания, за которым следует число. Это свойство представлено в пользовательском интерфейсе Excel в виде поля ввода текста Работа с таблицами –> Конструктор –> Свойства –> Имя таблицы.

Чтобы избежать проблем, используйте свойство DisplayName вместо свойства Name для присвоения имени таблице. Свойство DisplayName создает ошибку, если имя является незаконным или уже определено в другом месте. С другой стороны, Excel будет искажать значение, присвоенное свойству Name, чтобы сделать его законным, и таким образом имя может оказаться не совсем тем, что вы намеревались.

Свойство Parent возвращает родителя таблицы. Свойство имеет тип объекта и всегда возвращает Worksheet. Свойство не может быть установлено.

Свойство QueryTable возвращает объект QueryTable, который ссылается на сервер списков. Это тип объекта QueryTable. Свойство не может быть установлено. Объект QueryTable предоставляет свойства и методы, позволяющие управлять таблицей. Следующий код публикует Таблицу на сервере SharePoint и называет опубликованный список Register. Затем он восстанавливает объект QueryTable для таблицы и устанавливает свойству MaintainConnection Таблицы значение True:

Dim Table As ListObject

Dim QueryTable As QueryTable

Dim PublishTarget(4) As String

Dim ConnectionString As String

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

PublishTarget(0) = «0»

PublishTarget(1) = «http://myserver/myproject»

PublishTarget(2) = «1»

PublishTarget(3) = «Register»

ConnectionString = Table.Publish(PublishTarget, True)

Set QueryTable = Table.QueryTable QueryTable.MaintainConnection = True

Свойство SharePointURL возвращает URL-адрес списка SharePoint. Свойство имеет строковый тип. Это свойство устанавливается при создании или обслуживании подключения к SharePoint и не может быть изменено. Это свойство представлено в пользовательском интерфейсе Excel в виде кнопки Работа с таблицами –> Конструктор –> Данные из внешней таблицы –> Экспорт –>  Экспорт таблицы в список SharePoint. Следующий код публикует существующую таблицу на сервере SharePoint с помощью SharePointURL и называет опубликованный список Register:

Dim Table As ListObject

Dim QueryTable As QueryTable

Dim PublishTarget(4) As String

Dim ConnectionString As String

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

PublishTarget(0) = «0»

PublishTarget(1) = Table.SharePointURL PublishTarget(2) = «1»

PublishTarget(3) = «Register»

ConnectionString = Table.Publish(PublishTarget, True)

Свойство Slicers возвращает коллекцию срезов, связанных с таблицей. Свойство имеет тип Slicers, который ведет себя очень похоже на объект Collection и содержит коллекцию объектов Slicer. Свойство не может быть установлено. Объект Slicers используется для добавления, управления и удаления срезов, связанных с таблицей. Каждый объект среза предоставляет свойства и методы, которые позволяют управлять срезом. Свойства срезов была добавлена в объект ListObject в Excel 2013.

В следующем примере срез добавляется и помещается на том же листе, что и Таблица. Чтобы добавить срез сначала нужно создать объект SlicerCache для каждого среза:

Dim Table As ListObject

Dim SlicerCache As SlicerCache

Dim Slicer As Slicer

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set SlicerCache = ThisWorkbook.SlicerCaches.Add(Table, «Category»)

SlicerCache.RequireManualUpdate = False

Set Slicer = SlicerCache.Slicers.Add(Table.Parent, , _

   «tblRegisterCategory», «Category», 100, 400)

Объект SlicerCache привязан к таблице и фильтруемому столбцу. Сам срез является визуальным представлением кэша среза и имеет родителя, имя, заголовок и позицию; он также имеет размер, но в приведенном выше примере используется размер по умолчанию. Свойство RequireManualUpdate объекта SlicerCache имеет значение False, чтобы избежать появления в срезе сообщения Устарело.

Следующий срез настроен на отображение категории Расходы (Expense) и скрытие категории Доходы (Income):

Dim Table As ListObject

Dim Slicer As Slicer

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set Slicer = Table.Slicers(«tblRegisterCategory»)

With Slicer.SlicerCache

   .SlicerItems(«Expense»).Selected = True

   .SlicerItems(«Income»).Selected = False

End With

Следующий срез настроен для отображения только одной категории:

Dim Table As ListObject

Dim Slicer As Slicer

Dim SlicerItem As SlicerItem

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set Slicer = Table.Slicers(«tblRegisterCategory»)

With Slicer.SlicerCache

   .ClearManualFilter

   For Each SlicerItem In .SlicerItems

      If SlicerItem.Name <> «Expense» Then

         SlicerItem.Selected = False

      End If

   Next SlicerItem

End Wit

В следующем примере происходит очистка фильтр среза:

Dim Table As ListObject

Dim Slicer As Slicer

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set Slicer = Table.Slicers(«tblRegisterCategory»)

Slicer.SlicerCache.ClearManualFilter

В следующем примере срез удаляется. Обратите внимание, что кэш среза также удаляется:

Dim Table As ListObject

Dim Slicer As Slicer

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set Slicer = Table.Slicers(«tblRegisterCategory»)

Slicer.Delete

Table.ShowAutoFilter = False

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

Свойство Sort возвращает объект сортировки таблицы. Свойство имеет тип Sort object. Свойство не может быть установлено. В следующем примере Таблица сортируется по дате и описанию:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

With Table

   .Sort.SortFields.Add .ListColumns(«Date»).DataBodyRange,_

      xlSortOnValues, xlAscending

   .Sort.SortFields.Add .ListColumns(«Description»)._

      DataBodyRange, xlSortOnValues, xlAscending

   .Sort.Apply

   .Sort.SortFields.Clear

End With

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

Свойство SourceType возвращает текущий источник таблицы. Свойство имеет тип XlListObjectSourceType. Свойство не может быть установлено. Свойство может принимать следующие константы:

  • xlSrcExternal или 0 – источник является внешним источником данных, таким как сайт Microsoft SharePoint.
  • xlSrcModel или 4 – источником является модель Power Pivot.
  • xlSrcQuery или 3 – источником является запрос Power Query.
  • xlSrcRange или 1 – источником является объект Range.
  • xlSrcXml или 2 – источником является XML.

Свойство Summary возвращает или задает текст, используемый для замещающего текста при публикации таблицы. Свойство имеет строковый тип, введенный в Excel 2010. Установка этого свойства перезаписывает любое предыдущее значение. Это свойство представлено в пользовательском интерфейсе Excel в диалоговом окне Замещающий текст, доступ к которому можно получить, щелкнув правой кнопкой мыши в любом месте Таблицы и выбрав Таблица –> Замещающий текст (см. рис. 9.3). Это свойство отображается и редактируется в текстовом поле Описание.

Свойство TableObject возвращает объект TableObject Таблицы. Свойство имеет тип объекта TableObject. Свойство не может быть установлено. Объект TableObject предоставляет свойства и методы, позволяющие управлять объектами таблицы. TableObject – это объект, построенный на основе данных, полученных из модели Power Pivot. Он был введен в Excel 2013.

Свойство XmlMap возвращает объект XmlMap Таблицы, который предоставляет карту XML Таблицы. Свойство имеет тип объекта XmlMap. Объект XmlMap предоставляет свойства и методы, позволяющие управлять XML-картой. Свойство не может быть установлено.

Другие свойства Таблиц

Свойство ListColumn – это элемент в свойстве или коллекции ListColumns. ListColumn – это объект с рядом полезных свойств, включая следующие:

  • Range – ссылки на ячейки в столбце, включая заголовок и итоговые строки, если они включены.
  • DataBodyRange – тип объекта Range, который ссылается на столбец, исключая строки заголовка и итогов. Это пересечение диапазонов, представленных свойством Range объекта ListObject и диапазоном DataBodyRange объекта ListObject.
  • Index – относительный номер индекса столбца, представленного объектом ListColumn.
  • Parent – объект ListObject, которому принадлежит столбец.

ListColumn также включает метод Delete – удаляет столбец из Таблицы.

Каждый объект ListRow в коллекции строк имеет три часто используемых свойства: Range, которое ссылается на ячейки в этой строке; Index, которое является относительным номером индекса этой строки, и Parent, которое ссылается на объект ListObject, содержащий строку. Объект ListRow также имеет один метод Delete, который удаляет строку из таблицы.

Методы объекта Таблицы

Метод Delete удаляет Таблицу, включая все ее значения, формулы и форматирование. Не путайте этот метод с методом Unlist, который преобразует таблицу в обычный диапазон ячеек.

Метод ExportToVisio экспортирует и открывает в Visio динамическую сводную диаграмму в новом документе. Этот метод был добавлен в Excel 2007. Ошибка возникает, если Visio не установлен у вас на ПК (см. также Глава 3. Работа с таблицами Excel).

Метод Publish публикует таблицу в службе SharePoint. Он возвращает URL-адрес опубликованного списка в SharePoint в виде строки:

expression.Publish(Target, LinkSource)

где: expression – переменная, представляющая объект ListObject; Target – одномерный массив типа Variant, содержащий два или три элемента: URL-адрес SharePoint server, отображаемое имя списка и, при необходимости, описание списка; LinkSource – логическое значение. Если оно равно True, создает новую ссылку на новый список SharePoint. Если False, хранит ссылку на текущий список SharePoint и заменяет этот список, или, если нет никакого текущего списка, создает новый список на SharePoint без ссылок на него.

Метод Refresh обновляет таблицу из внешнего источника, если Таблица имеет такую связь. Если Таблица не связана с внешним источником данных, возвращает ошибку. Все изменения, внесенные в таблицу после последнего обновления, будут потеряны.

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

Метод Unlink удаляет любую внешнюю ссылку на данные, если она существует.

Метод Unlist преобразует Таблицу в обычный диапазон ячеек. В интерфейсе Excel это эквивалентно команде Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Инструменты –> Преобразовать в диапазон.

Другие методы

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

expression.Add(SourceType, Source, LinkSource, _

   XlListObjectHasHeaders, Destination, TableStyleName)

где:

  • expression – переменная, представляющая объект ListObjects,
  • SourceType – передает константу XlListObjectSourceType, которая определяет тип источника, используемого для создания Таблицы. Необязательный параметр. Если опущен, предполагается xlSrcRange.
  • Source – если SourceType = xlSrcRange, то передайте объект Range, представляющий диапазон значений данных для преобразования в Таблицу. Необязательный параметр. Если опущен, используется текущий выбор. Если SourceType = xlSrcExternal, передайте массив строковых значений, указывающих соединение с источником, где элементы массива: 0 – URL-адрес сайта SharePoint, 1 – имя списка SharePoint, 2 – код представления GUID (уникальный шестнадцатеричный идентификатор представления),
  • LinkSource – логическое значение, указывающее, должен ли внешний источник данных быть связан с объектом ListObject. Если SourceType имеет значение xlSrcExternal, то значение по умолчанию равно True, и этот параметр не требуется передавать. Если значение передается и SourceType является xlSrcRange, генерируется ошибка.
  • XlListObjectHasHeaders – передает тип константы xlYesNoGuess, которая может принимать три значения: xlYes, xlNo или xlGuess. Константа указывает, имеют ли импортируемые данные метки столбцов. Если источник не содержит заголовков, Excel автоматически создает заголовки. Необязательный параметр. Если опущено, значение по умолчанию = xlGuess. Имя этого параметра должно было быть HasHeaders, но, когда метод был реализован, разработчики ошибочно использовали XlListObjectHasHeaders.
  • Destination – передает объект Range, который указывает ссылку на одну ячейку в качестве назначения для верхнего левого угла Таблицы. Ошибка генерируется, если диапазон относится к нескольким ячейкам. Этот параметр должен быть указан, если SourceType = xlSrcExternal. Он игнорируется, если SourceType имеет значение xlSrcRange. Диапазон назначения должен находиться на листе, содержащем коллекцию ListObjects, указанную в expression. Столбцы вставляются перед целевым диапазоном, чтобы соответствовать новому списку, предотвращая перезапись существующих данных. Необязательный параметр.
  • TableStyleName – передает имя стиля, который будет применен к Таблице. Необязательный параметр. Если опущен, применяется стиль по умолчанию.

Метод Add объекта ListRows вставляет одну новую строку в таблицу в указанной позиции. Вот синтаксис этого метода:

expression.Add(Position, AlwaysInsert)

где:

  • expression – переменная, представляющая объект ListRows.
  • Position – целое число, определяющее относительное положение новой строки. Новая строка вставляется над текущей строкой в этой позиции. Необязательный параметр. Если опущен, новая строка добавляется в нижнюю часть Таблицы.
  • AlwaysInsert – логическое значение, указывающее, следует ли всегда сдвигать данные в ячейках под последней строкой таблицы при вставке новой строки, независимо от того, является ли строка под таблицей пустой. При значении True ячейки под таблицей сдвигаются на одну строку вниз. При значении False, если строка под Таблицей пуста, Таблица расширяется, чтобы занять (добавить) эту строку без сдвига ячеек под ней; если строка под Таблицей содержит данные, эти ячейки сдвигаются вниз при вставке новой строки.

Метод Add возвращает объект ListRow, представляющий новую строку.

Метод Delete объекта ListRow удаляет строку Таблицы, представленную объектом ListRow.

Метод Add объекта ListColumns вставляет один новый столбец в Таблицу в указанной позиции:

  • expression – переменная, представляющая объект ListColumns.
  • Position – целое число, определяющее относительное положение нового столбца. Новый столбец вставляется перед текущим столбцом в этой позиции. Необязательный параметр. Если этот параметр опущен, новый столбец добавляется в правую часть Таблицы.

Этот метод возвращает объект ListColumn, представляющий новый столбец.

Метод Delete объекта ListColumn удаляет столбец Таблицы, представленный объектом ListColumn.

Метод Автофильтр объекта Range

Метод позволяет создать критерии Автофильтра для столбца, очистить критерии Автофильтра или переключить статус Автофильтра:

expression.AutoFilter(Field, Criteria1, Operator, _

   Criteria2, VisibleDropDown)

где:

  • expression – выражение, возвращающее объект Range.
  • Field – целочисленное смещение поля, на котором будет основан фильтр, где крайнее левое поле = 1. Необязательный параметр. Если опущен, то состояние Автофильтра (включено/выключено) переключается для всего диапазона. Отключение Автофильтра удаляет раскрывающиеся элементы управления Автофильтра.
  • Criteria1 – критерий в виде числа, строки или массива, например, 20 или "Расход". Можно использовать знаки равенства = и неравенства <>. Чтобы найти несколько строк, используйте функцию Array со значением оператора xlFilterValues, например, Array("Значение 1", "Значение 2"). Подстановочные знаки * (один или несколько символов) и ? (можно использовать любой отдельный символ). Если оператор xlTop10Items, то Criteria1 задает число элементов, например 10. Когда оператор xlFilterDynamic, Criteria1 – это константа xlDynamicFilterCriteria (описана ниже). Необязательный параметр. Если опущен, критерии для столбца очищаются.
  • Operator – передает константу XlAutoFilterOperator, определяющую тип фильтра. Необязательный параметр. Если опущен, то принимается равным 0, и Crtiteria1 рассматривается как простое значение для поиска; в этом случае, если в Crtiteria1 передается массив значений, то используется только последнее значение. Если этот параметр опущен, а Crtiteria1 не указан, то Автофильтр для указанного столбца будет очищен.
  • Criteria2 – второй критерий в виде числа, строки или массива. Он используется с Crtiteria1 и Operator для построения составных критериев или когда Operator = xlFilterValues, а фильтруются дата и время (описано ниже). Необязательный параметр.
  • VisibleDropDown – передает True, чтобы отобразить стрелку раскрывающегося списка Автофильтра для отфильтрованного поля, и False, чтобы скрыть раскрывающийся список Автофильтра для отфильтрованного поля. Необязательный параметр. Если опущен, принимает значение True.

Если заданы критерии фильтрации, то возвращаемое значение является значением Field. При переключении статуса Автофильтра возвращается значение True.

Значения констант оператора XlAutoFilterOperator:

  • xIAnd или 1 – фильтры с логическим И для Criteria1 and Criteria Оба критерия являются строками, задающими условия, например, ">0" и "<100".
  • xlBottom10Items или 4 – находит отображаемые элементы с наименьшим значением, где число элементов задается как число или строка в Criteria1, например, 5 или "5", то есть пять наименьших элементов. Столбец, указанный в параметре Field, должен содержать хотя бы одно число, иначе произойдет ошибка.
  • xlBottom10Percent или 6 – найти отображаемые элементы с наименьшим значением, где процент указан как число или строка в Criteria1, например, 20 или "20" для элементов в нижних 20%. Столбец, указанный в параметре Field, должен содержать хотя бы одно число, иначе произойдет ошибка.
  • xlFilterCellColor или 8 – находит цвет ячейки, где цвет указан как значение RGB в Criteria
  • xlFilterDynamic или 11 – динамический фильтр, где критерий фильтра задается как значение XlDynamicFilterCriteria в Criteria Динамический фильтр – это фильтр, изменяющийся в зависимости от какого-либо другого значения, например сегодняшней даты или среднего значения в столбце.
  • xlFilterFontColor или 9 – находит цвет шрифта, где цвет указан как значение RGB в Criteria
  • xlFilterIcon или 10 – находит значок, указанный в Criteria Значки извлекаются из свойства ActiveWorkbookIconSets. Свойство IconSets представляет собой набор объектов IconSets, в котором каждый набор иконок представляет собой набор из ряда иконок, таких как набор "3 стрелки (цветные)" или "3 Arrows (Colored)". В приведенном ниже примере извлекается первый значок в наборе "3 стрелки (цветные)":

ActiveWorkbook.IconSets(xlIconSet.xl3Arrows).Item(1)

Обратите внимание, что при вводе в редакторе VBA "xlIconSet." (включая точку) появится всплывающий список IntelliSense со всеми доступными ссылками на набор значков.

  • xlFilterValues или 7 – находит несколько значений, заданных в виде массива в Criteria1 или Criteria Значения в массиве должны быть строковыми и точно соответствовать отображаемому значению, если оно числовое; например, если соответствующие значения отображаются как "$25.00", передаваемое значение должно быть"$25.00". Criteria2 используется при поиске дат и времени. При поиске дат и времен массив передается как массив пар значений, где первое значение каждой пары является типом поиска, а второе –датой. Типы поиска: 0 – находит элементы в том же году, что и следующее значение даты / времени; 1 – находит элементы в том же месяце, что и следующее значение даты / времени; 2 – находит элементы на ту же дату, что и следующее значение даты / времени; 3 – находит элементы в тот же час, что и следующее значение даты / времени; 4 – находит элементы в ту же минуту, что и следующее значение даты / времени; 5 – находит элементы в ту же секунду, что и следующее значение даты / времени.

Может быть передано любое количество пар типа поиска и значения даты / времени. Все значения типа поиска должны находиться в нечетных позициях в массиве (1, 3, 5 и т.д.), а все значения даты/времени должны быть в четных позициях (2, 4, 6 и т.д.). Любое значение, переданное для типа поиска, которого нет в приведенном выше списке, создает ошибку. Любое значение, переданное для значения даты/времени, которое не является значением даты/времени, создает ошибку. Допустимо любое значение даты/времени, которое может быть введено в ячейку и распознано как дата. Некоторые примеры значений Criteria2:

Показать все элементы в 2014 году: Array(0, "1/1/2014")

Показать все элементы в 2014 году, когда текущий год 2014: Array(0, "1/1")

Показать все элементы в январе 2014 года: Array(1, "1/1/2014")

Показать все элементы 15 января 2014 года: Array(2, "15/1/2014")

Показывать все элементы 15, 20 и 25 января 2014 года: Array(2, "15/1/2014", 2, "20/1/2014", 2, "25/1/2014")

Показать все элементы в 2013 году и в январе 2014 года: Array(0, "1/1/2013", 1, "1/1/2014")

Показать все элементы в в 3 часа дня 15 января 2014 года: Array(3, "15/1/2014 15:00") или Array(3, "15/1/2014 3 PM")

Показать все элементы в 15:01 15 января 2014 года: Array (3, "15/1/2014 15:01") или Array(3, "15/1/2014 3:01 PM")

  • xlOr или 2 – логическим ИЛИ для Criteria1 and Criteria Оба критерия – это строки, задающие условие, например "<0" и ">100" для значений меньше нуля или больше 100.
  • xlTop10Items или 3 – находит отображаемые элементы с наибольшим значением, где число элементов задается как число или строка в Criteria1, например 5 или "5", то есть пять самых больших элементов. Столбец, указанный в параметре Field, должен содержать хотя бы одно число, иначе произойдет ошибка.
  • xlTop10Percent или 5 – находит отображаемые элементы с наибольшим значением, где процент указан как число или строка в Criteria1, например 20 или "20" для элементов в верхних 20%. Столбец, указанный в параметре Field, должен содержать хотя бы одно число, иначе произойдет ошибка.

Значения констант оператора XlDynamicFilterCriteria:

  • xlFilterToday – фильтрует все значения дат, равные сегодняшнему дню.
  • xlFilterYesterday – фильтрует все значения дат, равные вчерашнему дню.
  • xlFilterTomorrow – фильтрует все значения дат, равные завтрашнему дню.
  • xlFilterThisWeek – фильтрует все значения дат на текущей неделе.
  • xlFilterLastWeek – фильтрует все значения дат за предыдущую неделю.
  • xlFilterNextWeek – фильтрует все значения дат на следующей неделе.
  • xlFilterThisMonth – фильтрует все значения дат в текущем месяце.
  • xlFilterLastMonth – фильтрует все значения дат за предыдущий месяц.
  • xlFilterNextMonth – фильтрует все значения дат в следующем месяце.
  • xlFilterThisQuarter – фильтрует все значения дат в текущем квартале.
  • xlFilterLastQuarter – фильтрует все значения дат в предыдущем квартале.
  • xlFilterNextQuarter – фильтрует все значения дат в следующем квартале.
  • xlFilterThisYear – фильтрует все значения дат в текущем году.
  • xlFilterLastYear – фильтрует все значения дат за предыдущий год.
  • xlFilterNextYear – фильтрует все значения, относящиеся к следующему году.
  • xlFilterYearToDate – фильтрует все значения дат с начала года по сегодня.
  • xlFMterAMDatesInPeriodQuarterl – фильтрует все значения дат в квартале
  • xlFMterAMDatesInPeriodQuarter2 – фильтрует все значения дат в квартале 2.
  • xlFMterAMDatesInPeriodQuarter3 – фильтрует все значения дат в квартале 3.
  • xlFilterAllDatesInPeriodQuarter4 – фильтрует все значения дат в квартале 4.
  • xlFilterAllDatesInPeriodJanuary – фильтрует все значения дат в январе.
  • xlFilterANDatesInPeriodFebruary – фильтрует все значения дат в феврале.
  • xlFilterAllDatesInPeriodMarch – фильтрует все значения дат в марте.
  • xlFilterAllDatesInPeriodApril – фильтрует все значения дат в апреле.
  • xlFilterAllDatesInPeriodMay – фильтрует все значения дат в мае.
  • xlFilterAllDatesInPeriodJune – фильтрует все значения дат в июне.
  • xlFilterAllDatesInPeriodJuly – фильтрует все значения дат в июле.
  • xlFilterAllDatesInPeriodAugust – фильтрует все значения дат в августе.
  • xlFilterAllDatesInPeriodSeptember – фильтрует все значения дат в сентябре.
  • xlFilterAllDatesInPeriodOctober – фильтрует все значения дат в октябре.
  • xlFilterAllDatesInPeriodNovember – фильтрует все значения дат в ноябре.
  • xlFilterAllDatesInPeriodDecember – фильтрует все значения дат в декабре.
  • xlFilterAboveAverage – фильтрует все значения выше среднего.
  • xlFilterBelowAverage – фильтрует все значения ниже среднего.

Доступ к элементам Таблицы

Хотя свойства ListObject, ListColumns, ListRows предоставляют доступ к основным частям таблицы, существуют и другие способы доступа к элементам таблицы с использованием синтаксиса структурированных ссылок, описанного в главе 4. Эти способы могут быть более удобными, в зависимости от стиля программирования и предпочтений. В приведенных ниже примерах предполагается, что есть Таблица с именем "tblRegister" на листе с именем "Register" с заголовками столбцов "Date", "Description", "Category" и "Amount":

Ris. 9.5. Tablitsa

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

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

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

ThisWorkbook.Worksheets(«Register»).Range(«tblRegister[Date]»)

Application.Range(«tblRegister[Date]»)

Range(«tblRegister[Date]»)

[tblRegister[Date]]

Чтобы соответствовать этому правилу, Excel требует, чтобы каждая Таблица в книге имела уникальное имя. Это правило управляет всеми глобальными именами, а не только именами Таблиц.

Чтобы уменьшить вероятность коллизии имен, можно предварить все имена таблиц общим префиксом, часто называемым «венгерской нотацией», описанной в главе 2, например, "tbl".

Excel 2003 не поддерживает структурированные ссылки. Существуют также некоторые различия между Excel 2007, 2010 и 2013 с точки зрения поддержки структурированных ссылок.

Создание и присвоение имени Таблице

Таблицы создаются с помощью метода Add объекта ListObjects. После создания новой Таблицы свойству DisplayName объекта ListObject присваивается имя новой Таблицы. Имя Таблицы, присваиваемое по умолчанию, зависит от источника Таблицы: xlSrcRange (диапазон данных на листе), xlSrcExternal (внешний источник данных), xlSrcModel (модель данных Power Pivot) и xlSrcQuery (запрос). Тип источника xlSrcXml (источник XML) не рассматривается, но показаны обходные пути.

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

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

Dim TableRange As Range

Dim Table As ListObject

Set TableRange = ThisWorkbook.Worksheets(«Register»). _

   Range(«A1»).CurrentRegion

Set Table = ThisWorkbook.Worksheets(«Register»). _

   ListObjects.Add(xlSrcRange, TableRange, ,xlYes)

Table.DisplayName = «tblRegister»

Обратите внимание, что четвертый параметр, xlYes, сообщает Excel, что список данных уже содержит заголовки. В этом примере Таблица будет названа сразу же после ее создания; это поможет вам найти объект ListObject позже.

Использование модели данных Power Pivot

В этом примере для создания соединения с базой данных SQL Server используется объект TableObject. Таблица SQL "Product" добавляется в модель данных Power Pivot. Таблица помещается на рабочий лист "Sheet1" в ячейку A1. Поскольку взаимодействие происходит с моделью данных, то вместо объекта ListObject с xlSrcModel, переданного для SourceType, должен использоваться объект TableObject. Измените текст "YourServerName" на имя нужного SQL-сервера. Используется база данных AdventureWorks2012:

Dim SQLConnection As WorkbookConnection

Dim TargetWorksheet As Worksheet

Dim Table As TableObject

Dim ConnectionString As String

Set TargetWorksheet = ThisWorkbook.Worksheets(«Sheet1»)

ConnectionString = «OLEDB;Provider=SQLOLEDB.1; _

   Integrated Security=SSPI;» & «Initial Catalog _

   =AdventureWorks2012;Data Source=YourServerName»

Set SQLConnection = ActiveWorkbook.Connections.Add2(«FriendlyName», _

   «Description», ConnectionString, «Product», 3, True)

With TargetWorksheet

   Set Table = .ListObjects.Add(SourceType:=xlSrcModel, _

   Source:=SQLConnection, Destination:=.Range(«A1»)).NewTable

End With

Table.ListObject.DisplayName = «tblNewTable»

Константа xlSrcModel была добавлена в Excel 2013.

В следующем примере предполагается, что книга уже имеет соединение SQL Server с Таблицей в модели данных Power Pivot, и задача состоит в том, чтобы извлечь данные из таблицы модели данных в новую Таблицу Excel. Тип источника – xlSrcModel, и предполагается, что имя Таблицы модели данных – "Product". Этот пример работает только в Excel 2013:

Dim ModelSource As Model

Dim SourceTable As ModelTable

Dim TargetWorksheet As Worksheet

Dim Table As TableObject

Set TargetWorksheet = ThisWorkbook.Worksheets(«Sheet1»)

Set ModelSource = ThisWorkbook.Model

Set SourceTable = ModelSource.ModelTables(«Product»)

Set Table = TargetWorksheet.ListObjects.Add(SourceType:=xlSrcModel, _

   Source:=SourceTable.SourceWorkbookConnection, _

   LinkSource:=True, Destination:=DestinationSheet.Range(«A1»)).TableObject

Table.Refresh

Использование запроса Power Query

В этом примере объект QueryTable используется для создания соединения с базой данных SQL Server. Таблица "Product" добавляется на лист "Sheet1" в ячейку А1. Измените текст "YourServerName" на имя нужного SQL-сервера. Используется база данных AdventureWorks2012:

Dim TargetWorksheet As Worksheet

Dim Table As QueryTable

Dim ConnectionString As String

Set TargetWorksheet = ThisWorkbook.Worksheets(«Sheet1»)

ConnectionString = «OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;» _

   & «Initial Catalog=AdventureWorks2012;Data Source=YourServerName»

Set Table = TargetWorksheet.ListObjects.Add(SourceType:=xlSrcExternal, _

   Source:=ConnectionString, LinkSource:=True, _

   Destination:=DestinationSheet.Range(«A1»)).QueryTable

Table.CommandText = Array(«»«AdventureWorks2012»«.»«Production»«.»«Product»«»)

Table.CommandType = xlCmdTable

Table.Refresh BackgroundQuery:=False

Table.ListObject.DisplayName = «tblNewTable»

Константа xlSrcQuery была добавлена в Excel 2007.

При использовании xlSrcExternal необходимо указать параметр назначения. При использовании объекта QueryTable необходимо задать свойства CommandText и CommandType перед обновлением соединения.

В этом примере используется тип источника xlSrcExternal, который используется для любого внешнего подключения к данным. Передача xlSrcQuery для параметра SourceType приводит к тому же результату. Как правило, xlSrcQuery используется для подключения к базе данных, а xlSrcExternal используется для подключения к SharePoint.

Использование источника XML

По замыслу, метод Add объекта ListObjects с типом источника xlSrcXml должен создать объект ListObject, используя в качестве источника XML-файл. Однако этот метод ненадежен, и нет известных рабочих примеров его использования. Для импорта исходного файла XML в Таблицу рекомендуется использовать два метода. Во-первых, необходимо импортировать XML-файл в новую пустую книгу:

Workbooks.OpenXML Filename:=«C:XML File Name.xml», _

   LoadOption:=xlXmlLoadImportToList

Во-вторых, необходимо импортировать XML-файл в существующий лист в указанном диапазоне.:

ActiveWorkbook.XmlImport URL:=«C:XML File Name.xml», _

   ImportMap:=Nothing, Overwrite:=True, _

   Destination:=Range(«A1»)

В этих примерах, если указанный источник XML не ссылается на схему, Excel создает ее на основе того, что он найдет в указанном XML-файле.

Информация о Таблице

В следующих примерах предполагается, что DataBodyRange является допустимым объектом диапазона. Если в Таблице нет существующих строк (то есть если ListRows.Count равно 0), любая ссылка на DataBodyRange вернет ошибку.

Определение того, существует ли таблица

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

Dim Table As ListObject

Set Table = Nothing

On Error Resume Next

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

On Error GoTo 0

If Table Is Nothing Then

   Debug.Print «Table does not exist»

Else

   Debug.Print «Table exists»

End If

Зачем устанавливать объектную переменную равную Nothing, прежде чем пытаться присвоить ей значение? В приведенном выше случае это не обязательно, поскольку VBA инициализирует каждую переменную, когда она определена с помощью оператора Dim. Но он включен выше в качестве примера написания надежного кода, потому что, если возникает ошибка, переменная не трогается и, если она уже содержит ссылку на другой объект, следующий тест не даст желаемого результата.

Определение адреса таблицы

В следующем примере выводится адрес Таблицы и адрес DataBodyRange Таблицы:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Debug.Print «Table’s address: « & Table.Range.Address

Debug.Print «Table’s data body range address: « _

   & Table.DataBodyRange.Address

Определение количества строк

Количество строк в таблице определяется с помощью свойства Count объекта ListRows:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Debug.Print «Number of rows: « & Table.ListRows.Count

Свойство Count возвращает 0, если таблица пуста (то есть имеет одну строку, готовую для ввода данных, и нет данных ни в одной ячейке).

Определение количества столбцов

Количество столбцов в таблице определяется с помощью свойства Count объекта ListColumns:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Debug.Print «Number of columns: « & Table.ListColumns.Count

Определение того, существует ли столбец

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

Dim Table As ListObject

Dim ListColumn As ListColumn

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set ListColumn = Nothing

On Error Resume Next

Set ListColumn = Table.ListColumns(«Description»)

On Error GoTo 0

If ListColumn Is Nothing Then

   Debug.Print «Column does not exist»

Else

   Debug.Print «Column exists»

End If

Добавление строк

Существует несколько способов добавления новых строк в Таблицу. Если вы добавляете одну строку, используйте метод Add объекта ListRows. Он возвращает объект ListRow, который затем можно использовать для добавления значений в эту новую строку:

Dim Table As ListObject

Dim NewRow As ListRow

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set NewRow = Table.ListRows.Add

With NewRow.Range

   .Columns(1).Value = #1/1/2015#

   .Columns(2).Value = «Transaction 20»

   .Columns(3).Value = «Expense»

   .Columns(4).Value = 75

End With

Обратите внимание, что в этом примере параметр Position не был передан методу Add, что привело к добавлению новой строки в конец таблицы. Чтобы вставить новую строку в определенную позицию таблицы, используйте параметр Position.

Чтобы добавить более одной строки в нижнюю часть таблицы, удобнее добавлять строки за один шаг, чем вызывать метод Add объекта ListRows несколько раз. В следующем примере строка итогов отключена, новые данные копируются в пустые ячейки непосредственно под Таблицей, после чего строка итогов включается. (Если функция TotalRow не отключена, Таблица не распознает новые строки и поэтому не расширяется для их включения.) Новые данные копируются из диапазона A2:D11 на листе Data:

Dim Table As ListObject

Dim NewValues As Variant

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

NewValues = ThisWorkbook.Worksheets(«Data»).Range(«A2:D11»).Value

Table.ShowTotals = False

With Table.DataBodyRange

   .Resize(10).Offset(.Rows.Count).Value = NewValues

End With

Table.ShowTotals = True

Чтобы вставить несколько строк в середину таблицы, используйте метод Insert объекта Range для вставки пустых ячеек, а затем эти ячейки заполняются новыми данными. В следующем примере 10 строк данных вставляются после существующей строки 2 (и перед строкой 3):

Dim Table As ListObject

Dim NewValues As Variant

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

NewValues = ThisWorkbook.Worksheets(«Data»).Range(«A2:D11»).Value

With Table.DataBodyRange

   .Resize(10).Offset(2).Insert Shift:=xlShiftDown

   .Resize(10).Offset(2).Value = NewValues

End With

Удаление строк

Метод, который вы используете, зависит от того, сколько строк вы хотите удалить.

Удаление одной строки

Для удаления одной строки используется метод Delete объекта ListRow:

Dim Table As ListObject

Dim ListRow as ListRow

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set ListRow = Table.ListRows(3)

ListRow.Delete

Переменной ListRow присваивается третий объект ListRow в коллекции ListRows, а затем вызывается метод Delete объекта ListRow. Вот альтернативная, более короткая версия примера, которая не требует переменной ListRow:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Table.ListRows(3).Delete

Удаление нескольких строк

Удаление нескольких строк одновременно требует использования метода Delete объекта Range. В следующем примере удаляются 10 строк, начиная со строки 3:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Table.DataBodyRange.Resize(10).Offset(2).Delete

Удаление всех строк

В следующем примере удаляются все строки таблицы:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Table.DataBodyRange.Delete

В этом примере объекту DataBodyRange после завершения кода присваивается значение Nothing. Любые последующие ссылки на этот объект возвращают ошибку, если в Таблицу не добавлена хотя бы одна строка.

Циклы

В первом примере выполняется цикл по всем строкам Таблицы, добавляя в переменную TotalExpenses значения всех строк в столбце Expense (расходы) и выводя результат в окно Immediate:

Dim Table As ListObject

Dim ListRow As ListRow

Dim TotalExpenses As Double

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

For Each ListRow In Table.ListRows

   If ListRow.Range.Columns(3).Value = «Expense» Then

      TotalExpenses = TotalExpenses + ListRow.Range.Columns(4).Value

   End If

Next ListRow

Debug.Print «Total expenses: « & TotalExpenses

Ниже приведен альтернативный метод, использующий имена столбцов:

Dim Table As ListObject

Dim ListRow As ListRow

Dim TotalExpenses As Double

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

For Each ListRow In Table.ListRows

   If Intersect(ListRow.Range, Table.ListColumns(«Category»).Range) _

         .Value = «Expense» Then

      TotalExpenses = TotalExpenses + Intersect(ListRow.Range, Table.

      ListColumns(«Amount»).Range).Value

   End If

Next ListRow

Debug.Print «Total expenses: « & TotalExpenses

Во втором примере выполняется цикл по столбцам Таблицы, выводя имя каждого столбца на экран с помощью коллекции ListColumns и оператора For / Each:

Dim Table As ListObject

Dim ListColumn As ListColumn

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

For Each ListColumn In Table.ListColumns

   Debug.Print ListColumn.Name

Next ListColumn

Фильтрация

Одной из самых мощных особенностей Таблиц является их способность фильтровать строки. Объектная модель Excel предоставляет объект AutoFilter (дочерний элемент объекта ListObject) и метод AutoFilter (дочерний элемент объекта Range), что позволяет полностью контролировать процесс фильтрации в VBA. Используйте объект ListObject.AutoFilter для проверки текущих настроек Автофильтра, обновления Автофильтра и очистки Автофильтра. Используйте метод Range.AutoFilter для задания критериев Автофильтра.

Включение и выключение Автофильтра

Вы включаете и выключаете Автофильтр, задавая свойству ShowAutoFilter значения True (вкл.) и False (выкл.). В следующем примере показано, как включить Автофильтр:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Table.ShowAutoFilter = True

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

Вы также можете включать и отключать Автофильтр, повторно вызывая метод Range.AutoFilter без каких-либо параметров. Использование этого метода просто переключает состояние Автофильтра.

Определение состояния фильтрации

Объект Автофильтр используется для определения того, включен ли Автофильтр:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

If Table.ShowAutoFilter Then

   Debug.Print «AutoFilter is on»

Else

   Debug.Print «AutoFilter is off»

End If

Если Автофильтр включен, вы используете свойство FilterMode объекта Автофильтра, чтобы определить, установлены ли критерии фильтрации:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

If Table.ShowAutoFilter Then

   If Table.AutoFilter.FilterMode Then

      Debug.Print «Filtering is active»

   Else

      Debug.Print «Filtering is inactive»

   End If

Else

   Debug.Print «AutoFilter is off»

End If

Определение того, фильтруется ли столбец

Если Автофильтр включен, можно использовать свойство On объекта Filter, чтобы определить, имеет ли столбец активный критерий фильтра:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

If Table.ShowAutoFilter Then

   If Table.AutoFilter.Filters(3).On Then

      Debug.Print «Column 3 is being filtered»

   End If

Else

   Debug.Print «AutoFilter is off»

End If

Создание фильтров

Вы создаете (применяете) фильтры по одному столбцу за раз. Для добавления и удаления критериев фильтрации используется метод AutoFilter объекта Range. При применении критерия Автофильтра строка заголовка включается автоматически. В примерах ниже предполагается, что Таблица не имеет активных критериев фильтрации: Ниже приведены примеры, каждый из которых начинается с этих двух строк кода. Предполагается, что Таблица не имеет активных критериев фильтрации:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

В следующем примере фильтруются строки со значением Expense в третьем столбце.:

Table.Range.AutoFilter Field:=3, Criteria1:=«Expense»

А здесь фильтруются строки с Expense или Income в третьем столбце.:

Table.Range.AutoFilter Field:=3, _

   Criteria1:=Array(«Expense», «Income»), Operator:=xlFilterValues

Ниже показаны только строки со значениями во втором столбце, которые начинаются с Transaction:

Table.Range.AutoFilter Field:=2, Criteria1:=«Transaction*»

Строки в четвертом столбце со значениями больше нуля:

Table.Range.AutoFilter Field:=4, Criteria1:=«>0»

Строки с Income в третьем столбце и значениями более 100 – в четвертом:

Table.Range.AutoFilter Field:=3, Criteria1:=«Income»

Table.Range.AutoFilter Field:=4, Criteria1:=«>100»

Повторное применение критериев активного фильтра

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

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

If Table.ShowAutoFilter Then

   Table.AutoFilter.ApplyFilter

End If

Очистка фильтра одного столбца

Вы можете очистить фильтр одного столбца, используя метод AutoFilter и указав только параметр Field. В следующем примере очищаются критерии фильтра третьего столбца:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Table.Range.AutoFilter Field:=3

Очистка всех фильтров

Вы можете очистить критерии фильтрации для всех столбцов за один шаг, не отключая Автофильтр, вызвав метод ShowAllData:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

If Table.ShowAutoFilter Then

   Table.AutoFilter.ShowAllData

End If

Скрытие раскрывающихся элементов управления по столбцам

Вы можете скрыть раскрывающиеся элементы управления Автофильтра в определенных столбцах. В следующем примере показано, как скрыть раскрывающийся элемент управления AutoFilter во втором столбце Таблицы:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

If Table.ShowAutoFilter Then

   Table.Range.AutoFilter Field:=2, VisibleDropDown:=False

End If

Пользовательские процедуры

В следующих разделах приведены некоторые пользовательские процедуры. Более надежные версии этих программ и ряд других программ, а также полезные утилиты и библиотеки доступны по адресу http://exceltables.com/.

Делаем объемную вставку

Следующая функция вставляет массив значений в Таблицу и возвращает новые строки в виде диапазона. Если задана строка, то значения вставляются выше этой строки; в противном случае значения добавляются в нижнюю часть Таблицы. Функция также сопоставляет столбцы значений со столбцами Таблицы с помощью параметра ColumnAssignmentS. Дополнительные сведения о параметрах см. в комментариях к процедуре.

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

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

Public Function BulkInsertIntoTable( _

      ByVal Table As ListObject, _

      ByVal Values As Variant, _

      Optional ByVal Position As Long = 1, _

      Optional ByVal ColumnAssignments As Variant _

   ) As Range

‘ Insert an array of values into a Table. Optionally specify the row before

which the new rows are inserted. Optionally specify how the columns are

‘ assigned. The new rows in the Table are returned as a Range.

Syntax

‘ BulkInsertIntoTable(Table, Values, Position, ColumnAssignments)

Table A Table object.

‘ Values — A single value, a single dimension array of values, or a two

dimension array of values.

‘ Position — The row number before which the new rows are inserted. Optional.

If omitted then the new rows are appended to the end of the Table.

‘ ColumnAssignments — A single dimension array of integer values specifying

which Table column receives what column of values in the Values parameter.

‘ Each element in the array is a column number in the Table. The position of

the element in the array corresponds to the column in the Values array.

‘ Optional. If omitted then the values are placed in column order starting in

the first Table column. For example, passing Array(2,3,1) results in this

‘ column mapping:

Values column 1 is placed in Table column 2.

‘ Values column 2 is placed in Table column 3.

Values column 3 is placed in Table column 1.

Dim Calculation As XlCalculation

Dim ScreenUpdating As Boolean

Dim Result As Long

Dim TwoDimensionArray As Boolean

Dim WorkArray As Variant

Dim Column As Long

Dim SourceColumn As Long

Dim TargetColumn As Long

Dim ShowTotals As Boolean

Dim InsertRange As Range

‘ Exit if no values to insert

If IsEmpty(Values) Then Exit Function

Calculation = Application.Calculation

Application.Calculation = xlCalculationManual

ScreenUpdating = Application.ScreenUpdating

Application.ScreenUpdating = False

Normalize Values parameter must be a twodimension array

On Error Resume Next

Result = LBound(Values, 2)

TwoDimensionArray = Err.Number = 0

On Error GoTo 0

If Not TwoDimensionArray Then

   If Not IsArray(Values) Then

      Values = Array(Values)

   End If

   ReDim WorkArray(1 To 1, 1 To UBound(Values) LBound(Values) + 1)

   For Column = 1 To UBound(WorkArray, 2)

      WorkArray(1, Column) = Values(Column 1 + LBound(Values))

   Next Column

   Values = WorkArray

End If

‘ Normalize Position parameter

If Position < 0 Then

   Position = Table.ListRows.Count

End If

Position = Application.Max(1, Application.Min(Position, _

   Table.ListRows.Count+ 1))

Save total row setting and disable total

ShowTotals = Table.ShowTotals

Table.ShowTotals = False

‘ Insert the new rows

If Table.ListRows.Count > 0 And Position <= Table.ListRows.Count Then

Table.DataBodyRange.Resize(UBound(Values)). _

Offset(Position — 1).InsertShift:=xlShiftDown

End If

If Table.ListRows.Count > 0 Then

Set InsertRange = Table.DataBodyRange.Resize _

(UBound(Values)).Offset(Position — 1)

Else

Set InsertRange = Table.InsertRowRange.Resize(UBound(Values))

End If

If IsEmpty(ColumnAssignments) Or IsMissing(ColumnAssignments) Then

   InsertRange.Value = Values

Else

   For TargetColumn = LBound(ColumnAssignments) To _

      UBound(ColumnAssignments)

      SourceColumn = TargetColumn — LBound(ColumnAssignments) + 1

      If ColumnAssignments(TargetColumn) >= 1 And _

         ColumnAssignments(TargetColumn) <= _

            Table.ListColumns.Count Then

         InsertRange.Columns(ColumnAssignments(TargetColumn)) _

            .Value = Application.Index(Values, , SourceColumn)

      End If

   Next TargetColumn

End If

Set BulkInsertIntoTable = InsertRange

Restore the total row setting

Table.ShowTotals = ShowTotals

Application.Calculation = Calculation

Application.ScreenUpdating = ScreenUpdating

End Function

Восстановление форматирования и формул

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

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

Процедура ниже выполняет это с помощью метода изменения размера Таблицы. Сначала Таблица изменяется, чтобы быть только одной строкой. Затем форматирование и формулы удаляются из всех строк таблицы от строки 2 до последней строки плюс одна строка. Наконец, диапазон Таблицы возвращается к тому, что было. На этом заключительном этапе 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

25

26

27

28

29

30

31

32

33

34

35

36

37

38

Public Sub RepairTable( _

      ByVal Table As ListObject _

   )

‘ Repair the Table’s formatting and formulas by making them consistent down the

‘ entire length of each column.

‘ Syntax

‘ RepairTable(Table)

Table A Table object (ListObject object).

Dim RowCount As Long

Dim ListColumn As ListColumn

Dim ShowTotals As Boolean

RowCount = Table.ListRows.Count

If RowCount < 2 Then Exit Sub

With Table

   ShowTotals = .ShowTotals

   .ShowTotals = False

   .Resize .HeaderRowRange.Resize(2)

   For Each ListColumn In .ListColumns

      With ListColumn.DataBodyRange.Resize( _

         Application.Max(RowCount, 1)).Offset(1)

         If Left(.Rows(1).Formula, 1) = «=» Then

            .Cells.Clear

         Else

            .Cells.ClearFormats

         End If

     End With

   Next ListColumn

   .Resize .HeaderRowRange.Resize(1 + RowCount)

   .ShowTotals = ShowTotals

End With

End Sub

Копирование стиля Таблицы в новую книгу

Нет простого способа скопировать стиль Таблицы из одной книги в другую. Следующий пример кода копирует стиль, присвоенный Таблице с именем "tblRegister", в книгу "Destination Workbook. xlsx":

Sub ExportTableStyle()

   Dim Source As Workbook

   Dim Target As Workbook

   Dim Table As ListObject

   Set Source = ThisWorkbook

   Set Target = Workbooks(«Destination Workbook.xlsx»)

   Set Table = Source.Worksheets(«Register»).ListObjects(«tblRegister»)

   Target.Worksheets.Add Before:=Target.Worksheets(1)

   Table.Range.Copy Target.Worksheets(1).Range(«A1»)

   Target.Worksheets(1).Delete

End Sub

[1] Различают три основных разновидности массивов: с отсчетом от нуля (zero-based), с отсчетом от единицы (one-based) и с отсчетом от специфического значения заданного программистом (n-based).

Доброго времени суток форумчане. Я являюсь новичком в написании макросов в vba поэтому прошу отнестись с пониманием:)

Для своей работы я пишу достаточную объёмную программу со внесением в таблицу данных через пользовательскую форму с последующей их обработкой. Мне необходимо, чтобы эти данные «перешли» в умные таблицы на других листах того же самого документа Excel. Но для начала эти умные таблицы необходимо создать.
Немного погуглив я нашел решение:

Код
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$L$15"), , xlNo).Name = "МояТаблица1"

Всё прекрасно работает, таблица создается с диапазоном ячеек указанных в параметрах Range. Можно даже вместо ActiveSheet написать

Код
Workbooks("Mybook").Worksheets("MySheet")

И данный способ будет работать, но только в одном случае — если данный MySheet является активным в момент исполнения макроса. Если переключить активный лист на другой и попытаться запустить макрос, то будет ошибка:
Run-time error ‘1004’:

Данные листа таблица должны находиться на том же листе, что и таблица.

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

Решения своего вопроса на просторах в интернете я не нашел, поэтому решил спросить здесь. Буду благодарен за ваши ответы.

Изменено: Максим Белич22.07.2022 10:30:23

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