Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

Запись макроса, переименовывающего лист

Знакомство с объектами

Чтобы решить проблему, используя программирование на VBA, необходимо сначала понять, с какими объектами будет работать код. Важным средством изучения этих сведений является Справочник по объектной модели Excel, входящий в справочное руководство разработчика по Excel 2007 в библиотеке MSDN.

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

Рисунок 3. Справочник по объектной модели Excel на сайте MSDN


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

· Непосредственное использование справочного руководства по объектной модели.

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

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

Использование записи макроса

Иногда все, что требуется — просто записать макрос, в этом случае даже не потребуется просматривать код. Но чаще одной записи недостаточно. Но запись служит отправной точкой последующего процесса.

Использование записи макроса в качестве отправной точки решения

1. Запишите действия, которые нужно кодировать.

2. Просмотрите код и найдите строки, выполняющие действия.

3. Удалите оставшуюся часть кода.

4. Измените записанный код.

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

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

Запись макроса, переименовывающего лист

1. Нажмите кнопку Записать макрос на вкладке Разработчик.

2. Назовите макрос RenameWorksheets, переименуйте Лист1 в Новое имя и нажмите кнопкуОстановить запись.

3. На вкладке Разработчик или Вид нажмите кнопку Макрос и выберите Изменить, чтобы открыть редактор Visual Basic.

Код в редакторе Visual Basic должен быть похож на следующий код.

VB

Sub RenameWorksheets()

'

' RenameWorksheets Macro

'

'

Sheets("Sheet1").Select

Sheets("Sheet1").Name = "New Name"

End Sub

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

· Упростить понимание кода, не только для автора, но и для всех, кому впоследствии может понадобиться изменить код.

· Чтобы временно отключить строку кода (закомментировать).

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

Следующая строка использует метод Select, чтобы выбрать член Sheet1 (Лист1) объекта коллекции Sheets. В коде VBA обычно не нужно выбирать объекты перед работой с ними, даже если это делается при записи макросов. Другими словами, эта строка кода является избыточной, поэтому ее тоже можно удалить.

Последняя строка записанного макроса изменяет свойство "Name" члена Sheet1 коллекции Sheets. Эту строку нужно сохранить.

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

VB

Sub RenameWorksheets()

Sheets("Sheet1").Name = "New Name"

End Sub

Вручную измените имя листа "Новое имя" обратно на "Лист1", затем выполните макрос. Имя должно измениться обратно на "Новое имя".

Изменение записанного кода

Теперь самое время изучить коллекцию Sheets, используемую при записи макроса. Раздел "Листы" в справочном руководстве по объектной модели содержит следующий текст.

"Коллекция Sheets может содержать объекты Chart или Worksheet. Если нужно работать только с листами одного типа, просмотрите раздел об объекте этого типа листа".

Используется только коллекция Worksheets, поэтому изменить код следующим образом.

VB

Sub RenameWorksheets()

Worksheets("Sheet1").Name = "New Name"

End Sub

Циклы

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

В VBA есть конструкция, называемая циклом For Each и идеально подходящая для этого случая. Цикл For Each проверяет все элементы в объекте коллекции, таком как Worksheets, и может использоваться для выполнения действия (например, изменения имени) над некоторыми или над всеми этими элементами.

Дополнительные сведения о цикле For Each см. в справочном руководстве по языку VBA. Щелкните "Visual Basic Conceptual Topics" (Концептуальные темы Visual Basic), затем "Using For Each...Next Statements" (Использование инструкций For Each...Next). Кроме того, помните, что справочное руководство по языку VBA, как и справочное руководство по объектной модели, сторицей окупит время, потраченное на его изучение, и является отличным местом для поиска идей при плотной работе над кодом.

Используя третий пример в разделе "Using For Each...Next Statements" (Использование инструкций For Each...Next), измените макрос так, чтобы он стал похож на следующий код.

VB

Sub RenameWorksheets()

For Each myWorksheet In Worksheets

myWorksheet.Name = "New Name"

Next

End Sub

myWorksheet является переменной, то есть ее значение меняется. В этом случае переменная myWorksheet последовательно представляет каждый лист в коллекции Worksheets. Необязательно использовать myWorksheet, можно использовать "x", "ws", "WorksheetToRenameAfterTheContentsOfCellB1" или (с небольшими ограничениями) практически любое желательное имя. Хорошей практикой является использование имен переменных, достаточно длинных, чтобы напомнить о ее смысле, но не настолько длинных, чтобы загромождать код.

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

VB

myWorksheet.Name = "New Name"

Чтобы исправить строку так, чтобы можно было проверить работу цикла For Each, измените строку следующим образом.

VB

myWorksheet.Name = myWorksheet.Name & "-changed"

Вместо попытки присвоить каждому листу одно и то же имя, эта строка изменяет текущее имя каждого листа (myWorksheet.Name) на текущее имя с добавлением суффикса "-changed".

Полезное переименование

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

В этот раз вместо использования записи макроса для изучения ссылки на ячейку, сделаем предположение и посмотрим, сработает ли использование объекта Cell (ячейка). Это хорошее предположение, но если открыть справочное руководство по объектной модели и попытаться найти объект Cell, окажется, что там никакого объекта Cell нет! Но есть объект CellFormat (Возможно, на английском языке).

Раздел объекта CellFormat содержит следующий код в первом примере.

VB

' Set the interior of cell A1 to yellow.

Range("A1").Select

Предполагается, что объект Range (диапазон) используется, чтобы задать диапазон ячеек или только одну отдельную ячейку. И снова, часть .Selectне понадобится, но понадобится найти, как ссылаться на содержимое объекта Range, а не на сам объект Range. Если перейти к разделу Range, можно прочитать, что у объекта Range есть и Methods, и Properties. Содержимым объекта Range является сущность, не действие, поэтому это, скорее всего, будет Property. Если просмотреть список, можно найти свойство Value. Поэтому попробуйте следующий код.

VB

Sub RenameWorksheets()

For Each myWorksheet In Worksheets

myWorksheet.Name = myWorksheet.Range("B1").Value

Next

End Sub

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

Рисунок 4. Пример данных для макроса RenameWorksheets


 

 

 

Имена листов изменятся соответствующим образом.

Проверка пустых ячеек

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

VB

If myWorksheet.Range("B1").Value <> "" Then

А после строки myWorksheet.Name добавьте следующий текст.

VB

End If

Такой код называется инструкцией If…Then. Инструкция If…Then указывает Excel выполнять весь код между строкой If и строкой End If, но только при выполнении условия, приведенного в строке If. В примере проверяемое условие задается следующей строкой.

VB

myWorksheet.Range("B1").Value <> ""

Знаки <> означают "не равно", а знаки кавычек, между которыми ничего нет, обозначают пустую текстовую строку, то есть полное отсутствие текста. Следовательно, все строки кода между If и End If будут выполнены только если значение в ячейке B1 не пусто, то есть, когда ячейка B1 содержит текст.

Дополнительные сведения об инструкции If…Then см. в справочном руководстве по языку VBA. (Полное название раздела — "If…Then…Else statement" (Инструкция If…Then…Else), где Else — это необязательный компонент.)

Объявления переменных

Другим улучшением, которое нужно внести в макрос, является помещение в начало макроса объявления переменной myWorksheet.

VB

Dim myWorksheet As Worksheet

Dim является сокращением от "Dimension" (размерность), а Worksheet — это тип этой конкретной переменной. Эта инструкция сообщает VBA, какой тип сущности представляет переменная myWorksheet. Обратите внимание, что после введения As, редактор Visual Basic выводит всплывающую подсказку, содержащую перечень всех доступных типов переменных. Это пример технологии IntelliSense, то есть редактор Visual Basic реагирует на то, что, как он считает, пытается сделать пользователь, и предлагает список соответствующих вариантов. Можно выбрать вариант из списка или продолжить ввод.

Хотя объявления переменных в VBA не являются обязательными, их использование настоятельно рекомендуется! Объявление переменных резко упрощает отслеживание переменных и обнаружение ошибок в коде. Кроме того, помните, что при объявлении переменной с типом объекта (например, Worksheet) IntelliSense выводит соответствующий список свойств и методов, связанных с объектом, при последующем использовании этой переменной объекта в макросе.

Комментарии

Теперь макрос стал достаточно сложным, чтобы добавить в него несколько комментариев, напоминающих, что делает код. Количество используемых комментариев — это вопрос личного стиля, но в общем случае слишком много комментариев лучше, чем слишком мало комментариев. Со временем код обычно нужно изменять и обновлять. Без комментариев может быть трудно понять, что делается в коде, особенно когда лицо, изменяющее код, не является автором первоначального кода. Добавление комментариев для условия If и для строки, переименовывающей листы, приводит к появлению следующего кода.

VB

Sub RenameWorksheets()

Dim myWorksheet As Worksheet

For Each myWorksheet In Worksheets

'make sure that cell B1 is not empty

If myWorksheet.Range("B1").Value <> "" Then

'rename the worksheet to the contents of cell B1

myWorksheet.Name = myWorksheet.Range("B1").Value

End If

Next

End Sub

Чтобы проверить макрос, переименуйте листы обратно в Лист1, Лист2 и Лист3 и удалите содержимое ячейки B1 на одном или нескольких листах. Выполните макрос, чтобы проверить, что он переименовывает листы с текстом в ячейке B1 и оставляет нетронутыми остальные листы. Макрос работает для любого числа листов, с любой комбинацией заполненных и пустых ячеек B1.