Здравствуйте все! Помогите, если это возможно. Нужно отсортировать большой объём информации находящейся в массиве, без предварительного вывода его на лист (если предварительно его напечатать на лист, то занимает много времени). В примере, кажется всё подробно написано (хотя там информации для сортировки, конечно гораздо меньше). Если требуются дополнительные пояснения или более подробный пример, пожалуйста напишите.
Здравствуйте все! Помогите, если это возможно. Нужно отсортировать большой объём информации находящейся в массиве, без предварительного вывода его на лист (если предварительно его напечатать на лист, то занимает много времени). В примере, кажется всё подробно написано (хотя там информации для сортировки, конечно гораздо меньше). Если требуются дополнительные пояснения или более подробный пример, пожалуйста напишите.ОлеггелО
Здрасьте можно попробовать создать доп. столбец в массиве, и провести сортировку по нему. Например: [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) - см. Сортировку Шелла в Полезных приемах
Здрасьте можно попробовать создать доп. столбец в массиве, и провести сортировку по нему. Например: [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
Как вариант - два раза прогнать виртуальный массив через такую стандартную сортировку - сперва по последнему столбцу, затем по первому:
[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] Результат почти как у Николая - только заголовок тоже сортируется. Но если его не брать в массив - то ОК.
Как вариант - два раза прогнать виртуальный массив через такую стандартную сортировку - сперва по последнему столбцу, затем по первому:
[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