Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Источники / excel_2010_professionalnoe_programmirovanie_na_vba_RuLit_Me_412629.pdf
Скачиваний:
4
Добавлен:
27.09.2025
Размер:
22.97 Mб
Скачать

278

Часть III. Visual Basic for Applications

7.Активизируйте Excel. Выберите команду Разработчик^Код1^Макросы (Develo­ per1^ Code^Macros) для отображения диалогового окна Макрос (Macro).

8.В диалоговом окне Макрос (Macro) выберите процедуру Sort Sheets и щелк­ ните на кнопке Параметры (Options), чтобы присвоить данному макросу комби­ нацию клавиш. Неплохим выбором будет <Ctrl+Shift+S>.

Написание кода

Теперь пришло время приступить к написанию программы. Вначале необходимо по­ местить названия листов в массив строк. Так как пока неизвестно, сколько листов со­ держит активная рабочая книга, для объявления массива используем оператор Dim с пустыми скобками. Помните, что всегда можно применить оператор ReDim и изменить размерность массива на требуемое число элементов.

Введем код, вставляющий названия листов в массив SheetNames. Кроме того, в цикл добавим функцию MsgBox, чтобы убедиться, что названия листов на самом деле вводятся в массив.

Sub

S o r t S h e e t s O

'

С о р т и р о в к а л и с т о в в а к т и в н о й р а б о ч е й к н и ге

 

D im S h e e tN a m e s () a s S t r i n g

 

D im i

a s L o n g

 

D im S h e e tC o u n t a s L o n g

 

S h e e tC o u n t = A c t iv e W o r k b o o k . S h e e t s . C o u n t

 

R eD im S h e e tN a m e s (1 To S h e e tC o u n t)

 

F o r i = 1 To S h e e tC o u n t

 

S h e e tN a m e s ( i) = A c t iv e W o r k b o o k . S h e e t s ( i) . N a m e

 

M sg B o x S h e e tN a m e s ( i)

 

N e x t

i

En d

Sub

 

Чтобы проверить эту программу, активизируем рабочую книгу Test.xlsm и нажмем клавиши <Ctrl+Shift+S>. Появится пять окон сообщений с названиями листов активной ра­ бочей книги.

Рекомендуем вам тестировать код по мере его создания. Когда вы убедитесь, что про­ грамма работает правильно, удалите операторы MsgBox (через некоторое время они начнут вас раздражать).

Совет

Вместо того чтобы использовать функцию M sg B o x в целях тестирования, можно обратиться к методу P r i n t объекта D ebug, который отображает све­ дения в окне отладки. Для этого замените M sgB o x следующим оператором:

D e b u g . P r in t S h e e tN a m e s (i)

Этот прием не столь навязчив по сравнению с использованием операто­ ров M sg B o x . Не забудьте только удалить этот оператор по завершении тестирования.

На данном этапе процедура Sort Sheets всего лишь создает массив названий лис­ тов в соответствии с порядком указания их в активной рабочей книге. Остается два шага: отсортировать значения в массиве SheetNames и изменить порядок следования листов в книге согласно отсортированному массиву.

E n d N e x t j
N ext i End Sub

Глава 9. Работа с процедурами VBA

279

Создание процедуры сортировки

Переходим к сортировке массива SheetNames. Можно вставить программу сорти­ ровки в процедуру S o rtS h e e ts , но лучше написать общую процедуру сортировки, ко­ торую можно будет использовать для управления другими объектами (сортировка мас­ сивов — довольно популярная операция).

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

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

В пузырьковом методе используется вложенный цикл F or-N ext, в котором оцени­ вается каждый элемент массива. Если элемент массива больше, чем следующий, то эти два элемента меняются местами. Такое сравнение повторяется для каждой пары элемен­ тов (т.е. п - 1 раз).

©В главе 11 описаны другие процедуры сортировки, а также приведено срав­ нение процедур по скорости выполнения.Перекрестная ссылка

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

Sub B u b b l e S o r t ( L i s t ()

A s S t r in g )

Dim

F i r s t

A s L o n g ,

L a s t A s L o n g

Dim

i A s

L o n g , j A s

L o n g

Dim

Temp

A s S t r i n g

 

F i r s t = L B o u n d ( L is t )

Last = UBound(List)

F o r i = F i r s t T o

F o r j

=

i

+ 1

I f

L

i s t ( i )

 

Temp

=

 

L

i s t ( j )

 

L

i s t ( i )

 

 

I f

 

L a s t - 1 To L a s t

> L i s t (j ) T h e n

Li s t ( j )

=L i s t ( i )

=Temp

Эта процедура имеет один аргумент: одномерный массив с названием L is t. Массив, который передается в процедуру, может быть любой длины. Для присвоения нижней и верхней границ массива переменным F i r s t и L a st использовались функции Lbound и UBound соответственно.

Ниже приведена небольшая временная процедура, которая используется для тестиро­ вания процедуры B u b b leS o rt.

Sub S o r t T e s t e r O

Dim

х ( 1 To 5) A s S t r i n g

Dim

i

A s L o n g

x ( l)

= " с о б а к а "

x(2)

=

" к о т "

280

Часть III. Visual Basic for Applications

x ( 3 )

= "с л о н "

X ( 4 )

= " т р у б к о з у б "

x ( 5 )

= "п т и ц а "

C a l l B u b b le S o r t ( x )

F o r i

= 1 To 5

D e b u g . P r in t i , x ( i )

N e x t

i

E n d Sub

Процедура S o r tT e s te r создает массив из пяти строк, передает его процедуре Bub­ b le S o rt и отображает отсортированный массив в окне отладки (Immediate). После того как код выполнил свое предназначение, он был удален.

Убедившись в том, что код работает надежно, я изменил процедуру S o rtS h e e ts пу­ тем добавления вызова в процедуру B u b b leS o rt, передачи массива SheetNam es в ка­ честве аргумента. Начиная с этого момента, модуль приобретает следующий вид.

Sub

S o r t S h e e t s ()

 

 

 

 

D im S h e e tN a m e s () A s S t r i n g

 

D im S h e e tC o u n t a s L o n g

 

 

D im

i

a s L o n g

 

 

 

 

S h e e tC o u n t = A c t iv e W o r k b o o k . S h e e t s . C o u n t

 

ReD im

S h e e tN a m e s (1

To

S h e e tC o u n t)

 

F o r i = 1 To S h e e tC o u n t

 

S h e e tN a m e s ( i) = A c t iv e W o r k b o o k . S h e e t s ( i) . N a m e

 

N e x t

 

i

 

 

 

 

 

C a l l B u b b le S o r t( S h e e tN a m e s )

E n d

Sub

 

 

 

 

 

 

Sub

B u b b l e S o r t ( L i s t ()

A s

S t r in g )

'

С о р т и р о в к а м а с с и в а L i s t по в о з р а с т а н и ю

 

D im F i r s t A s L o n g , L a s t A s L o n g

 

D im i A s L o n g , j A s L o n g

 

D im

Temp

A s S t r i n g

 

 

 

F i r s t = L B o u n d ( L is t )

 

 

L a s t = U B o u n d ( L is t )

 

 

 

F o r i = F i r s t To L a s t - 1

 

F o r j = i + 1 To L a s t

 

 

 

I f L i s t ( i )

> L i s t ( j ) T h e n

 

 

 

 

Temp =

L i s t ( j )

 

 

 

 

L i s t ( j )

= L i s t ( i )

 

 

 

 

L i s t ( i )

=

Temp

 

 

 

En d

I f

 

 

 

 

N e x t j

 

 

 

 

 

N e x t

 

i

 

 

 

 

E n d

Sub

 

 

 

 

 

 

По окончании работы процедуры S o rtS h e e ts образуется массив, состоящий из от­ сортированных названий листов активной рабочей книги. Чтобы проверить это, можно отобразить содержимое массива в окне отладки, добавив в конец процедуры S o r t ­ S h e e ts такой код (если это окно не отображается, нажмите клавиши <Ctrl+G>).

F o r i = 1 Т о S h e e tC o u n t

D e b u g . P r in t S h e e tN a m e s ( i)

N e x t i

Пока все идет нормально. Осталось написать программу для изменения порядка следования листов в книге в соответствии с отсортированными элементами массива SheetN am es.

Глава 9. Работа с процедурами VBA

281

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

S h e e ts( " Л и с т З " ) . M ove B e f o r e : = S h e e t s (1)

Далее напишем цикл F or-N ext, который просматривает каждый лист и перемещает его в соответствующее место, указанное в массиве SheetNames.

For i

= 1 То S h e e tC o u n t

S h e e t s ( S h e e t N a m e s ( i) ) .M ove B e f o r e : = S h e e t s ( i)

Next

i

Например, в первой итерации цикла счетчик (i) равен 1. Первый элемент массива SheetNames (в данном примере) — лист Лист1. Следовательно, выражение для мето­ даMove в цикле будет таким.

S h e e ts( " Л и с т 1 " ) .M ove B e f o r e : = S h e e t s ( l)

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

S h e e ts( " Л и с т 2 " ) .M ove B e f o r e := S h e e t s (2)

В процедуру S o rt S h e e ts добавим новый код.

Sub S o r t S h e e t s O

 

Dim

S h e e tN a m e s ()

A s S t r i n g

Dim

S h e e tC o u n t a s

L o n g

Dim

i a s L o n g

 

S h e e tC o u n t = A c t iv e W o r k b o o k . S h e e t s . C o u n t

ReDim S h e e tN a m e s (1 To S h e e tC o u n t)

F o r i = 1 T o S h e e tC o u n t

S h e e tN a m e s ( i) = A c t iv e W o r k b o o k . S h e e t s ( i) . N a m e

N ext i

C a ll B u b b le S o r t( S h e e tN a m e s )

F o r i = 1 T o S h e e tC o u n t

A c t iv e W o r k b o o k . S h e e t s ( S h e e t N a m e s ( i) ) .M ove _

B e f o r e : = A c tiv e W o r k b o o k . S h e e t s (i )

N ext i

End Sub

Тестирование показало, что процедура прекрасно работает с рабочей книгой Test .xlsm .

Теперь необходимо собрать весь код. Объявим все переменные, используемые в про­ цедурах, и добавим несколько комментариев, а также пустых строк, чтобы программу можно было легче прочесть. В результате процедура S o rtS h e e ts будет приведена к следующему виду.

Sub

S o r t S h e e t s O

 

 

 

 

 

1

Эта

п р о ц е д у р а

с о р т и р у е т

л и с т ы

 

1

акти в н о й

р а б о ч е й

к н и г и

по в о з р а с т а н и ю .

1

Нажмите

клави ш и

< C tr l+ S h if t+ S >

д л я в ы п о лн ен и я

 

Dim

S h e e tN a m e s ()

A s

S t r i n g

 

 

Dim

S h e e tC o u n t

A s L o n g

 

 

 

Dim

i

A s

L o n g

 

 

 

 

 

1

О пределение

к о л и ч е с т в а

л и с т о в

и м а с с и в а ReD im

 

S h e e tC o u n t = A c t iv e W o r k b o o k . S h e e t s . C o u n t

 

ReDim

S h e e tN a m e s (1

To S h e e tC o u n t)

'

Заполнение

м а с с и в а

н а з в а н и я м и

л и с т о в

 

F o r i = 1 То S h e e tC o u n t