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

282

Часть III. Visual Basic for Applications

SheetNames(i) = ActiveWorkbook.Sheets(i).Name

Next

i

1 С о р т и р о в к а м а с с и в а по в о з р а с т а н и ю

Call

BubbleSort(SheetNames)

' П ерем ещ ение л и с т о в

For i = 1 To SheetCount ActiveWorkbook.Sheets(SheetNames(i)).Move _ Before:= ActiveWorkbook.Sheets(i)

Next i End Sub

Итак, все работает. Чтобы продолжить проверку программы, добавим еще не­ сколько листов в книгу Test .xlsm и изменим некоторые названия. Программа ра­ ботает прекрасно!

Д ополнительное тестирование

Наверное, вы считаете, что работа окончена. Однако тот факт, что процедура работа­ ет с рабочей книгой Test.xlsm, не означает, что она будет работать со всеми рабочими книгами. Чтобы проверить программу, загрузим несколько других рабочих книг и вновь запустим программу. Скоро вы убедитесь в том, что приложение неидеально (если быть точным, оно далеко от идеала). Были обнаружены следующие проблемы.

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

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

SUMMARY (все буквы в верхнем регистре) был размещен перед листом Sheet 1. Эта проблема вызвана процедурой BubbleSort (так как U в верхнем регистре считается больше, чем h в нижнем).

Если на экране не отображаются окна рабочих книг, при нажатии <Ctrl+Shift+S> макрос выдает ошибку.

Если структура рабочей книги защищена, метод Move не работает.

После сортировки последний лист рабочей книги становится активным. Измене­ ние активного листа — не очень удачное решение проблемы; лучше, если бы ак­ тивным оставался лист, который был таковым до начала выполнения программы.

При прерывании макроса с помощью комбинации клавиш <Ctrl+Break> VBA ото­ бражает сообщение об ошибке.

Макрос не может быть “обращен вспять” (вы не можете воспользоваться командой Отменить (Undo)). Если пользователь случайно нажмет клавиши <Ctrl+Shift+S>, листы рабочей книги отсортируются, и в исходное состояние придется возвращать их вручную.

Устранение проблем

Решить проблему обновления изображения на экране несложно — для этого вставьте в начале процедуры SortSheets такую инструкцию:

Application.ScreenUpdating = False

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

283

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

Можно было бы исправить и проблему с процедурой BubbleSort. Для этого исполь­ зуем функцию UCase, чтобы преобразовать названия листов в верхний регистр. Таким об­ разом, все сравнения выполняются с названиями в верхнем регистре. Исправленная строка выглядит следующим образом:

I f U C a s e ( L i s t ( i ) ) > U C a s e ( L i s t ( j )) T h e n

©Еще один способ решения “проблемы регистра” — добавить в начало моду­ ля следующий оператор:Совет

O p t io n C om pare T e x t

В этом случае VBA выполняет сравнение строк на основе нечувствительных к регистру правил сортировки. Другими словами, А считается тем же, что и а.

Чтобы избежать сообщения об ошибке, которое появляется, когда все рабочие книги свернуты, добавим процедуру проверки ошибок. Если не существует активных рабочих книг, происходит ошибка. Применим оператор On Error Resume Next, чтобы про­ игнорировать ошибку, и проверим значение Err. Если Err не равно нулю, это означает, что произошла ошибка. Следовательно, процедура заканчивается. Ниже приведен код проверки ошибок.

On E r r o r

Resum e

N e x t

S heetC ount

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

If E r r <>

0

T h e n

E x i t Sub 1 н е т а к т и в н о й р а б о ч е й к н и ги

Можно и не использовать оператор On Error Resume Next. Следующий опера­ тор непосредственно определяет, свернута ли рабочая книга, и не реализует обработку ошибок. Этот оператор находится в верхней части процедуры SortSheets.

If A c tiv e W o rk b o o k I s N o t h in g T h e n E x i t Sub

Обычно для защиты структуры рабочей книги имеется серьезная причина. Мы не бу­ дем снимать защиту; программа должна отображать предупреждение, чтобы пользова­ тель снял защиту и снова выполнил макрос. Проверку защищенной структуры книги вы­ полнить легко — свойство ProtectStructure объекта WorkBook возвращает True, если книга защищена. Поэтому добавим в проект следующий код.

1 Проверка

защ иты с т р у к т у р ы р а б о ч е й

к н и ги

I f A c t iv e W o r k b o o k . P r o t e c t S t r u c t u r e T h e n

M sgB ox A c tiv e W o rk b o o k .N a m e &

" з а щ и щ е н а .", _

v b C r i t i c a l , "С о р т и р о в к а л и с т о в н е в о з м о ж н а ."

E x i t

Sub

 

End I f

 

 

Если структура рабочей книги защищена, пользователь увидит окно сообщения, по­ казанное на рис. 9.11.

Для повторной активизации листа после завершения сортировки я написал код, кото­ рый сопоставляет исходный лист с объектной переменной (OldActiveSheet), а также активизирует этот лист после завершения процедуры. Ниже показан оператор, который инициализирует переменную.

Set O ld A c t iv e = A c t iv e S h e e t

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

 

 

 

 

285

 

 

v b C r i t i c a l ,

"Л и сты

не

м о г у т

бы ть

о т с о р т и р о в а н ы ."

 

E x i t

Sub

 

 

 

 

 

 

 

 

 

End I f

 

 

 

 

 

 

 

 

 

 

1

П роверка

п о л ь з о в а т е л я

 

 

 

 

 

 

 

 

I f M s g B o x ( "С о р т и р о в а т ь л и с т ы в а к т и в н о й р а б о ч е й к н и г е ? " , _

 

v b Q u e s t io n + v b Y e sN o )

о

v b Y e s

T h en

E x i t

Sub

1

О тклю чение

ко м б и н а ц и и

клави ш

< C trl+ B re a k >

 

 

A p p lic a t io n . E n a b le C a n c e lK e y

=

x l D i s a b le d

 

'

П олучение

к о л и ч е с т в а

л и с т о в

 

 

 

 

 

 

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)

 

 

 

'

С охран ени е

с с ы л к и

на

а к ти в н ы й

л и с т

 

 

 

 

S et O ld A c t iv e S h e e t = A c t iv e S h e e t

 

 

 

'

Заполнен ие

м а с с и в а

н а з в а н и я м и

л и с т о в

 

 

 

Fo r i = 1 То 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 )

 

 

 

 

 

1

Отключение

о б н о в л е н и я

э к р а н а

 

 

 

 

 

A p p lic a t io n . S c r e e n U p d a t in g

=

F a ls e

 

 

 

1

Перемещение л и с т о в

 

 

 

 

 

 

 

 

 

Fo r i = 1 То 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

 

 

 

 

 

 

 

 

 

 

1

Повторная

а к т и в и з а ц и я

и с х о д н о г о а к т и в н о г о л и с т а

 

O ld A c t iv e S h e e t . A c t iv a t e

 

 

 

 

 

 

End Sub

 

 

 

 

 

 

 

 

 

 

 

Доступность

Макрос S o rtS h e e ts сохранен в личной книге макросов, поэтому он всегда досту­ пен при запуске Excel. На этом этапе макрос может выполняться при выборе названия макроса в диалоговом окне Макрос (Macro) — это окно отображается после нажатия клавиш <Alt+F8> или <Ctrl+Shift+S>. Команду вызова этого макроса можно также доба­ вить на ленту.

Для добавления команды на ленту выполните следующие действия.

1.Щелкните правой кнопкой мыши на ленте и в контекстном меню выберите ко­ манду Настройка ленты (Customize the Ribbon).

2.На вкладке Настройка ленты (Customize Ribbon) диалогового окна Параметры Excel (Excel Options) в списке Выбрать команды (Choose Commands From) вы­ берите категорию Макросы (Macros).

3.Щелкните на значке PERSONAL. XLSB! S o rtS h e e ts .

4.Используйте элементы управления в правом окне для создания новой вкладки и группы ленты. (Вы не сможете добавить команду в существующую группу.)