Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2011, 13:27   #1
clever77
Пользователь
 
Регистрация: 13.04.2011
Сообщений: 58
По умолчанию Как сортировать два массива данных?

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

Sub Сортировка диапазона()

With ActiveWorkbook.Worksheets("Лист4"). Sort
.SetRange Range("A1:B45")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

End Sub

Как быть если вместо диапазона ячеек я хочу произвести сортировку дыух массивов одинакового размера, к примеру Массив А() - это столбецА, Массив В() - это столбец В
Что нужно поставить вместо строки
.SetRange Range("A1:B45")

Заранее благодарен.
clever77 вне форума Ответить с цитированием
Старый 15.04.2011, 13:38   #2
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

Цитата:
Сообщение от clever77 Посмотреть сообщение
В Excel есть расширенная сортировка данных, когда таблица из 2-х столбцов сортируется связано,т.е сортируем столбец А от мин к макс, а второй столбец В сортируется по условию первого
Вот пример сортировки диапозона

Sub Сортировка диапазона()

With ActiveWorkbook.Worksheets("Лист4"). Sort
.SetRange Range("A1:B45")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

End Sub

Как быть если вместо диапазона ячеек я хочу произвести сортировку дыух массивов одинакового размера, к примеру Массив А() - это столбецА, Массив В() - это столбец В
Что нужно поставить вместо строки
.SetRange Range("A1:B45")

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

быстро, надежно , мало кода
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 15.04.2011, 13:49   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Есть такой код сотировки "пузырьком" массива, созданного из двух столбцов:

Код:
Private Sub SortArray(ByRef a As Variant)
    Dim i As Long, j As Long
    Dim t As Variant, tt As Variant
  
    'standard bubble sort loops
    For i = LBound(a) To UBound(a) - 1
        For j = i + 1 To UBound(a)
            If a(i, 2) < a(j, 2) Then 'change to <> for change order
                t = a(i, 2): tt = a(i, 1)
                a(i, 2) = a(j, 2): a(i, 1) = a(j, 1)
                a(j, 2) = t: a(j, 1) = tt
            End If
        Next j
    Next i
End Sub
Сюда добавить параметром второй массив (или сделать его публичным) и передвигать его элементы синхронно вместо второго элемента массива a.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 15.04.2011, 15:24   #4
clever77
Пользователь
 
Регистрация: 13.04.2011
Сообщений: 58
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Есть такой код сотировки "пузырьком" массива, созданного из двух столбцов:

Код:
Private Sub SortArray(ByRef a As Variant)
    Dim i As Long, j As Long
    Dim t As Variant, tt As Variant
  
    'standard bubble sort loops
    For i =  LBound(a) To UBound(a) - 1
       For j = i + 1 To UBound(a)
            If a(i, 2) < a(j, 2) Then 'change to <> for change order
                t = a(i, 2): tt = a(i, 1)
                a(i, 2) = a(j, 2): a(i, 1) = a(j, 1)
                a(j, 2) = t: a(j, 1) = tt
            End If
        Next j
    Next i
End Sub
Сюда добавить параметром второй массив (или сделать его публичным) и передвигать его элементы синхронно вместо второго элемента массива a.
Спасибо.
Только размерномть массива надо уменьшить еще на 1, а то выдает ошибку
S=длина массива
price -первый массив
volume - второй
For i = 0 To S - 2
For j = i + 1 To S-1
If price(i) > price(j) Then 'change to <> for change order
t = price(i): tt = Volume(i)
price(i) = price(j): Volume(i) = Volume(j)
price(j) = t: Volume(j) = tt
End If
Next j
Next i
Просто я не использую
LBound(a) To UBound(a)
т.к. загружаю данные из файла, где длина массива не постоянна и для того что бы создать массив, мне надо определить длину загружаемых данных, обозначаю переменной S.
Если длина данных s=100 строк, то
LBound(a)=0 ,
UBound(a)=99

Теперь все работает. Еще раз спасибо.

Последний раз редактировалось clever77; 15.04.2011 в 15:34.
clever77 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Два одномерных массива A и B. Сформировать два новых массива. Паскаль. Где ошибка в коде? Tomny Помощь студентам 1 27.03.2011 16:47
как объеденить два одномерных массива разной длины? Artur1992 Помощь студентам 3 26.12.2010 20:26
сортировать по фамилии два листа Kotik123 Microsoft Office Excel 2 23.04.2009 18:52
Как объединить два массива в один. TheWanderer Общие вопросы C/C++ 2 10.11.2008 00:15
Как прочесть два массива из файла Need_Help Паскаль, Turbo Pascal, PascalABC.NET 5 20.05.2007 16:40