Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие по VBA.doc
Скачиваний:
109
Добавлен:
26.08.2019
Размер:
1.04 Mб
Скачать

Vba2. Разветвления

Вычислить значения функций в области определения х [-1.7,1.5].

Y = (1+x)/(1+ )

f = cos2(3x) - cos(x)sin(x)

 = 3.14159265 ( можно также вычислить как функцию ПИ( ) )

, x<=0

g =

( 1+x)/(1+ ), x >0

(1+x+x2)/(1+x2), x<0

z = , x>=0 и x<1

2 Abs(0.5+Sin(x)), x>=1

Для вычислений на листе Excel (см. приведенный ниже рисунок) разместить поля (TextBox) с именами TBx, TBy, TBf, TBg, TBz. Рядом с полями поместить надписи x, y, f, g, z. Кроме того, на лист Excel поместить кнопку CommandButton1 и написать процедуру для вычисления указанных функций. Если заданное значение x не попадает в область определения функции, то в соответствующее поле занести пробел.

Vba3. Переменные, процедуры, функции, циклы, массивы

Предположим, что на листе Excel в диапазоне ячеек (R1C1 : RmCn) находится таблица данных, а ячейки столбца n+1 и строки m+1, примыкающие к таблице, - пусты.

1 2 3 - номера столбцов: j=1,…..,n

Требуется разместить на листе Excel командную кнопку с заголовком Вычислить, а в модуль, соответствующий листу Excel, включить подпрограммы-функции Mrow и Ncol для определения m и n, процедуру TabA для копирования таблицы с листа Excel в двумерный массив A, а также событийную процедуру, которая должна включать в себя:

  1. резервирование переменных i, j, m, n типа Integer,

  2. резервирование переменной S типа Single,

  3. резервирование массива A без указания его размерности, т.е. Dim A( ) As Single,

  4. определение m и n путем использования функций Mrow и Ncol,

  5. переопределение размерности массива A, т.е. ReDim A (1 To m, 1 To n),

  6. копирование таблицы в массив A с помощью процедуры TabA,

  7. вычисление и размещение в строке, имеющей номер m+2, сумм по столбцам.

Рекомендации.

Для определения m и n в функциях Mrow и Ncol применить циклы типа Do-Loop:

Function Mrow() As Integer

Dim i As Integer

i = 1

Do Until IsEmpty (Cells(i, 1))

i = i + 1

Loop

Mrow = i - 1

End Function

Процедура TabA должна иметь следующий заголовок:

Sub TabA(m As Integer, n As Integer, A( ) as Single)

Для копирования таблицы в массив A использовать двойной цикл типа For-Next:

For i=1 To m

For j=1 To n

A(i,j)=Cells(i,j).Value

Next j

Next i

Для вычисления сумм столбцов в событийной процедуре также использовать двойной цикл, полагая, что исходные данные находятся в массиве A. Здесь внешний цикл - по j. Он включает в себя начальное присваивание S=0, цикл по i, в котором наращивается значение S, и, наконец, присваивание j-го результата: Cells(i,j).Value = S

Vba4. Сортировка чисел в столбце по возрастанию или убыванию

  1. На листе Excel для создания интерфейса пользователя разместите элементы управления: надпись Номер столбца; поле TextBox1 и счетчик SpinButton1 для указания номера столбца; переключатели Option1, Option2 с надписями По возрастанию, По убыванию и кнопку с надписью Сортировать - см. рисунок.

2. Для поля TextBox1 и для счетчика SpinButton1 установите свойство Value=1. Кроме того, для счетчика установите значения свойств Min=1 и Max=20. Для счетчика создайте событийную процедуру SpinButton1_Change() - при изменении пользователем значения счетчика она должна изменять значение TextBox1.Value, делая его равным значению счетчика. Точно так же для поля TextBox1 создайте событийную процедуру TextBox1_Change() – она должна изменять значение (свойство Value) счетчика, как только пользователь изменит значение, хранимое в текстовом поле.

  1. Создайте событийную процедуру, соответствующую командной кнопке. Эта процедура должна определить номер j столбца, подлежащего сортировке, количество чисел m в этом столбце и выполнить сортировку методом пузырька. В процедуре зарезервируйте целые переменные i, j, m, переменную F типа Variant и переменные Flag и R типа Boolean. Процедура сортировки методом пузырька может включать следующие блоки:

  1. Flag=False (признак того, что еще не было перестановок чисел в столбце j); i=2;

  2. R = Cells(i-1,j).Value - Cells(i,j).Value (R=True, если значение в ячейке i-1 больше, чем в i);

  3. если надо сортировать по возрастанию, то R = Cells(i,j).Value - Cells(i-1,j).Value;

  4. если R=True, то исполняется блок 5;

  5. F = Cells(i-1,j).Value; Cells(i-1,j).Value = Cells(i,j).Value; Cells(i,j).Value = F ; Flag=True; (перестановка чисел, регистрация этого факта путем присваивания Flag=True)

  6. i=i+1; если i <= m , то передача управления блоку 2 - для сравнения следующей пары чисел;

  7. Если Flag =True, то передача управления блоку 1, иначе конец, т.к. перестановок не было.