Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/возможна ли сортировка в массиве - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
возможна ли сортировка в массиве
ОлеггелО Дата: Суббота, 07.06.2014, 07:14 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 129
Репутация: 20 ±
Замечаний: 0% ±

Здравствуйте все! Помогите, если это возможно. Нужно отсортировать большой объём информации находящейся в массиве, без предварительного вывода его на лист (если предварительно его напечатать на лист, то занимает много времени). В примере, кажется всё подробно написано (хотя там информации для сортировки, конечно гораздо меньше). Если требуются дополнительные пояснения или более подробный пример, пожалуйста напишите.
К сообщению приложен файл: 5440166.xlsm (21.0 Kb)
 
Ответить
СообщениеЗдравствуйте все! Помогите, если это возможно. Нужно отсортировать большой объём информации находящейся в массиве, без предварительного вывода его на лист (если предварительно его напечатать на лист, то занимает много времени). В примере, кажется всё подробно написано (хотя там информации для сортировки, конечно гораздо меньше). Если требуются дополнительные пояснения или более подробный пример, пожалуйста напишите.

Автор - ОлеггелО
Дата добавления - 07.06.2014 в 07:14
nilem Дата: Суббота, 07.06.2014, 11:47 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Здрасьте
можно попробовать создать доп. столбец в массиве, и провести сортировку по нему. Например:
[vba]
Код
Sub ertert()
Dim x, i&
x = Range("A1:D" & Cells(Rows.Count, 1).End(xlUp).Row).Value
For i = 2 To UBound(x)
     x(i, 4) = x(i, 1) & x(i, 3)
Next i
Range("E1:G1").Resize(UBound(x)).Value = ShellSort22(x, 4)
End Sub
[/vba]
Function ShellSort22(x, k As Long) - см. Сортировку Шелла в Полезных приемах
К сообщению приложен файл: 0386432.xlsm (19.9 Kb)


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеЗдрасьте
можно попробовать создать доп. столбец в массиве, и провести сортировку по нему. Например:
[vba]
Код
Sub ertert()
Dim x, i&
x = Range("A1:D" & Cells(Rows.Count, 1).End(xlUp).Row).Value
For i = 2 To UBound(x)
     x(i, 4) = x(i, 1) & x(i, 3)
Next i
Range("E1:G1").Resize(UBound(x)).Value = ShellSort22(x, 4)
End Sub
[/vba]
Function ShellSort22(x, k As Long) - см. Сортировку Шелла в Полезных приемах

Автор - nilem
Дата добавления - 07.06.2014 в 11:47
ikki Дата: Суббота, 07.06.2014, 11:47 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
если предварительно его напечатать на лист, то занимает много времени
это, конечно, да. но примерно 1000 строк - это доли секунды. конечно, если "печатать на лист" правильно. а как это делаете Вы?

[p.s.]яндекс, "vba сортировка массива" - 137 тыс. ответов
google, "vba sort array" - 2 млн. 580 тыс. ответов[/p.s.]


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki


Сообщение отредактировал ikki - Суббота, 07.06.2014, 11:50
 
Ответить
Сообщение
если предварительно его напечатать на лист, то занимает много времени
это, конечно, да. но примерно 1000 строк - это доли секунды. конечно, если "печатать на лист" правильно. а как это делаете Вы?

[p.s.]яндекс, "vba сортировка массива" - 137 тыс. ответов
google, "vba sort array" - 2 млн. 580 тыс. ответов[/p.s.]

Автор - ikki
Дата добавления - 07.06.2014 в 11:47
ОлеггелО Дата: Суббота, 07.06.2014, 12:14 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 129
Репутация: 20 ±
Замечаний: 0% ±

ikki, nilem, спасибо за советы! Почитаю.
 
Ответить
Сообщениеikki, nilem, спасибо за советы! Почитаю.

Автор - ОлеггелО
Дата добавления - 07.06.2014 в 12:14
ОлеггелО Дата: Суббота, 07.06.2014, 12:20 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 129
Репутация: 20 ±
Замечаний: 0% ±

nilem, Ваш пример идеально (конечно с некоторыми изменениями) подходит! Спасибо!
 
Ответить
Сообщениеnilem, Ваш пример идеально (конечно с некоторыми изменениями) подходит! Спасибо!

Автор - ОлеггелО
Дата добавления - 07.06.2014 в 12:20
Hugo Дата: Суббота, 07.06.2014, 14:34 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Как вариант - два раза прогнать виртуальный массив через такую стандартную сортировку - сперва по последнему столбцу, затем по первому:

[vba]
Код

Sub ertert()
Dim x(), i&
...
uSort x, 3
uSort x, 1
...
End Sub

Private Sub uSort(ByRef x(), n&)
' uSort a, 3 - сортировать массив по 3-му столбцу
      Dim v, u&, d&, f%, st&
      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 = LBound(x, 2) To UBound(x, 2)
                      v = x(d, st): x(d, st) = x(u, st): x(u, st) = v
                  Next
                  u = d - 1: d = u - 1: If u < f Then d = u: u = f
              End If
              d = d + 1
          Next
      End If
End Sub
[/vba]
Результат почти как у Николая - только заголовок тоже сортируется. Но если его не брать в массив - то ОК.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеКак вариант - два раза прогнать виртуальный массив через такую стандартную сортировку - сперва по последнему столбцу, затем по первому:

[vba]
Код

Sub ertert()
Dim x(), i&
...
uSort x, 3
uSort x, 1
...
End Sub

Private Sub uSort(ByRef x(), n&)
' uSort a, 3 - сортировать массив по 3-му столбцу
      Dim v, u&, d&, f%, st&
      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 = LBound(x, 2) To UBound(x, 2)
                      v = x(d, st): x(d, st) = x(u, st): x(u, st) = v
                  Next
                  u = d - 1: d = u - 1: If u < f Then d = u: u = f
              End If
              d = d + 1
          Next
      End If
End Sub
[/vba]
Результат почти как у Николая - только заголовок тоже сортируется. Но если его не брать в массив - то ОК.

Автор - Hugo
Дата добавления - 07.06.2014 в 14:34
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!