Remkomplekty.ru

IT Новости из мира ПК
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba excel сортировка массива

Функция сортировки массива VBA?

Я ищу достойную реализацию сортировки для массивов в VBA. Ртуть была бы предпочтительнее. Или любой другой алгоритм сортировки, кроме bubble или merge, будет достаточно.

Обратите внимание, что это должно работать с MS Project 2003, поэтому следует избегать любых собственных функций Excel и всего, что связано с .net.

10 ответов

Посмотрите здесь:
изменить: источник ссылки (allexperts.com) с тех пор закрыта, но вот соответствующие комментарии автора:

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

Вызовите его, просто передав массив значений (строковых или числовых; это не имеет значения) с нижней границей массива (обычно 0 ) и верхней границей массива ( UBound(myArray) т. е.)

Пример: Call QuickSort(myArray, 0, UBound(myArray))

Когда это будет сделано, myArray будет отсортирован, и вы можете делать то, что вы хотите с ним.
(Источник: archive.org)

Обратите внимание, что это работает только с одномерным (он же «нормальный»?) матрицы. (Здесь работает многомерный Arraye QuickSort .)

Объяснение на немецком языке, но код является хорошо проверенной на месте реализации:

Вызывается следующим образом:

Я преобразовал алгоритм ‘fast quick sort’ в VBA, если кто-то еще хочет его.

Я оптимизировал его для работы с массивом Int/Longs, но он должен быть простым для преобразования в тот, который работает на произвольных сопоставимых элементах.

Я опубликовал некоторый код в ответ на связанный вопрос о StackOverflow:

Примеры кода в этом потоке включают:

  1. Векторный массив Quicksort;
  2. Многоколонный массив QuickSort;
  3. Пузырчатка.

Оптимизированный Quicksort Алена очень блестящий: я только что сделал базовое разделение и рекурсию, но пример кода выше имеет функцию «стробирования», которая сокращает избыточные сравнения дублированных значений. С другой стороны, я кодирую для Excel, и есть немного больше на пути защитного кодирования — будьте предупреждены, вам это понадобится, если Ваш массив содержит пагубный вариант ‘Empty ()’, который нарушит ваше время… Операторы сравнения Wend и ловушка ваш код в бесконечном цикле.

Обратите внимание, что quicksort алгоритмы — и любой рекурсивный алгоритм — могут заполнить стек и аварийно завершить работу Excel. Если Ваш массив имеет менее 1024 членов, Я бы использовал рудиментарный BubbleSort.

Вы не хотели решение на основе Excel, но так как у меня была та же проблема сегодня и хотел протестировать с помощью других функций приложений Office, я написал функцию ниже.

  • 2-мерные массивы;
  • не более 3 столбцов в качестве ключей сортировки;
  • зависит от Excel;

Протестирован вызов Excel 2010 из Visio 2010

Это пример тестирования функции:

Если кто-то проверяет это, используя другие версии office, пожалуйста, напишите здесь, если есть какие-либо проблемы.

Натуральное Число (Строки) Быстрая Сортировка

Просто кучи на тему.
Обычно, если вы сортируете строки с числами, вы получите что-то вроде этого:

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

Вот как это сделать…

  • Я украл быстрый вид из интернета давно, не знаю, где сейчас…
  • Я перевел функцию CompareNaturalNum, которая изначально была написана на C из интернета.
  • Отличие от других Q-сортов: я не меняю значения, если BottomTemp = TopTemp

Натуральное Число Быстрая Сортировка

Сравнение натуральных чисел(используется для быстрой сортировки)

isDigit (используется в CompareNaturalNum)

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

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

Я думаю, что мой код (проверенный) более «образован», предполагая, что чем проще, тем лучше .

Сортировка массива по возрастанию и убыванию

Сортировка двумерного массива возрастанию и по убыванию
Всем привет, не могу разобраться, как сделать сортировку по убыванию и по возрастанию. Private.

Сортировка массива по возрастанию
Отсортировать одномерный массив состоящий из n элементов. Sub lab() Dim i As Integer Dim j As.

Сортировка массива по возрастанию
Допустим, что элементы a0 , . ai-1 уже упорядочены, тогда среди оставшихся ai , . an-1 .

Сортировка массива по возрастанию
Господа форумчане, помогите совсем начинающему программисту! Задача: Пользователь вводит в окно.

Shauna, в программе Excel есть 2 варианта сортировки:

  1. с помощью средств программы Excel;
  2. с помощью кода VBA.

Если с помощью кода VBA, то существует несколько видов сортировки. Обычно студентов обучают сортировке методом Пузырька.

Вам какой вариант нужен?

— к пузырьку явное уважение.

Вот сортировка обменом:

Добавлено через 14 минут
Вот сортировка выбором:

Добавлено через 5 минут
Вот — пузырьковая:

А вот сортировка вставками (естественный и устойчивый алгоритм!) Запрограммирован, правда, не очень уклюже, но работает:

— и чем она плоха?

Добавлено через 5 минут
Опс. Проверил, действительно привирает. Сейчас поправлю.

Вот правильная версия:

Неуклюжий первый вариант тоже можно поправить:

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

Читать еще:  Vba excel текущая ячейка

Сортировка массива по убыванию сумм элементов строк
Кто хорошо помнит сортировку матриц, подскажите пожалуйста где ошибка. Задание: 1. Дан целый.

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

Упорядочить элементы массива — для четных вариантов — по возрастанию, для нечетных по убыванию
Помогите люди добрые! Не могу никак допереть как написать код. Упорядочить элементы массива(для.

Сортировка массива по возрастанию и убыванию
A-массив вещественных чисел, состоящий из элементов, выбранных случайным образом из диапазона ( в.

Сортировка многомерного массива в VBA

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

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

6 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читать еще:  Excel если не пусто то формула

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

Excel VBA Quickest way to sort an array of numbers in descending order?

What is the quickest way (in terms of computational time) to sort an array of numbers (1000-10000 numbers but could vary) in descending order? As far as I know the Excel build-in functions is not really efficient and in-memory sorting should be a lot faster than the Excel functions.

Note that I can not create anything on the spreadsheet, everything has to be stored and sorted in memory only.

Создан 16 июл. 12 2012-07-16 12:33:36 AZhu

Entire tutorial on Sorting an Array. Ellis has given you many options to sort an array 🙂 Take your pick. http://www.vbforums.com/showthread.php?t=473677 – Siddharth Rout 16 июл. 12 2012-07-16 12:40:51

5 ответов

Just so that people don’t have to click the link that I just did, here is one of the fantastic examples from Siddharth’s comment.

Создан 21 июн. 14 2014-06-21 11:41:56 tannman357

I know the OP specified not using worksheets but its worth noting that creating a new WorkSheet, using it as a scratch pad to do the sort with worksheet functions, then cleaning up after is longer by less than a factor of 2. But you also have all of the flexibility delivered by the parameters of the Sort WorkSheet Function.

On my system, the difference was 55 msec for the very nice recursive routine by @tannman357 and 96 msec for the method below. Those are average times over several runs.

Создан 26 авг. 14 2014-08-26 15:41:45 Cool Blue

If you want efficient algorithm, then take a look at Timsort. It is adaptation of merge sort that fixes it’s problems.

However 1k — 10k data entries are far too little amount of data for you to worry about built in search efficiency.

Example : If you have data from column A to D and header is at row 2 and you want to sort by column B.

Создан 26 сен. 14 2014-09-26 08:21:34 Margus

This uses Quick Sort.

Создан 03 дек. 15 2015-12-03 22:13:00 trincot

Stumbled across this and tried to implement this in a sub. It seems to exit after ‘arr.sort’ and can’t get it to go past this line. – Tom 13 мар. 17 2017-03-13 10:36:18

I just repeated this now, and it works fine. What data are you sorting? How large is it? Have you tried with just a few values? (I just did it now, and it works fine for me). – trincot 13 мар. 17 2017-03-13 10:42:30

I tried it with an array populated with 46 Double values. Do I need to add a reference? (I know this is using late binding but can’t figure out why it would just exit with no debug error) – Tom 13 мар. 17 2017-03-13 10:44:39

No, you don’t need a reference. The fact that you can create the object and add values to it, shows that you have a functioning ‘arr’ object. I just tried with ‘For i = 1 To 46: d = Rnd(): arr.Add d: Next’ where ‘d’ is of type ‘Double’, and have no issue. Maybe you should ask help for this via a new question. – trincot 13 мар. 17 2017-03-13 10:57:47

Think I’ve found out why — I was trying to use this in a UDF and I think it is possibly not something that is accessible when doing this. Seems to work find in a sub – Tom 13 мар. 17 2017-03-13 13:30:22

Make sure when using in a UDF (which typically takes a range as argument), you don’t sort the cell objects, but the values in those cells. So use the ‘value’ property when adding to the array. Apart from that, I have no idea why it would fail in a UDF. – trincot 13 мар. 17 2017-03-13 13:50:01

I was passing to the UDF a Range and a double. I was trying to replicate the ‘TRIMMEAN’ function for a filtered list. That could be what I was missing although pretty sure that’s how I was adding it. Have sorted it out another way now but will try to use this in future. – Tom 13 мар. 17 2017-03-13 13:52:09

@trincot It lost some elements. I’ve transfered array to this collection, sorted it, had 84 elements, and was trying to move it to array back one by one. Using collection.count in immediate shows 84 items and in locals window it shows 68 elements. – Eswemenasja 05 июл. 17 2017-07-05 12:05:21

Читать еще:  Vba excel обновить форму

@Eswemenasja, I propose you ask a new question about it, providing the sample input, so that I can reproduce the problem. Let me know when you do, and I’ll have a look at it. – trincot 05 июл. 17 2017-07-05 12:17:20

@trincot Sorry, my bad, collection is counted from 0 and array was counted from 1. Reasigning from collection back to array with -1 counter for collection solved the issue. – Eswemenasja 06 июл. 17 2017-07-06 13:48:38

I have used the Shell sort algorithm successfully. Runs in the blink of an eye when tested for N=10000 using an array generated with VBA Rnd() function — don’t forget to use the Randomize statement for generating test arrays. It was easy to implement and short and efficient enough for the number of elements I was dealing with. Reference is given in the code comments.

Создан 26 сен. 16 2016-09-26 15:43:48 jdrago

Функция сортировки массива VBA?

67 Mark Nold [2008-09-30 12:06:00]

Я ищу подходящую реализацию сортировки для массивов в VBA. Рекомендуется использовать Quicksort. Или любой другой алгоритм сортировки, кроме пузырька или слияния, будет достаточным.

Обратите внимание, что это необходимо для работы с MS Project 2003, поэтому следует избегать любых собственных функций Excel и любого связанного с .NET.

sorting arrays vba vb6 ms-project

10 ответов

83 Решение Jorge Ferreira [2008-09-30 12:10:00]

Посмотрите здесь:
Изменить: ссылающийся источник (allexperts.com) закрыт, но здесь соответствующий автор замечает:

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

Назовите это просто, передав массив значений (строковый или числовой, это не имеет значения) с UBound(myArray) нижнего массива (обычно 0 ) и UBound(myArray) верхних массивов (то есть UBound(myArray) .)

Пример: Call QuickSort(myArray, 0, UBound(myArray))

Когда это будет сделано, myArray будет отсортирован, и вы сможете делать то, что хотите.
(Источник: archive.org)

Обратите внимание, что это работает только с одномерными (так называемыми «нормальными»?) Массивами. (Там рабочая многомерный arraye QuickSort здесь.)

13 Alain [2010-12-03 19:37:00]

Я преобразовал алгоритм быстрой быстрой сортировки в VBA, если кто-то еще этого захочет.

Я оптимизировал его для работы в массиве Int/Longs, но его нужно просто преобразовать в тот, который работает с произвольными сопоставимыми элементами.

Объяснение на немецком языке, но код является проверенной на месте реализацией:

Вызывается следующим образом:

6 Profex [2013-10-17 01:47:00]

Естественное число (строки) Быстрая сортировка

Просто купите тему. Обычно, если вы сортируете строки с номерами, вы получите что-то вроде этого:

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

Вот как это сделать.

  • Я украл Quick Sort из Интернета давным-давно, не уверен, где сейчас.
  • Я перевел функцию CompareNaturalNum, которая была первоначально написана на C из Интернета.
  • Отличие от других Q-Sorts: я не меняю значения, если BottomTemp = TopTemp

Естественное число Быстрая сортировка

Сравнение натуральных чисел (используется в быстрой сортировке)

isDigit (используется в CompareNaturalNum)

Я отправил некоторый код в ответ на связанный с ним вопрос в StackOverflow:

Образцы кода в этом потоке включают:

  • Массив векторных массивов Quicksort;
  • Многостолбцовый массив QuickSort;
  • A BubbleSort.

Оптимизированная оптимизация QuickSort оптимизирована: я просто сделал базовую сплит-рекурсию, но пример кода выше имеет функцию «gating», которая сокращает избыточные сравнения дублированных значений. С другой стороны, я кодирую для Excel, а там немного больше, чем защитное кодирование — будьте осторожны, вам понадобится, если ваш массив содержит пагубный вариант Empty(), который сломает ваше время. Wend сравнения операторов и захватить ваш код в бесконечном цикле.

Обратите внимание, что алгоритмы quicksort algorthms — и любой рекурсивный алгоритм — могут заполнять стек и разбивать Excel. Если ваш массив имеет менее 1024 членов, я бы использовал рудиментарный BubbleSort.

Вы не хотели решения на основе Excel, но, поскольку у меня была такая же проблема сегодня и я хотел протестировать с помощью других функций Office Applications, я написал функцию ниже.

  • 2-мерные массивы;
  • максимум 3 столбца в качестве ключей сортировки;
  • зависит от Excel;

Протестировано вызов Excel 2010 из Visio 2010

Это пример того, как проверить функцию:

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

1 Moreno [2017-01-27 07:26:00]

Я думаю, что мой код (проверенный) более «образован», предполагая, что чем проще, тем лучше.

0 Jarek [2015-11-17 14:22:00]

Интересно, что бы вы сказали об этом методе сортировки массива. Это быстро для реализации, и эта работа. еще не проверена для больших массивов. Он работает для одномерных массивов, поскольку многомерная дополнительная матрица переопределения значений должна быть построена (с одним меньшим размером, чем исходный массив).

0 Reged [2016-06-13 01:22:00]

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

Ссылка на основную публикацию
Adblock
detector