Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Источники / excel_2010_professionalnoe_programmirovanie_na_vba_RuLit_Me_412629.pdf
Скачиваний:
4
Добавлен:
27.09.2025
Размер:
22.97 Mб
Скачать
IsN u m e ric(W ksh t.R a n g e (A d d r)) Then
I f W ksht. Range(Addr) > MaxVal Then _ MaxVal = W ksht. R an ge (A dd r).V alu e
End I f

372

 

 

 

 

 

 

 

 

Часть III. Visual Basic for Applications

F u n c tio n S h e e tO ffs e t(O ffs e t

As Long,

O p tio n a l

C e ll

As V a ria n t)

1

Возвращение

содержимого

ячейки

по

ссылке на

нее

 

 

Dim

W ksIndex

As Long, WksNum As

Long

 

 

 

 

Dim

wks As W orksheet

 

 

 

 

 

 

 

A p p lic a tio n . V o la tile

 

 

 

 

 

 

 

I f

Is M is s in g (C e ll)

Then

Set C e ll

= A p p lic a tio n . C a lle r

 

WksNum =

1

 

 

 

 

 

 

 

 

 

For

Each

wks

In A p p lic a tio n . C a lle r . P a re n t. P a re n t. W orksheets

 

 

I f A p p lic a tio n . C a lle r . Parent.Name

= wks.Name

Then

 

 

S h e e tO ffs e t

= Worksheets(WksNum

+ _

 

 

 

 

 

O f f s e t ) . R a n g e (C e ll( 1 ) .A ddress)

 

 

 

 

E x it F u n c tio n

 

 

 

 

 

 

 

 

E lse

 

 

 

 

 

 

 

 

 

 

 

WksNum = WksNum + 1

 

 

 

 

 

 

 

End I f

 

 

 

 

 

 

 

 

 

End

N ext wks

 

 

 

 

 

 

 

 

 

F u n c tio n

 

 

 

 

 

 

 

 

 

Возвращение максимального значения всех рабочих листов

Если необходимо определить максимальное значение в ячейке В1 в нескольких рабо­ чих листах, используется следующая формула:

=МАКС(Лист1:Л ист4! В1)

Эта

формула возвращает максимальное значение ячейки В1 для листов Лист1,

Л и с т 4

и всех листов между ними.

Что же произойдет, если добавить после листа Л и с т 4 новый лист (Л и с т 5)? Формула не будет автоматически изменена, поэтому ее необходимо отредактировать, чтобы вклю­ чить ссылку на новый лист.

=МАХ(Лист1:ЛистБ! В1)

Функция M axA llSheets, показанная ниже, получает аргумент (одна ячейка) и воз­ вращает максимальное значение в этой ячейке во всех рабочих листах данной книги. На­ пример, следующая формула возвращает максимальное значение в ячейке В1 для всех листов книги.

= M a xA llS h e e ts(В1)

При добавлении нового листа редактировать формулу необязательно.

F u n c tio n

M a x A llS h e e ts (c e ll)

 

Dim

MaxVal

As Double

 

Dim

Addr

As

S trin g

 

 

Dim

Wksht

As O b je c t

 

A p p lic a tio n . V o la tile

 

A ddr

 

= c e ll.R a n g e ( " A l" ) .A ddress

 

MaxVal = -9.9E+307

 

 

For

Each

Wksht In

c e l l . P a re n t. P a re n t.W orksheets

I f

Wksht.Name =

c e l l . Parent.Nam e And

_

 

 

Addr

= A p p lic a tio n .C a lle r .A d d re s s

Then

 

 

1 избежание

циклической ссылки

 

E lse

 

 

 

 

 

 

I f

 

 

 

 

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

373

End

I f

 

 

Next Wksht

 

 

 

I f MaxVal

=

-9.9E+307 Then MaxVal = 0

 

M axAllSheets

= MaxVal

 

End F unction

 

 

 

Оператор For

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

c e ll. P a re n t. P a re n t. W orksheets

“Родителем” ячейки является рабочий лист, “родителем” рабочего листа — рабочая книга. Следовательно, цикл For Each проходит по всем рабочим листам в книге. Пер­ вый оператор If внутри цикла проверяет, содержит ли ячейка, которая проверяется в данный момент, функцию. Если содержит, то ячейка игнорируется во избежание цикли­ ческой ссылки.

%Примечание

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

Возвращение массива случайных целых чисел без повторов

Функция Randomlntegers, представленная в этом разделе, возвращает массив це­ лых чисел без повторов. Она предназначена для применения в формуле массива в не­ скольких ячейках.

{=RandomIntegers () }

Данная формула введена в весь диапазон с помощью комбинации клавиш <Ctrl+Shift+Enter>. Она возвращает массив целых чисел без повторов, упорядоченных произвольным образом. Так как формулу содержат 50 ячеек, целые числа указываются в диапазоне от 1 до 50.

Ниже представлен код функции Randomlntegers.

Function

R an do m ln te ge rs()

 

 

 

Dim FuncRange

As

Range

 

As

V a ria n t

Dim V ()

As

V a ria n t,

V a lA rra y O

Dim C e llC o u n t

As

Double

 

 

Dim

i

As

In te g e r,

j

As

In te g e r

 

 

Dim

r

As

In te g e r,

с

As

In te g e r

V a ria n t

Dim Tempi

As

V a ria n t,

Temp2 As

Dim RCount

As

In te g e r,

CCount

As

In te g e r

'Создание объекта Range

Set FuncRange = A p p lic a tio n . C a lle r

1 Возвращение

ошибки,

если диапазон FuncRange слишком большой

CellCount =

FuncRange. Count

I f C ellC ou nt

> 1000

Then

Random lntegers =

C V E rr(xlE rrN A )

E x it F u n c tio n

 

End I f

 

 

1 Присваивание значений переменным RCount = FuncRange. Rows. Count CCount = FuncRange. Colum ns. Count ReDim V (1 To RCount, 1 To CCount)

374

 

 

 

 

 

 

 

 

 

 

 

 

 

Часть III. Visual Basic for Applications

1

ReDim

V a lA r ra y (l

To

2,

1 To

C e llC o u n t)

 

 

Заполнение

 

массива случайными номерами

 

1

и

последовательными

целыми числами

 

 

 

For

i

=

1

То C e llC o u n t

 

 

 

 

 

 

V a lA r ra y (1,

i)

=

Rnd

 

 

 

 

 

 

V a lA rra y (2,

i)

=

i

 

 

 

 

1

N ext

i

 

 

массива S o rt

V a lA rra y по произвольным числам

Сортировка

 

 

For

i

=

1

To

C e llC o u n t

 

 

 

 

 

 

 

For j

=

 

i

+

1

To

C e llC o u n t

j )

Then

 

 

 

 

I f V a lA rra y (1,

i)

> V a lA rra y (1,

 

 

 

 

 

Tempi

= V a lA rra y (1,

j)

 

 

 

 

 

 

 

Temp2

= V a lA rra y (2,

j)

i)

 

 

 

 

 

 

V a lA rra y (1,

j )

= V a lA rra y (1,

 

 

 

 

 

 

V a lA r ra y (2,

j)

= V a lA rra y (2,

i)

 

 

 

 

 

 

V a lA rra y (1,

i)

= Tempi

 

 

 

 

 

 

 

V a lA rra y (2,

i)

= Temp2

 

 

 

 

 

 

End

I f

 

 

 

 

 

 

 

 

 

 

N ext

j

 

 

 

 

 

 

 

 

 

 

 

N ext

i

 

 

 

 

 

 

 

 

 

 

 

'

Занесение

произвольных

значений в массив

V

 

i

=

О

1

То

Rcount

 

 

 

 

 

 

For

г

=

 

 

 

 

 

 

 

 

For с

=

1

То

Ccount

 

 

 

 

 

 

 

 

i

=

i

+

1

V a lA rra y (2,

i)

 

 

 

 

 

 

V (r ,

 

с)

=

 

 

 

 

 

N ext

с

 

 

 

 

 

 

 

 

 

 

 

N ext

r

 

 

 

 

= V

 

 

 

 

 

End

R andom lntegers

 

 

 

 

 

 

F u n c tio n

 

 

 

 

 

 

 

 

 

 

Расположение значений диапазона в произвольном порядке

Функция RangeRandomize, представленная ниже, получает в качестве аргумента диапазон и возвращает массив, содержащий этот диапазон с произвольно переставлен­ ными значениями.

F u n c tio n RangeRandom ize(rng)

Dim

V ()

As V a ria n t,

V a lA r ra y () As V a ria n t

Dim

C e llC o u n t As

Double

In te g e r

Dim

i

As

In te g e r,

j

As

Dim

r

As

In te g e r,

с

As

In te g e r

 

Dim

Tempi

 

As

V a ria n t,

Temp2 As

V a ria n t

 

Dim

RCount

As

In te g e r,

CCount

As

In te g e r

'

Возвращает

ошибку,

если

диапазон

слишком большой

 

C e llC o u n t

 

= rn g .C o u n t

 

 

 

 

 

I f

C e llC o u n t

> 1000

Then

 

 

 

 

RangeRandomize =

C V E rr(xlE rrN A )

 

End

E x it

F u n c tio n

 

 

 

 

 

 

I f

 

 

 

 

 

 

 

 

 

1

Присваивание

значений

переменным

 

 

RCount

=

r n g . Rows. Count

 

 

 

 

CCount

=

r n g . Colum ns. Count

 

 

 

ReDim V(1

 

To

RCount,

1

To CCount)