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

Глава 11. Приемы и методы программирования на VBA

345

Примечание

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

Компакт-диск

Рабочая книга, включающая процедуры W riteReadRange, L oo pF illR a ng e и A rra y F illR a n g e , находится на прилагаемом компакт-диске в файле lo o p vs a rra y f i l l ra n g e .xlsm .

Перенесение одномерных массивов

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

При перенесении одномерного массива диапазон должен быть горизонтальным, т.е. это должна быть строка длительностью в несколько столбцов. Если же необходимо использо­ вать вертикальный диапазон, сначала следует транспонировать массив. Для этого исполь­ зуйте функцию Excel ТРАНСП (TRANSPOSE). В следующем примере 100-элементный мас­ сив вставляется в вертикальный диапазон на рабочем листе (А1:А100).

Range("А1:А 100") .V alue = _

A p p lic a tio n . W o rk s h e e tF u n c tio n . Transpose (M yArray)

Предупреждение

н» Функция Excel трансп не работает с массивами, которые содержат более 65536 элементов.

Перенесение диапазона в массив типа variant

Внастоящем разделе рассматривается еще один способ управления данными Excel в VBА.

Впримере, показанном ниже, диапазон ячеек переносится в двухмерный массив типа V a r i -

ant. Затем в окнах сообщений отображаются границы обеих размерностей массива.

Sub RangeToVariant ()

Dim х As V a ria n t

x = Range ("A 1 :L 6 0 0 ") .V alue

MsgBox UBound(x, 1)

MsgBox UBound(x, 2)

End Sub

В данном примере в первом окне сообщения отображается 60 0 (количество строк в массиве), а во втором окне сообщения— 12 (количество столбцов). Вы увидите, что перенесение данных диапазона в массив типа V a r ia n t происходит за долю секунды.

В следующем примере считывается диапазон в массив V a r ia n t , выполняется про­ стая операция умножения над каждым элементом массива и массив перемещается обрат­ но в диапазон.

Sub RangeToVariant2 ()

Dim х

As

V a ria n t

Dim r

As

Long, с As In te g e r

1 Чтение

данных

346

г

Часть III. Visual Basic for Applications

x= Range( " d a ta " ) .V alue

Просмотр массива

For r = 1 To UBound(x/ 1)

For с = 1 To UBound(x, 2)

'Умножение на 2

x ( r , с) = x (г , с) * 2 N ext с

N ext г

'Передача переменной типа V a ria n t обратно на лист Range( " d a ta " ) = х

End Sub

Данная процедура работает очень быстро.

Компакт-диск

Рабочая книга, содержащая этот пример, находится на прилагаемом ком- пакт-диске в файле v a r ia n t t r a n s f e r . xlsm .

Выбор ячеек по значению

Пример из этого раздела демонстрирует выделение ячеек на основе их значений. До­ вольно странно, что в Excel отсутствует метод осуществления этой операции. Эта про­ блема решается с помощью разработанной мною процедуры S electB yV alue . Данная процедура выделяет ячейки с отрицательными значениями, но это поведение можно лег­ ко изменить.

Sub

S e le c tB y V a lu e ()

 

 

 

 

 

Dim

C e ll As O b je ct

 

 

 

 

Dim

F oundC ells As Range

 

 

 

 

Dim

WorkRange

As

Range

 

 

 

 

I f

T ypeN am e(S election)

<> "Range"

Then E x it Sub

 

1

Проверить все

или выделенное?

 

 

 

I f

S e le c tio n . C ountLarge

= 1 Then

 

 

 

 

Set

WorkRange

= A ctiveS heet.U sedR ange

 

 

E lse

WorkRange

= A p p lic a tio n . In te rs e c t( S e le c tio n ,

_

 

 

Set

 

End

I f

ActiveS heet.U sedR ange)

 

 

 

 

 

 

 

 

 

1

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

 

 

On

E rro r Resume

N ext

 

 

 

 

Set

WorkRange

=

WorkRange. S p e c ia lC e lls (x lC o n s ta n ts ,

xlNum bers)

 

I f

WorkRange

Is

N o th in g

Then E x it

Sub

 

 

On

E r ro r GoTo

0

 

 

 

 

1

Обход

каждой

ячейки, добавление в

диапазон F oundC ells ячеек,

'удовлетворяющих заданным условиям

For Each

C e ll

In

WorkRange

 

I f C e ll.V a lu e

<

0 Then

 

I f

F ou nd C ells

Is

N o th in g Then

 

Set

FoundC ells

=

C e ll

E lse

 

 

 

 

 

End

Set

FoundC ells

=

U n io n (F o u n d C e lls , C e ll)

I f

 

 

 

 

 

Глава 11. Приемы и методы программирования на VBA

347

End I f

 

 

Next C e ll

 

 

' Отображение сообщения либо выделение ячеек

 

I f FoundC ells

Is N o th in g Then

 

MsgBox "He

найдены ячейки, соответствующие

заданным условиям ."

Else

 

 

F o u n d C e lls . S e le c t

End I f

End Sub

Процедура начинается с проверки выделенной области. Если выделена одна ячейка, поиск выполняется во всей рабочей книге. Если в выделенную область включаются хотя бы две ячейки, поиск осуществляется только в выделенном диапазоне. Уточнение ре­ зультатов поиска в диапазоне производится с помощью метода S p e c ia lC e lls , причем создается объект Range, который содержит только числовые константы.

Код в цикле F or-N ext проверяет значение ячейки. Если оно соответствует крите­ рию (меньше 0), ячейка добавляется в объект F oundC ells Range с помощью метода Union. Обратите внимание, что для первой ячейки метод U nion неприменим. Если диапазон FoundC ells не содержит ячеек, попытка применения метода U nion приведет к появлению ошибки. Таким образом код проверяет, не будет ли значение объекта FoundCells равно N othing.

По завершении цикла объект FoundC ells будет состоять из ячеек, которые удовле­ творяют критерию (либо получит значение N othing, если ячейки не найдены). Если ячей­ ки ненайдены, отображается окно сообщения. В противном случае выделяются ячейки.

Компакт-диск

Рассмотренный выше пример находится на прилагаемом к книге компактдиске в файле s e le c t by v a lu e .x ls m .

Копирование несмежных диапазонов

Если вы попытаетесь копировать несмежные (или, как их еще называют, несвязные) выделенные диапазоны, ничего из этого не выйдет, поскольку Excel не поддерживает эти операции. Подобная попытка завершится отображением сообщения об ошибке Данная команда неприменима для н е св я зн ы х д и а п а зо н о в (That command cannot be used on multiple selections).

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

Sub C o p yM u ltip le S e le ctio n ()

 

Dim SelAreas ()

As

Range

 

 

Dim PasteRange

As

Range

 

 

Dim U pperLeft

As

Range

As

Long

Dim NumAreas As Long, i

Dim TopRow As

Long, L e ft Col

As Long

Dim RowOffset

As

Long,

C o lO ffs e t As Long

I f TypeName (S e le c tio n ) <>

"Range"

Then E x it

Sub

1 Хранение

областей в виде

отдельных

объектов

Range

NumAreas

= S e le c tio n .A reas . Count

 

 

ReDim S e lA rea s(1 To NumAreas)