Здравствуйте, у меня задание.
Нужно написать подпрограмму для обработки массива (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