VBA: Написание подпрограммы для обработки массива.

Автор Лёня, 09 ноября 2017, 23:15

Лёня

Здравствуйте, у меня задание.
Нужно написать подпрограмму для обработки массива (4 на 4) по следующим критериям:
1. Сортировка второй строки по возрастанию.
2. Все отрицательные элементы k-ой строки сделать положительными, а положительные отрицательными (k – входной параметр процедуры).
Поможете? Пожалуйста.

Администратор

Макрос работает с экселем, с активным листом (это лист, который отображается на мониторе). На активный лист в ячейки A1:D4 запишите числа. И затем запустите макрос. Справа от исходных чисел будут вставлены изменённые числа.

Макрос
Sub macro()
   
    ' Создание в оперативной памяти компьютера поименованной области - массива "arr".
        ' Массив можно сравнить с обычной таблицей. Эта таблица находится в оперативной
        ' памяти компьютера.
    ' Variant - означает, что в массиве может быть текст, числа, даты, булевые значения, объекты.
        ' То есть может быть любой тип данных.
    Dim arr() As Variant
    ' У переменной "k" нужно сделать тип данных "Variant", а не Long для работы с InputBox,
        ' т.к. InputBox даёт текстовые данные.
    Dim k As Variant
   
   
    '1. Юзер указывает k-число.
    k = InputBox("Укажите k-число:")
    ' Если юзер щёлкнет "Cancel", то функция "InputBox" даст пустую строку.
    If k = "" Then Exit Sub
   
    '2. Запись данных из активного эксель-листа в массив.
    arr() = Range("A1:D4").Value
   
    '3. Сортировка. Передаём в процедуру "MySort" массив "arr".
    MySort arr()
   
    '4. Все отрицательные элементы k-ой строки сделать положительными, а положительные отрицательными.
    PositiveNegativ arr(), k
   
    '5. Вставка изменённого массива справа от исходного массива.
    Range("F1").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr()
   
End Sub

Private Sub MySort(arr() As Variant)

    ' Сортировка второй строки по возрастанию.
        ' У процедуры сделано имя не просто "Sort", а "MySort" на случай, если
        ' макрос будет вставлен модуль эксель-листа, а в эксель-листе есть объект "Sort"
        ' и будет конфликт имён.
   
   
    ' Создание в оперативной памяти компьютера поименованнной области - переменной "stol".
        ' Переменную можно сравнить с файлом. Но файл находится на жёстком диске,
        ' а переменная в оперативной памяти компьютера.
    Dim stol As Variant
    ' Long - означает, что в переменной может быть только целое число.
    Dim i As Long, j As Long
   
    ' For ... To ... Next - это цикл. Цикл используется, чтобы делать
        ' одну и ту же команду несколько раз.
    ' UBound(arr, 2) - это порядковый номер последнего столбца в массиве.
    ' Нужно сделать виктов цикла = кол-во столбцов минус 1.
    For i = 1 To UBound(arr, 2) - 1
        ' В каждом следующем витке не смотрятся ячейки в последних столбцах, т.к.
            ' в них уже будут находиться максимальные данные.
        For j = 1 To UBound(arr, 2) - i
            ' Сравнение соседних ячеек в строке 2.
            ' If ... Then ... End If - используется для выбора действия.
            ' Если текущая ячейка больше следующей, то меняем их местами.
            If arr(2, j) > arr(2, j + 1) Then
                ' Запоминаем данные одной из ячеек, иначе данные будут заменены данными
                    ' из второй ячейки.
                stol = arr(2, j)
                ' Запись в ячейки новых данных.
                arr(2, j) = arr(2, j + 1)
                arr(2, j + 1) = stol
            End If
        Next j
    Next i

End Sub

Private Sub PositiveNegativ(arr() As Variant, k As Variant)

    ' Все отрицательные элементы k-ой строки сделать положительными, а положительные отрицательными.
    ' При умножении на минус 1, отрицательные будут положительные, а положительные - отрицательные.
   
    Dim j As Long
   
    For j = 1 To UBound(arr, 2)
        ' Если это не ноль, значит это или отрицательное или положительное число.
        If arr(k, j) <> 0 Then
            arr(k, j) = arr(k, j) * -1
        End If
    Next j
   
End Sub
[свернуть]