Сортировка двумерного массива vba

Private Sub Command1_Click()
Dim Mas(9, 9) As Integer
Label1.Caption = ""
Label2.Caption = ""
Randomize (Time)
For i = 0 To 9
For j = 0 To 9
Mas(i, j) = Rnd() * 200
Next j
Next i
For j = 0 To 9
For i = 0 To 9
Label1.Caption = Label1.Caption & Mas(i, j) & Space(3)
Next i
Label1.Caption = Label1.Caption & Chr(13)
Next j
For t = 0 To 99
For i = 0 To 9
For j = 0 To 9
If j = 9 And i <> 9 Then
k = Mas(i, j)
Mas(i, j) = Mas(i + 1, 0)
Mas(i + 1, 0) = k

Else
If j <> 9 Then
If Mas(i, j) > Mas(i, j + 1) Then
k = Mas(i, j)
Mas(i, j) = Mas(i, j + 1)
Mas(i, j + 1) = k
End If
End If
End If

Next j
Next i
Next t
For j = 0 To 9
For i = 0 To 9
Label2.Caption = Label2.Caption & Mas(i, j) & Space(3)
Next i
Label2.Caption = Label2.Caption & Chr(13)
Next j

конкретно интересует вот эта часть:

k = Mas(i, j)
Mas(i, j) = Mas(i + 1, 0)
Mas(i + 1, 0) = k

а ещё конкретней её смысл, что программа здесь делает? я так понимаю сначала k присваивается какое-то значение из массива, а что дальше? пожалуйста расскажите подробно, можно сказать по каждому знаку. очень нужно))

Я определил следующий массив Dim myArray(10,5) as Long и хочу его отсортировать. Какой лучший способ сделать это?

Мне нужно будет обрабатывать много данных, таких как матрица 1000 x 5. Он содержит в основном цифры и даты и должен сортировать их по определенному столбцу.

6 ответов

Вот QuickSort с несколькими столбцами и одним столбцом для VBA, модифицированный из примера кода, опубликованного Джимом Речем в Usenet.

Вы заметите, что я занимаюсь намного более защитным кодированием, чем вы можете увидеть в большинстве примеров кода в Интернете: это форум Excel, и вы получили предвосхищать нулевые и пустые значения . Или вложенные массивы и объекты в массивах, если ваш исходный массив поступает, скажем, из стороннего источника рыночных данных в реальном времени.

Пустые значения и недопустимые элементы отправляются в конец списка.

Ваш звонок будет:

. Передача ‘2’ в качестве столбца для сортировки и исключение необязательных параметров, которые проходят верхнюю и нижнюю границы области поиска.

Читайте также:  Цивилизация 6 гайд по нациям

[EDITED] – исправлен нечетный сбой форматирования в & LT; code> теги, которые, кажется, имеют проблемы с гиперссылками в комментариях к коду.

. И версия массива с одним столбцом:

Раньше я использовал BubbleSort для такого рода вещей, но он сильно замедляется после того, как массив превысит 1024 строки. Я включил приведенный ниже код для справки: обратите внимание, что я не предоставил исходный код для ArrayDimensions, поэтому он не будет скомпилирован для вас, если вы не реорганизуете его – или не разделите его на версии «Array» и «vector».

Этот ответ, возможно, пришел с некоторым опозданием, чтобы решить вашу проблему, когда вам нужно, но другие люди ответят на него, когда отправят в Google ответы на аналогичные проблемы.

Сложность в том, что VBA не предоставляет простого способа поменять строки в двумерном массиве. Для каждого обмена вам придется перебрать 5 элементов и поменять местами каждый, что будет очень неэффективно.

Я предполагаю, что 2D-массив действительно не тот, который вы должны использовать в любом случае. У каждого столбца есть определенное значение? Если это так, не следует ли использовать массив определенного пользователем типа или массив объектов, которые являются экземплярами модуля класса? Даже если 5 столбцов не имеют определенного значения, вы все равно можете сделать это, но определите UDT или модуль класса, чтобы иметь только один член, который является 5-элементным массивом.

Для самого алгоритма сортировки я бы использовал обычную сортировку вставкой. 1000 элементов на самом деле не так уж велики, и вы, вероятно, не заметите разницы между сортировкой вставкой и быстрой сортировкой, если мы убедились, что каждый обмен не будет слишком медленным. Если вы действительно используете быструю сортировку, вам необходимо тщательно ее кодировать, чтобы убедиться, что вам не хватит места в стеке, что можно сделать, но это сложно, а быстрая сортировка сложна хватит уже.

Читайте также:  Как запустить скрипт powershell из командной строки

Итак, если вы используете массив UDT и что UDT содержит варианты с именами от Field1 до Field5, и если мы хотим отсортировать по Field2 (например), тогда код может выглядеть примерно так .

иногда самый безмозглый ответ – лучший ответ.

  1. добавить чистый лист
  2. загрузите массив на этот лист
  3. добавить поля сортировки
  4. применить сортировку
  5. повторно загрузите данные листа обратно в ваш массив, это будет то же измерение
  6. удалить лист

tadaa. Я не получу никаких призов за программирование, но он быстро справится с работой.

Я собираюсь предложить немного другого кода для подхода Стива.

Все действительные замечания по эффективности, но, честно говоря, когда я искал решение, я мог меньше заботиться об эффективности. Это VBA . Я отношусь к этому так, как он того заслуживает.

Вы хотите отсортировать 2-й массив. Обычная простая грязная простая сортировка вставки, которая будет принимать массив переменного размера и сортировать по выбранному столбцу.

Для чего бы это ни стоило (я не могу показать код на этом этапе . позвольте мне посмотреть, смогу ли я отредактировать его для публикации), я создал массив пользовательских объектов (поэтому каждое из свойств поставляется с любым элементом, его отсортировано по), заполнил набор ячеек интересующими объектами свойствами каждого элемента, затем использовал функцию сортировки Excel через vba для сортировки столбца. Я уверен, что, возможно, есть более эффективный способ сортировки, чем экспорт в ячейки, я просто еще не понял. Это на самом деле мне очень помогло, потому что когда мне нужно было добавить измерение, я просто добавил свойство let и get для следующего измерения массива.

Мне кажется, что приведенный выше код QuickSort не может обрабатывать пробелы. У меня есть массив с числами и пробелами. Когда я сортирую этот массив, записи с пробелами смешиваются между записями с номерами. Мне потребовалось много времени, чтобы выяснить это, поэтому, вероятно, полезно помнить об этом при использовании этого кода.

Читайте также:  Как зайти в свойства видеокарты

Сортировка двумерного массива по нулевому столбцу

Та же функция, только с возможностью выбора столбца для сортировки двумерного массива:

Сортировка двумерного массива на листе Excel, по первым 3 столбцам по возрастанию
(создаётся временная книга из 1 листа для сортировки массива, после сортировки книга закрывается)

Ну и обычная пузырьковая сортировка одномерного массива

то же самое, но внутри макроса (arr – одномерный массив)

  • 50460 просмотров

Комментарии

Спасибо за уточнение, Михаил!

А только мне кажется, что в пузырьке строка
For j& = LBound(arr) To UBound(arr) – 2 – i
должна быть
For j& = LBound(arr) To UBound(arr) – 1 – i
?? Пять лет прошло так-то.

Алексей, очень помогли, спасибо!

Просто, большое человеческое спасибо! Двумерка заработала!

Здравствуйте,а как применить данную программу,только если в ячейках сортированной матрицы были квадраты чисел?

Искал алгоритм, набрел на этот, но написал свой.
Первый алгоритм неэффективный. Очень много перестановок, а это самая долгая операция.
Предлагаю более простой и сортировка по любому количеству столбцов в любом порядке. Кому надо направление сортировки и произвольные границы, можете доработать сами. Последняя строка массива передается, потому что массив может быть заполнен не весь

Private Sub SortArray(myArray, countRows, ParamArray sortC())
Dim cRA%, cR%, minR%, cS%, cE%, countC%, tempV
..For cRA = 0 To countRows – 1
. minR = cRA
. For cR = cRA + 1 To countRows – 1
. For cS = 0 To UBound(sortC)
. If myArray(cR, sortC(cS)) <> myArray(minR, sortC(cS)) Then
. If myArray(cR, sortC(cS)) cRA Then
. ‘меняем местами строки
. For cC = 0 To UBound(myArray, 2)
. tempV = myArray(cRA, cC)
. myArray(cRA, cC) = myArray(minR, cC)
. myArray(minR, cC) = tempV
. Next
. End If
..Next
End Sub

Вызов: SortArray Ar, 5, 2, 0, 1
Ar – массив, 5 – последняя строка, 2, 0, 1 – столбцы для сортировки

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *