Страницы

среда, 28 октября 2015 г.

Массивы в MS Excel - заполнение, обработка

Задается массив целых чисел А(1:n), значения элементов которого вычисляются по следующей формуле 
 Получить массив B(1:n), значения элементов которого вычисляются по указанной ниже формуле (см. столбец №1).  Вычислить значения указанных ниже выражений (см. столбец №2). По значениям элементов массива А(1:n) и по значениям элементов массива B(1:n)  построить указанные ниже диаграммы (см. соответственно столбец №3 и столбец №4).


Массив А - объемный вариант обычной гистограммы
Массив В - разрезанная кольцевая диаграмма

Вариант 1. Без программирования
Выделяем диапазон ячеек (произвольное количество, любое n). В строку формул вносим

=ОКРУГЛ(20*СЛЧИС();0) 
 затем нажимаем CTRL+SHIFT+ENTER, чтобы применить ко всему массиву. В результате каждая ячейка получит случайное целое значение от 0 до 20. А формула будет заключена в фигурные скобки.
Получаем массив В. Для этого выделяем такой же диапазон пустых ячеек и вносим в строку формул следующее выражение:

=COS(КОРЕНЬ(ABS(СТРОКА(A1:A20)-A1:A20)+SIN(A1:A20)^2))-5* (СТРОКА(A1:A20)
и нажимаем CTRL+SHIFT+ENTER.
Функции, которые используются:
COS - косинус
КОРЕНЬ – квадратный корень
ABS  - модуль числа
СТРОКА – номер строки, т.е. i
SIN - синус
^ - возведение в степень. А1:А20 и В1:В20 – это диапазоны.
В результате образуется новый массив b.
Для вычисления Q1 выделяем ячейку, вводим в строку формул -
=СУММ(A1:A20*B1:B20)/СУММ(КОРЕНЬ(A1:A20)*((B1:B20)^3)) 
и жмем CTRL+SHIFT+ENTER

Для вычисления Q2 выделяем ячейку, вводим в строку формул -
=МАКС(ABS((A1:A20)^3-(B1:B20)^3)) 
и жмем CTRL+SHIFT+ENTER
Диаграммы строятся с использованием мастера диаграмм.



При каждом обновлении массивы пересчитываются.
 
Вариант 2.
Создаем кнопку и пишем процедуру:
Private Sub btnStart_Click()
Dim n As Integer
Dim i As Integer
Dim d As Double
Dim s As String
Dim z1, z2 As Double
Dim qMax As Double
Dim q2 As Double

'Запрос на количество элементов массива
n = CInt(InputBox("Введите размер массива", "Ввод данных", "20"))
'Очищаем заполненные ранее ячейки
For i = 1 To Worksheets("arrays").UsedRange.Rows.Count
    Worksheets("Arrays").Range("A" & CStr(i)).Value = ""
    Worksheets("Arrays").Range("B" & CStr(i)).Value = ""
Next i
Worksheets("Arrays").Range("E3").Value = ""
Worksheets("Arrays").Range("E5").Value = ""

'Заполняем массивы в цикле
For i = 1 To n
    Worksheets("Arrays").Range("A" & CStr(i)).FormulaLocal = "=ОКРУГЛ(20*СЛЧИС();0)"
    d = Worksheets("Arrays").Range("A" & CStr(i)).Value
    Worksheets("Arrays").Range("B" & CStr(i)).FormulaLocal = "=COS(КОРЕНЬ(ABS(" & CStr(i) _
                              & "-" & CStr(Worksheets("arrays").Range("A" & CStr(i)).Value) _
        & ")+SIN(" & CStr(Worksheets("arrays").Range("A" & CStr(i)).Value) & ")^2))-5*" & CStr(i) & ""
    Worksheets("Arrays").Range("A" & CStr(i)).Value = d
Next i

'расчет значений Q1 и Q2
z1 = 0
z2 = 0
qMax = 0
For i = 1 To n
    z1 = z1 + Worksheets("arrays").Range("A" & CStr(i)).Value * Worksheets("arrays").Range("B" & CStr(i)).Value
    z2 = z2 + (Sqr(Worksheets("arrays").Range("A" & CStr(i)).Value)) * (Worksheets("arrays").Range("B" & CStr(i)).Value ^ 3)
    q2 = Abs((Worksheets("arrays").Range("A" & CStr(i)).Value ^ 3) - (Worksheets("arrays").Range("B" & CStr(i)).Value ^ 3))
    If qMax < q2 Then
        qMax = q2
    End If
Next i
Worksheets("Arrays").Range("E3").Value = z1 / z2
Worksheets("Arrays").Range("E5").Value = qMax
End Sub

Функции все те же. Только написаны в коде, а не введены в ячейках. Преимущество: можно выбрать любую размерность (в пределах разумного), в первом варианте пришлось бы менять формулы массивов, если бы понадобилось поменять количество элементов. Зато первый вариант попроще.