Как найти максимальный элемент двумерного массива vba

10 / 10 / 2

Регистрация: 10.02.2011

Сообщений: 115

1

Найти максимальный элемент двумерного массива

22.05.2013, 10:36. Показов 4760. Ответов 13


Студворк — интернет-сервис помощи студентам

Написать функцию или процедуру, осуществляющую заданные вычисления,

Нужно найти максимальный элемент двумерного массива и его индексы.

Желательно через процедуру, и размер не меньше 16 элементов ( например В (4,4) )



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

22.05.2013, 10:36

13

4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

22.05.2013, 11:37

2

Здравствуйте. А как предыдущее? Здали?
При герерировании массива (если не записывать руками) может быть в разных местах несколько значений максимума. И как Вам надо? Только первый попавшийся, или все?



1



10 / 10 / 2

Регистрация: 10.02.2011

Сообщений: 115

22.05.2013, 11:40

 [ТС]

3

Цитата
Сообщение от Igor_Tr
Посмотреть сообщение

Здравствуйте. А как предыдущее? Здали?
При герерировании массива (если не записывать руками) может быть в разных местах несколько значений максимума. И как Вам надо? Только первый попавшийся, или все?

Ну самый максимальный нужен, если два одинаковых максимальных то я думаю тот который последний, да спасибо, все зачли!



0



Igor_Tr

4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

22.05.2013, 12:27

4

Пробуйте, а то я делаю на перекурах. Ну и чтоб преподу не было мало значений, немного увеличил.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Sub mMAX()
Dim i&, j&, nR&, nC&, mARR(), currCell As Range
Dim mFlag As Boolean
' Раз нужно последний max - значит будет последний!
nR = 20: nC = 12: ReDim mARR(1 To nR, 1 To nC): mFlag = False
    With ActiveSheet
        .Cells.ClearContents
        Randomize
            For Each currCell In Range(.Cells(1, 1), .Cells(nR, nC))
                mARR(currCell.Row, currCell.Column) = Int((100 * Rnd()) + 1)
            Next
            For i = UBound(mARR, 1) To LBound(mARR, 1) Step -1
                For j = UBound(mARR, 2) To LBound(mARR, 2) Step -1
                    If mARR(i, j) = Application.Max(mARR) Then
                        mFlag = True
                        Exit For
                    End If
                Next 'j
                If mFlag = True Then Exit For
            Next 'i
'сообщаем:
        MsgBox "MAXVALUE is" & Space(3) & Application.Max(mARR) & _
                    Chr(13) & String(20, "-") & Chr(13) & _
                    "This value lies in:" & Chr(13) & _
                    Space(12) & "Row " & i & ";" & Space(3) & "Column " & j & "."
 'И на лист:
        .Cells(1, 1).Resize(UBound(mARR, 1), _
                                UBound(mARR, 2)).Value = mARR
            With .Cells(Rows.Count, 1).End(xlUp)
                .Offset(2, 0).Value = "MAXVALUE is"
                .Offset(2, 2).Value = Application.Max(mARR)
                .Offset(4, 0).Value = "This value lies in:"
                .Offset(4, 2).Value = "Row " & i
                .Offset(5, 2).Value = "Column " & j
            End With
    End With
    MsgBox Space(12) & "D O N E!"
End Sub



1



10 / 10 / 2

Регистрация: 10.02.2011

Сообщений: 115

22.05.2013, 12:52

 [ТС]

5

Igor_Tr, Огромное СПАСИБО. Но сейчас нет возможности проверить , только вечером

ПАРДОН, предполагается что все элементы матрицы различны , и элементы нужно брать из листа…. И матрица В ( 4,4) нужна…



0



4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

22.05.2013, 15:00

6

Не цитируйте (полностью). Занимает место и отвлекает.
Вот смотрите.
1. Допустим у Вас есть матрица из 1000 значений. Пускай все 999 значений равно 1, и одно равно 2. Ваша задача чемто меняется? Нужно найти 2? Нужно. Нужно определить координаты размещения этой единственной двойки? Нужно. А кто ставил задачу про матрицу уникальных? Не вопрос, но Вы уверены, что и доп. вопросов от препода не будет больше?
2. Вам поставили задачу получить массив считыванием из листа. Я правильно понял? Подтвердите. Если да — то легким движением за 1-2 мин.



1



10 / 10 / 2

Регистрация: 10.02.2011

Сообщений: 115

22.05.2013, 15:46

 [ТС]

7

[QUOTE=Igor_Tr;4597018]Не цитируйте (полностью). Занимает место и отвлекает.
Вот смотрите

Да заполняться нужно из листа exel, но числа не нужно самому вводить… Тоесть в ячейках В(4,4) они должны заполняться рандомно ….



0



Igor_Tr

4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

22.05.2013, 15:48

8

Вот Вам так. Тоже самое, только создание матрицы на листе вынесено в другую процедуру. Хотите сами заносить руками — удалите процедуру Sub CreateARRAY() полностью, а из процедуры Sub mMAX() удалите это:

Call CreateARRAY

Но вот если Ваш препод не хуже меня умеет хохотать (а мне, почему-то, кажется, что так и есть), и даст Вам задачу с матрицей 10’000 * 250 (как мин.), как заполнять будете? Оооо! Я бы хотел на это посмотреть!!! А рандомно — это вот это и есть Randomize.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Sub mMAX()
Dim i&, j&, nR&, nC&, arrNEW(), currCell As Range
Dim mFlag As Boolean
' Раз нужно последний max - значит будет последний!
'----------------------------------
    Call CreateARRAY
'===========================
    With ActiveSheet
        arrNEW = .Cells(1, 1).CurrentRegion.Value
            For i = UBound(arrNEW, 1) To LBound(arrNEW, 1) Step -1
                For j = UBound(arrNEW, 2) To LBound(arrNEW, 2) Step -1
                    If arrNEW(i, j) = Application.Max(arrNEW) Then
                        mFlag = True
                        Exit For
                    End If
                Next 'j
                If mFlag = True Then Exit For
            Next 'i
'сообщаем:
        MsgBox "MAXVALUE is" & Space(3) & Application.Max(arrNEW) & _
                    Chr(13) & String(20, "-") & Chr(13) & _
                    "This value lies in:" & Chr(13) & _
                    Space(12) & "Row " & i & ";" & Space(3) & "Column " & j & "."
 'И на лист:
            With .Cells(Rows.Count, 1).End(xlUp)
                .Offset(2, 0).Value = "MAXVALUE is"
                .Offset(2, 2).Value = Application.Max(arrNEW)
                .Offset(4, 0).Value = "This value lies in:"
                .Offset(4, 2).Value = "Row " & i
                .Offset(5, 2).Value = "Column " & j
            End With
        Union(.Rows(i), .Columns(j)).Select: .Cells(i, j).Activate
    End With
    MsgBox Space(12) & "D O N E!"
End Sub
 
Sub CreateARRAY()
Dim nR&, nC&, mARR(), currCell As Range
Dim mFlag As Boolean
    nR = 20: nC = 10: ReDim mARR(1 To nR, 1 To nC)
    With ActiveSheet
        .Cells(1, 1).Select
        .Cells.ClearContents
        Randomize
            For Each currCell In Range(.Cells(1, 1), .Cells(nR, nC))
                mARR(currCell.Row, currCell.Column) = _
                            Int((777 - (-555) + 1) * Rnd) + (-555)
            Next
        .Cells(1, 1).Resize(UBound(mARR, 1), _
                                UBound(mARR, 2)).Value = mARR
    End With
End Sub



1



10 / 10 / 2

Регистрация: 10.02.2011

Сообщений: 115

22.05.2013, 18:22

 [ТС]

9

Примного Вам благодарен

Добавлено через 2 часа 27 минут
[QUOTE=Igor_Tr;4597258]Вот Вам так.

Спасибо Вам конечно но как то вы слишком сильно там намудрили … ))))



0



4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

22.05.2013, 18:32

10

Там на треть можно код урезать, думаю, но тогда бы Вы точно…. Я, понимаешь, стараюсь, стараюсь, что бы как можно проще, а меня умником обзывают. Караул!!! Спасибо, хоть не «дважды не судимым проффэссором».
Посмотрел еще раз. Ничего такого особенного не вижу. Только может Вас это смущает?:
Union(.Rows(i), .Columns(j)).Select: .Cells(i, j).Activate
Это то, что выделяет строку и столбец с максимумом и активирует нужную ячейку. Можете убрать, если не нужно.



1



10 / 10 / 2

Регистрация: 10.02.2011

Сообщений: 115

22.05.2013, 18:50

 [ТС]

11

[QUOTE=Igor_Tr;4598401]Там на треть можно код урезать, думаю, но тогда бы Вы точно….

Да нет все прекрасно, но от нас такой красоты не требуют ))) ну если что не понравиться я уже сам постараюсь исправить! Еще раз спасибо!»



1



4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

22.05.2013, 19:04

12

Спасибо, развеселил! Это как понимать «не требуют». Типа: «Берем Fiat и делаем Жигуль»?



1



10 / 10 / 2

Регистрация: 10.02.2011

Сообщений: 115

22.05.2013, 21:22

 [ТС]

13

Цитата
Сообщение от Igor_Tr
Посмотреть сообщение

Спасибо Типа: «Берем Fiat и делаем Жигуль»?

Не это что то вроде берем самое простое, и рационально, коротенько пишем программу!



0



4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

22.05.2013, 21:58

14

Тогда посоветую — функции листа MAX, INDEX, MATCH. Сначала первая, потом совместно две последние. И все запихать в VBA (если нужно через VBA). Я бы сочинял что-то такое. Будет проще. А в обратную сторону — «Берем Жигуль и делаем Fiat»…. Меня в институте учили — иногда лучше все разломать и сделать снова.

Добавлено через 26 минут
Даже интересно стало. Вы когда насокращаете — хоть покажите. И мне, и другим очень интересно. !!!Здесь я серьйозный. А такое редко!!!



1



на сайте

http://msoffice.nm.ru/faq/macros/variables.htm#faq548  

примеры посмотрел  
Sub primer()  
Dim iMassiv()  

  ‘Здесь идёт заполнение массива некими данными  
iMassiv = [a1:e10].Value
MsgBox Join(Application.Transpose(Application.Index(iMassiv, 0, 1)), vbNewLine), , «Первый столбец :»  

  ‘или так  

  With Application  
    MsgBox Join(.Transpose(.Index(iMassiv, 0, 3)), _  
    Chr(10)), , «Третий столбец :»  
End With  

  With WorksheetFunction  
    MsgBox Join(.Transpose(.Index(iMassiv, 0, 5)), _  
    Chr(13)), , «Пятый столбец :»  
End With  

  Dim iAverage#, iMin#, iMax#, iSum#, iProduct  

  ‘    For iCount = 1 To 100  
‘        iMassiv(iCount) = Rnd * 1000  
‘    Next  

     With Application  
        iAverage = .Average(iMassiv)  
        iMin = .Min(.Transpose(.Index(iMassiv, 0, 3)))  
        iMax = .Max(.Transpose(.Index(iMassiv, 0, 4)))  
        iSum = .Sum(iMassiv)  
        iProduct = .Product(iMassiv)  
   End With  
End Sub



VBA — универсальный язык программирования. С помощью его можно создавать полноценные приложения на Visual Basic, поскольку эти языки — близкие родственники. Создавать программы на нем можно очень быстро и легко, не нужно заботиться об установке и настройке среды программирования и наличии нужных библиотек на компьютере пользователя — MS Office есть практически на любом компьютере. Рассмотрим пример создания программы с использованием двумерных массивов.

Удобство среды VBA заключается в том, что она внедрена в пакет прикладных программ Microsoft Office и, соответственно, является доступной практически на любом ПК, не требует установки дополнительного программного обеспечения.

Немногие учителя используют в своей работе возможности так называемого офисного программирования. С помощью языка VBA можно создавать различные проекты, которые пригодны к использованию, в том числе на уроках информатики.

Массив — набор однотипных переменных, объединенных одним именем и доступных через это имя и порядковый номер переменной в наборе. Организуем в электронных таблицах Excel двумерный массив А, состоящий из 20 х 10 = 200 элементов. Для этого в Excel создадим поле, в котором определим элементы массива целыми случайными числами от 1 до 100.

Рис. 1. Поле двумерного массива в Excel

Перейдём во вкладку Разработчик → Visual Basic. Затем вкладка Insert → Module. Откроется окно для создания программного кода.

Рис. 2. Окно для создания программного кода

Sub Двумерный_Массив()

Dim A(20, 10) As Integer

For i = 1 To 20 ‘Число строк в массиве

For j = 1 To 10 ‘Число столбцов в массиве

A(i, j) = Int(Rnd * 100 + 1) ‘Задание массива целыми числами от 1 до 100

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

Next j

Next i

При выполнении программы на активном листе Excel образуется следующее поле:

Рис. 3. Заполнение двумерного массива в Excel

Определим переменные для нахождения максимального, минимального, среднего значения в таблице, кроме того, вычислим сумму и размах таблицы. Все перечисленные переменные целые, кроме действительного среднего значения. Присвоим им соответствующие типы данных: Dim Max, Min, Сумма, Размах As Integer, Среднее As Single.

Используя принцип математической индукции, найдём наибольшее и наименьшее значения таблицы: If A(i, j) >Max Then Max = A(i, j)

If A(i, j) < Min Then Min = A(i, j)

Для вычисления суммы: Сумма = Сумма + A(i, j), среднего значения: Среднее = Сумма / 200, размаха таблицы: Размах = Max — Min. Результат программы будет следующий:

Sub Двумерный_Массив()

Dim A(20, 10) As Integer

Dim Max, Min, Сумма, Размах As Integer, Среднее As Single

Max = 0 ‘Начальное значение Максимального элемента в массиве

Min = 100 ‘Начальное значение Минимального элемента в массиве

Сумма = 0

For i = 1 To 20 ‘Число строк в массиве

For j = 1 To 10 ‘Число столбцов в массиве

A(i, j) = Int(Rnd * 100 + 1) ‘Задание массива целыми числами от 1 до 100

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

If A(i, j) >= Max Then Max = A(i, j) ‘Вычисление Максимального элемента в массиве

If A(i, j) <= Min Then Min = A(i, j) ‘Вычисление Минимального элемента в массиве

Сумма = Сумма + A(i, j) ‘Вычисление Суммы

Next j

Next i

Среднее = Сумма / 200 ‘Вычисление Среднего значения

Размах = Max — Min

Range(«A22″).Value = «Max =»

Range(«A23″).Value = «Min =»

Range(«A24″).Value = «Сумма =»

Range(«A25″).Value = «Среднее =»

Range(«A26″).Value = «Размах =»

Range(«B22″).Value = Max

Range(«B23″).Value = Min

Range(«B24″).Value = Сумма

Range(«B25″).Value = Среднее

Range(«B26″).Value = Размах

End Sub

Для создания копии таблицы, сдвинем её на 11 позиций вправо.

‘Создание копии таблицы

For i = 1 To 20

For j = 1 To 10

Cells(i, j + 11) = A(i, j)

Next j

Next i

Наглядно видно, что перед нами копия таблицы.

Рис. 4. Копия таблицы

С этой таблицей мы может выполнять какие-либо действия, например: Заменим все числа кратные 2 на 2, кратные 3 на 3, кратные 5 на 5, остальные на «*». Произведём подсчёт таких чисел. Для этого добавим строки:

‘Обработка таблицы

Dim Кратные2, Кратные3, Кратные5, Звезд As Integer

Кратные2 = 0

Кратные3 = 0

Кратные5 = 0

Звезд = 0

For i = 1 To 20

For j = 1 To 10

If A(i, j) 2 = A(i, j) / 2 Then Cells(i, j + 22) = 2

If A(i, j) 3 = A(i, j) / 3 Then Cells(i, j + 22) = 3

If A(i, j) 5 = A(i, j) / 5 Then Cells(i, j + 22) = 5

If A(i, j) 2 <> A(i, j) / 2 And A(i, j) 3 <> A(i, j) / 3 And A(i, j) 5 <> A(i, j) / 25 Then Cells(i, j + 22) = «*»

If A(i, j) 2 = A(i, j) / 2 Then Кратные2 = Кратные2 + 1 ‘Подсчёт количества чисел кратных 2

If A(i, j) 3 = A(i, j) / 3 Then Кратные3 = Кратные3 + 1 ‘Подсчёт количества чисел кратных 3

If A(i, j) 5 = A(i, j) / 5 Then Кратные5 = Кратные5 + 1 ‘Подсчёт количества чисел кратных 5

If Cells(i, j + 22) = «*» Then Звезд = Звезд + 1 ‘Подсчёт количества «*»

Next j

Next i

Range(«D22″).Value = «Таблица»

Range(«O22″).Value = «Копия Таблицы»

Range(«Z22″).Value = «Обработанная таблица»

Range(«W22″).Value = «Кратные 2″ ‘Вывод результатов

Range(«W23″).Value = «Кратные 3″

Range(«W24″).Value = «Кратные 5″

Range(«W25″).Value = «Кол-во *»

Range(«X22″).Value = Кратные2

Range(«X23″).Value = Кратные3

Range(«X24″).Value = Кратные5

Range(«X25″).Value = Звезд

Рис. 5. Обработанная таблица

Используя офисное программирование можно сформировать у студентов комплекс знаний, умений и навыков, необходимых для решения профессиональных задач в области автоматизации работы с офисным пакетом Microsoft Office.

Литература:

  1. И. Г. Фризен. Офисное программирование: Учебное пособие / М. Издательско-торговая корпорация «Дашков и К», 2013 г.
  2. Языки управления приложениями: Учебно-методическое пособие. — М.: Издательский отдел факультета ВМиК МГУ имени М. В. Ломоносова № 05899; 2015 г.
  3. https://studfiles.net/preview/2897110/
  4. https://www.intuit.ru/studies/courses/23/23/info

Основные термины (генерируются автоматически): VBA, массив, двумерный массив, Задание массива, Максимальный элемент, Начальное значение, программный код, размах таблицы, Число столбцов, Число строк.

Узнай цену своей работы

Формулировка задачи:

Как найти максимальный Элемент двумерного массива (VBA)

Код к задаче: «Как найти максимальный Элемент двумерного массива?»

textual

Листинг программы

Application.Max(Mass)

Полезно ли:

5   голосов , оценка 4.000 из 5

Похожие ответы

  1. Найти максимальный элемент двумерного массива
  2. Как найти среднее арифметическое двумерного массива
  3. Как найти элемент массива с максимальным значением
  4. Найти в матрице сумму элементов строки, в которой расположен максимальный элемент матрицы. Excel
  5. Как найти минимальное и максимальное значения массива и вывести их разность на экран
  6. Как обменять данные в двух массивах: в одном массиве с 1-ого по 10-ый элемент, в другом с 11–го по 20–ый элемент
  7. Найти в одномерном массиве максимальный элемент среди элементов с четными индексами
  8. Найти произведение элементов побочной (главной) диагонали квадратной матрицы
  9. Как найти последнюю строку с заданным значением?
  10. Максимальный элемент среди минимальных
  11. Максимальный элемент массива

Sub p1()

        ‘ Создание в оперативной памятик компьютера поименованной области — массива dblMatrix.
        ‘ Двумерный массив называется матрица. Двумерный массив, это когда массив
        ‘ можно мысленно сравнить с обычной таблицей, у которой есть строки и столбцы.
    ‘ Double — означает, что в матрице могут быть только числа. Числа могут быть целые и дробные.
    ‘ Первые 1 to 4  означают, что в матрице будет четыре строки.
    ‘ Вторые 1 to 4  означают, что в матрице будет четыре столбца.
    Dim dblMatrix(1 To 4, 1 To 4) As Double
    ‘ Создание в оперативной памяти компьютера поименованной области — переменной dblMaxValue.
        ‘ Переменные используются, чтобы помещать в них какие-нибудь данные.
    ‘ Long означает, что в переменной могут быть только целые числа (дробные не могут).
    Dim dblMaxValue As Double, lngMaxI As Long, lngMaxJ As Long
    Dim dblTemporary As Double
    Dim i As Long, j As Long

            ‘1. Заполнение матрицы числами, чтобы было чего анализировать.
    ‘ Числа берутся из Excel, из активного листа.
    ‘ For … To … Step — называется циклом. Цикл используется, чтобы делать
        ‘ одну и ту же команду несколько раз.
    For i = 1 To 4 Step 1
        For j = 1 To 4 Step 1
            dblMatrix(i, j) = Cells(i, j).Value
        Next j
    Next i

        ‘2. Поиск в матрице максимального числа.
        ‘ Сначала за максимальное числ принимается первое число и затем
        ‘ все остальные числа сравниваются с этим числом. Если какое-то число
        ‘ окажется больше, то это новое число запоминается и затем уже
        ‘ с ним сравниваются остальные числа. И т.д.
    dblMaxValue = dblMatrix(1, 1)
    ‘ Запись номера строки и номера столбца.
    ‘ Эти переменные нужны, чтобы потом поменять местами первый элемент и максимальный элемент.
    lngMaxI = 1
    lngMaxJ = 1
    For i = 1 To 4 Step 1
        For j = 1 To 4 Step 1
            ‘ If … Then … End If — используется для выбора действия.
            ‘ Если число в матрице больше числа в переменной.
            If dblMatrix(i, j) > dblMaxValue Then
                ‘ Запись в переменные новых данных.
                dblMaxValue = dblMatrix(i, j)
                lngMaxI = i
                lngMaxJ = j
            End If
        Next j
    Next i

        ‘3. Смена местами первого и максимального элементов.
        ‘ Чтобы это сделать нужна ещё одна переменная, в которую поместятся данные.
        ‘ Иначе при обмене данных в одном из элементов данные будут стёрты.
    ‘ Запись максимального числа в переменную dblTemporary.
    dblTemporary = dblMatrix(lngMaxI, lngMaxJ)
    ‘ Помещение данных из первого элемента в максимальный.
    dblMatrix(lngMaxI, lngMaxJ) = dblMatrix(1, 1)
    ‘ Помещение данных из переменной в первый элемент.
    dblMatrix(1, 1) = dblTemporary

        ‘4. Вывод результата в Excel, справа от исходной матрицы.
    For i = 1 To 4 Step 1
        For j = 1 To 4 Step 1
            ‘ + 5 — чтобы данные смещались вправо.
            Cells(i, j + 5).Value = dblMatrix(i, j)
        Next j
    Next i

End Sub

[свернуть]

Понравилась статья? Поделить с друзьями:
  • Как найти абонента мтс без согласия абонента
  • Как составить заявление в полицию когда тебе угрожают
  • Как составить таблицу игр по баскетболу
  • Как найти глину в граундед
  • Как смартфоне найти корзину с удаленными файлами