Sub SumUpMatrixPositives()
'просуммирует положительные значения матрицы, находящиеся выше главной ее диагонали
Dim rr As Range, r As Range
Dim s As Double
Dim af As WorksheetFunction
'предополагается, что матрица выделена на активном листе в активном листе Excel
Set af = Application.WorksheetFunction
Set rr = ActiveWindow.RangeSelection
'на всякий случай исправим выделение, если оно оказалось неквадратным
'- приведем размеры выделения к минимальному из количества строк или столбцов выделенной области
Set rr = rr.Resize(af.Min(rr.Rows.Count, rr.Columns.Count), af.Min(rr.Rows.Count, rr.Columns.Count))
rr.Select
'НАЧАЛО решения
'
'начальное значение суммы
s = 0#
'начало цикла по всем ячейкам выделенной области
For Each r In rr.Cells
'у элементов выше главной диагонали индекс строки меньше индекса столбца
'если очередной элемент - элемент выше главной диагонали то
If r.Row < r.Column Then
'если этот элемент больше 0, то добавить в сумму
If r.Value > 0 Then s = s + r.Value
End If
'конец цикла
Next r
'вывод результата суммы
MsgBox s
End Sub
только скажи пожалуйста как переписать нужные мне числа в массив не суммируя! (мне нужно их потом вывести в столбик)
кстати, начало программы такое:
Sub matrix7()
Dim a(20, 20), b(20, 20) As Single
Dim i, j As Integer
Application.ActiveSheet.Cells.Clear
'ввод матрицы
For i = 1 To 7
For j = 1 To 7
a(i, j) = Rnd(1) * 100
Cells(i, j) = a(i, j) 'вводит значения ячеек
Cells.NumberFormat = "0" 'округляет
Next j
Next i
'если этот элемент больше 0, то добавить в сумму
If r.Value > 0 Then s = s + r.Value
End If
можно переписать так:
'если этот элемент больше 0, то добавить в сумму и записать в столбик
If r.Value > 0 Then
s = s + r.Value
j = j + 1
r1.Offset(j - 1,0).Value = r.Value
End If
End If
здесь:
r1 - верхняя ячейка столбца, куда должны быть переписаны положительные значения из матрицы выше главной диагонали (можно написать в начале процедуры Set r1 = Cells(1,22) - чтобы вывод выбранных элементов начался с первой строки 22-го столбца активного листа активной книги или сделать что-либо другое нужное);
j = 0 - должно быть установлено до начала цикла - будет счетчиком внесенных элементов в столбик - это и будет значением подсчитанного количества суммированных элементов матрицы по окончанию цикла.
То все полученные значения матрицы будут положительными всегда, т.к. Rnd возвращает значение между 0 и 1. Если хотите увидеть и отрицательные значения сделайте так:
a(i, j) = Rnd(1) * 200 - 100
или
a(i, j) = (Rnd(1) - 0.5) * 200
А чтобы соединить Ваше начало с моим кодом напишите после Вашего начала
Set rr = Range(Cells(1,1), Cells(7,7))
далее все должно подойти после слов "НАЧАЛО решения"
PS: Несколько непонятно, почему у Вас в начале объявляются массивы размерностью (20,20), но потом используется их размер толко (7,7).
спасибо за подсказку. Как я сам не догадался, что индекс строки меньше индекса столбца?
массив 20х20 так как матрица должна быть 20х20, а я проверяю на маленькой
существует только одна проблема - иногда прога показывает общую сумму чисел на единицу больше, иногда правильно. Почему?
вот что получилось:
Sub matrix7()
Dim a(20, 20), b(20, 20) As Single
Dim i, j As Integer
Application.ActiveSheet.Cells.Clear 'очищаем активный лист
'ввод матрицы
For i = 1 To 3
For j = 1 To 3
a(i, j) = -50 + Rnd(1) * 100 'вводит значения массива
Cells(i, j) = a(i, j) 'вводит значения из массива в ячейки
Cells.NumberFormat = "0" '*округляет
Next j
Next i
'находим количество положительных элементов и их сумму
количПоложительных = 0
общаяСумма = 0
For i = 1 To 3
For j = 1 To 3
If i = j Then Cells(i, j).Font.Bold = True '*выделяет главную диагональ жирным
If i < j Then b(i2, j2) = a(i, j) '!!!!!!
If b(i2, j2) > 0 Then количПоложительных = количПоложительных + 1 'считает количество положительных
общаяСумма = общаяСумма + b(i2, j2) 'сумма положительных
b(i2, j2) = 0
Next j
Next i
'выводим общую сумму на лист
Cells(15, 13) = "сумма чисел выше диагонали:"
Cells(15, 14) = общаяСумма
'выводим количество положительных элементов на лист
Cells(14, 13) = "кол-во положительных:"
Cells(14, 14) = количПоложительных
Columns.AutoFit '*делает выравнивание ширины колонок
End Sub
Дело в том, что Вы на самом деле не округляете значения в ячейках, а только форматируете их, обрубая из видимости дробные части их значений:
Cells(i, j) = a(i, j) 'вводит значения из массива в ячейки
Cells.NumberFormat = "0" '*округляет
Чтобы сумма была верной либо действительно округляйте, либо рассматривайте и дробную часть результата (переменная общаяСумма у Вас за отстутвием объявления по умолчанию является Variant, а значит скорее всего содержит Действительное число с дробной частью):
Например, можно сделать округление значений массива на этапе его заполнения:
Sub matrix7()
Dim a(3, 3), b(3, 3) As Single
Dim i, j As Integer
Application.ActiveSheet.Cells.Clear 'очищаем активный лист
'ввод матрицы
For i = 1 To 3
For j = 1 To 3
a(i, j) = Round(-50 + Rnd(1) * 100, 0) 'вводит значения массива и округляет!!
Cells(i, j) = a(i, j) 'вводит значения из массива в ячейки
Next j
Next i
'находим количество положительных элементов и их сумму
количПоложительных = 0
общаяСумма = 0
суммаПоложит = 0
For i = 1 To 3
For j = 1 To 3
If i = j Then Cells(i, j).Font.Bold = True '*выделяет главную диагональ жирным
If i < j Then b(i2, j2) = a(i, j) '!!!!!!
If b(i2, j2) > 0 Then количПоложительных = количПоложительных + 1 'считает количество положительных
общаяСумма = общаяСумма + b(i2, j2) 'сумма всех выше диагонали
If b(i2, j2) > 0 Then суммаПоложит = суммаПоложит + b(i2, j2) 'считает сумму положительных
b(i2, j2) = 0
Next j
Next i
'выводим общую сумму на лист
Cells(15, 13) = "сумма чисел выше диагонали:"
Cells(15, 14) = общаяСумма
'выводим количество положительных элементов на лист
Cells(14, 13) = "кол-во положительных:"
Cells(14, 14) = количПоложительных
Cells(16, 13) = "сумма положительных чисел выше диагонали:"
Cells(16, 14) = суммаПоложит
Columns.AutoFit '*делает выравнивание ширины колонок
End Sub
Здравствуйте! помогите пожалуйста!
Вычислить суммы элементов главных диагоналей матриц А(N,N), B(M,M) N<=20, M<=20
Задание на использование в программе функций(программ. в Excel)