Страницы: 1
RSS
Функция обратной сортировки массива
 
Доброго времени суток, уважаемые форумчане. В работе регулярно использую найденную на просторах сети функцию сортировки массива:
Код
Function Sort_Array(ByRef x(), n As Long) 'функция сортировки массивов
    Dim st As Long, d As Long, f As Long, u As Long, v As Variant
        If IsArray(x) Then
            f = LBound(x): d = f
            For u = f + 1 To UBound(x)
                If x(u, n) < x(d, n) Then
                    For st = 1 To UBound(x, 2)
                        v = x(d, st): x(d, st) = x(u, st): x(u, st) = v
                    Next st
                        u = d - 1: d = u - 1: If u < f Then d = u: u = f
                End If
                    d = d + 1
            Next u
        End If
End Function
все работает нормально, достаточно в коде указать номер столбца по которому производится сортировка (Sort_Array Arr, 2 ) и все ОК. Но сейчас мне потребовалась отсортировать массив в обратном порядке, чтобы даты (во 2 столбце) располагались по убыванию. И вот никак не могу понять что надо изменить в коде (помимо имени функции) чтобы так было?
Заранее спасибо всем откликнувшимся.
 
А чем не устраивает штатная сортировка?
«Бритва Оккама» или «Принцип Калашникова»?
 
Задача не подразумевает наличие данных на листе или их выгрузки на лист, по ходу выполнения должен быть сформирован массив, отсортирован по убыванию и выгружен в форму
 
Чисто с формальной точки зрения: если Вас устраивает функция сортировки в одну сторону, но иногда требуется отсортировать массив в другую; то сначала можно выполнить первую операцию, а затем в цикле просто перезаписать все значения отсортированного массива в обратном порядке.
Очевидно, что это не оптимальное решение, однако, его преимуществом является простота реализации :)

Чтобы вскипятить воду, нужно сначала налить ее в чайник, поставить его на плиту и включить газ. А что нужно сделать для того же самого, если вода уже налита в чайник? Просто вылейте её - и тогда окажетесь в ситуации, решение которой уже известно.
 
OlegO, здравствуйте
Цитата
IKor: сначала можно выполнить первую операцию, а затем в цикле просто перезаписать все значения отсортированного массива в обратном порядке
Обратная перестановка по индексам - это очень быстро, так что вполне себе вариант  :idea:
Ещё костыль: выгрузить на лист, отсортировать штатными средствами (макросом) и забрать обратно

Ссылки:
Сортировка массива по возрастанию и убыванию
Сортировка двумерного массива на VB (VBA)
Изменено: Jack Famous - 03.11.2020 10:29:56
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
IKor написал:
но иногда требуется
Ikor, не совсем так. Меня полностью устроит отдельная функция, например RevSort_array которая будет сортировать по убыванию. В силу своей наивности и малограмотности я вообще сначала предположил ,что проблему можно решить изменив < на > :oops: . Покажите ,если нетрудно как грамотно можно переставить значения  массива в обратном порядке?
 
OlegO,
Из меня тот еще программист VBA... поэтому я вынужден отказаться от такой чести. К счастью, на форуме есть множество классных специалистов готовых помочь с ответом на грамотно сформулированный вопрос.
И еще одно: в предыдущем сообщении представлены ссылки на сортировку данных в обоих направлениях.
Удачи!
 
Так и правильно, меняете знак в шестой строке и всё.
Но проверьте, у меня может чуть другой код в работе...
 
Обратная сортировка - это было отсортировано, а после стало вразброс? :D
По вопросам из тем форума, личку не читаю.
 
Наверное было бы правильнее написать "сортировка в обратном порядке"

Цитата
Hugo написал: меняете знак в шестой строке и всё.
И насколько кривыми руками я это проверял ранее 8-0 ? Вроде бы работает, буду решать задачу далее, спасибо
 
Поменять знак "меньше" на "больше" стало проблемой?
 
Цитата
RAN написал:
Поменять знак
Так в том то и дело уважаемый RAN, как то так умудрился проверить на тестовом файле такой вариант (правда кажется менял и в 6 и в 10 строке (из поста №1)), что не вышло, вот и озадачился малость :oops:  
Страницы: 1
Наверх