Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование в Excel.doc
Скачиваний:
21
Добавлен:
03.05.2019
Размер:
1.48 Mб
Скачать

1.3.3. Вложение управляющих конструкций

Управляющие конструкции можно включать друг в друга, например, вставить блок If...Then внутрь цикла For Each...Next, который в свою очередь находится в другом блоке If...Then и т. д. Такие конструкции называются вложенными.

В следующем примере мы просматриваем заданный диапазон ячеек и подсчитываем число ячеек, содержащих определенное значение:

Function CountValues(rangeToSearch, searchValue)

If TypeName(rangeToSearch) <> "Range" Then

MsgBox "You can search only a range of cells."

Else

For Each с In rangeToSearch.Cells

If c.Value = searchValue Then

counter = counter + 1

EndIf

Next с

EndIf

CountValues = counter

End Function

Заметьте, что первый оператор EndIf закрывает внутренний блок If...Then, а последний оператор End If — внешний. По аналогии, в случае вложенных циклов For...Next и For Each...Next операторы Next автоматически применяются к ближайшему предыдущему оператору For или For Each. Вложенные конструкции Do...Loop ведут себя сходным образом.

1.3.4. Выход из циклов и процедур

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

Например, осуществляя поиск в массиве в цикле For...Next и найдя нужное значение уже на первой итерации, нет смысла просматривать остальную часть массива — разумнее тут же прекратить цикл и перейти к следующим за ним операторам. Для таких случаев предназначены операторы Exit.

Хотя операторы Exit очень удобны, используйте их только при крайней необходимости, а не при нормальном ходе выполнения процедуры или цикла. Злоупотребление операторами Exit затруднит чтение и отладку Вашего кода.

Кроме того, для пропуска части кода можно придумать и более подходящие способы. Например, при поиске значения в массиве внутрь цикла For...Next вместо оператора Exit можно поставить оператор Do...Loop, чтобы поиск шел только до тех пор, пока текущее значение индекса меньше верхней границы массива и значение переменной типа Boolean равно False (см. пример ниже). Когда искомое значение найдено, переменная типа Boolean устанавливается как True, и цикл прекращается.

i = LBound(searchArray) ub = UBound(searchArray) foundIt = False Do if searchArray(i) = findThis Then foundIt = True i = i+1 Loop While i <= ub And Not ftoundIt

Для досрочного выхода из оператора Do...Loop используется оператор Exit loop, а для досрочного выхода из цикла For - оператор Exit For:

For Each с In rangeToSearch if c.Value = searchValue Then found = True Exit For End If Next

Для досрочного выхода из процедур служат операторы Exit Sub и Exit Function:

For Each c In rangeToSearch if c.Value = searchValue Then counter = counter + 1 Elself c.Value = "Bad Data" Then countValues = Null Exit Function ' прекращаем проверку и немедленно выходим End If Next с

1.4. Структура программы

Структурно любая программа включает в себя:

1. Заголовок (Sub или Function).

2. Комментарии (назначение программы, используемые переменные, метод решения задачи и т.д.).

3. Описание переменных и массивов (размерность массива, тип переменной).

Описание переменных и массивов резервирует место в оперативной памяти для размещения в них данных определенного типа, поэтому для корректной работы программы описание является обязательным.

4. Объявление констант.

5. Чтение данных из внешних файлов или листов книги Excel.

6. Управляющие конструкции (операторы присвоения, циклов, ветвления, вызова подпрограмм, работы с объектами).

7. Вывод результатов во внешние файлы или на листы книги Excel.

8. Конец программы (End Sub или End Function).

Лабораторная работа 1.

Составление алгоритма вычисления значений таблично заданной функции.

Задание:

1. Составить алгоритм и программу решения задачи:

1.1. Вычисление суммы N слагаемых.

1.2. Вычисление произведения N сомножителей.

1.3. Вычисление значений функции в фиксированном количестве точек.

2. Составить программу вычисления функции:

Функция

Условие

Исходные данные

Диапазон и шаг изменения аргумента

1

2

3

4

5

6

7

8

-

9

10

11

12

13

14

15

Порядок создания макроса:

1. Выбрать меню «Сервис» «Макрос» «Макросы» или [Alt]+[F8].

2. В окне диалога «Макросы» в строку «Имя» ввести имя макроса без пробелов и выбрать кнопку «Создать»

3. В открывшемся окне среды Visual Basic между операторами Sub и End Sub записать операторы программы.

Порядок выполнения макроса:

1. Из среды Visual Basic: меню «Запуск».

2. Из рабочего листа: «Сервис» «Макрос» «Макросы» или [Alt]+[F8], затем в списке макросов выбрать нужный и нажать кнопку «Выполнить» в окне диалога «Макросы».

Программа-макрос для 1-го варианта:

Параметры и исходные данные заданы на активном листе в ячейках D2:D6, результаты – столбец аргументов и значений функции размещаются в столбцах С и D, начиная с 10 ряда.

Sub Вариант1()

‘Чтение переменных из ячеек D2- D6 активного (открытого) рабочего Листа

a = Range("D2")

b = Range("D3")

tmin = Range("D4")

tmax = Range("D5")

deltat = Range("D6")

i = 0 ‘ счетчик числа аргументов

For t = tmin To tmax Step deltat

If t < 1 Then

Fun = 1

ElseIf 1 <= t <= 2 Then

Fun = a * t ^ 2 * Log(t)

ElseIf t > 2 Then

Fun = Exp(a * t) * Cos(b * t)

End If

i = i + 1

‘Вывод переменных аргумента t и значения функции Fun в ячейки столбцов С и ‘D соответственно, начиная с 10 ряда;

‘функция Str$() преобразует число в строковую переменную;

‘функция LTrim$() отсекает от строковой переменной все пустые значения ‘слева;

‘оператор “+” стыкует (коннектирует) строковые переменные в одну строку,

‘т.е. результат действия "C" + LTrim$(Str$(9)) есть строка "C10"

Range("C" + LTrim$(Str$(9 + i))) = t

Range("D" + LTrim$(Str$(9 + i))) = Fun

Next t

End Sub

Лабораторная работа 2.

Поиск экстремума функции

Задание:

1. Составить алгоритм и программу вычисления экстремума функции:

Вариант задания

Вид функции

y=f(x)

Вид экстре-мума xэкстр

Диапазон измене-ния аргумен-та

«Грубое значение шага» h

Точность вычисле-ния экстре-мума

1

2+x-x2

Максимум 0,5

[0;1,0]

0,15

10-5

2

(1-x)4

Минимум 1,0

[0,2;1,5]

0,25

0,5*10-4

3

cos x+ch x

Минимум 0,0

[-0,8;0,4]

0,25

10-5

4

Максимум 0,333333

[0,1;0,6]

0,1

10-5

5

x3-6x2+9x+4

Максимум 1,0

[0,2;1,5]

0,3

10-5

6

x3-6x2+9x+4

Минимум 3,0

[2;4]

0,3

0,5*10-5

7

2x2-x4

Минимум 0,0

[-2;0,8]

0,15

10-4

8

Минимум 1,4

[1;2]

0,15

0,5*10-4

9

Минимум 0,75

[0,1;1,2]

0,2

10-5

10

xe-x

Максимум 1,0

[0,1;1,5]

0,25

10-5

11

ln2x/x

Максимум 7,389

[6;8]

0,15

10-5

12

x+1/x

Минимум 1,0

[0,1;1,5]

0,2

10-4

13

Максимум 1,0

[0,15;1,5]

0,2

10-5

14

Максимум –1,0

[-2;-0,5]

0,15

10-5

15

ln2x/x

Минимум 1,0

[0,1;1,9]

0,9

10-4

Программа-макрос для 1-го варианта:

Параметры и исходные данные заданы на активном листе в ячейках D1:D7, результаты – столбец аргументов и значений функции размещаются в столбцах F и G, начиная с 1 ряда, последняя строка таблицы – аргумент и значение экстремума.

Sub Вариант1()

a = Range("D1")

b = Range("D2")

c = Range("D3")

Xmin = Range("D4")

Xmax = Range("D5")

deltaX = Range("D6")

eps = Range("D7")

'расчет функции для построения таблицы и диаграммы

i = 1

For X = Xmin To Xmax Step deltaX

Y = a * X ^ 2 + b * X + c

Range("F" + LTrim$(Str$(i))) = X

Range("G" + LTrim$(Str$(i))) = Y

i = i + 1

Next X

Ymax = 0

Do

X = Xmin

Y0 = Ymax

Do

Y = a * X ^ 2 + b * X + c

Y1 = a * (X + deltaX) ^ 2 + b * (X + deltaX) + c

X = X + deltaX

Loop While Y1>Y

XYmax = X - deltaX

Ymax = Y

Xmin = XYmax - deltaX

deltaX = deltaX / 10

Loop While Abs(Ymax-Y0)>eps

Range("F" + LTrim$(Str$(i))) = XYmax

Range("G" + LTrim$(Str$(i))) = Ymax

End Sub