MyTetra Share
Делитесь знаниями!
Сортировка3
Время создания: 31.07.2019 22:59
Текстовые метки: Сортировка, Фильтр, Array
Раздел: !Закладки - VBA - Excel - Листы - Фильтр-сортировка
Запись: xintrea/mytetra_db_adgaver_new/master/base/15112559757vrhqykge7/text.html на raw.githubusercontent.com

'Сортировка каждого столбца по возрастанию - это по сути несколько сортировок одномерного массива.


Dim mas(3, 6) As Integer

Private Sub Command1_Click()

Label1 = ""

Label2 = ""

'заполнение массива случайными числами

For i = 0 To 2

    For j = 0 To 5

        mas(i, j) = 20 * Rnd(1)

        Label1 = Label1 & " " & mas(i, j)

    Next

    Label1 = Label1 & "  "

Next

'сортировка внутри каждого столбца

For i = 0 To 2

    'Max = 0

   For j = 1 To 5

        k = j

        Do While k > 0

            If mas(i, k) < mas(i, k - 1) Then

                t = mas(i, k)

                mas(i, k) = mas(i, k - 1)

                mas(i, k - 1) = t

                k = k - 1

            Else

                Exit Do

            End If

        Loop

    Next

Next

'Вывод

For i = 0 To 2

    For j = 0 To 5

        Label2 = Label2 & " " & mas(i, j)

    Next

    Label2 = Label2 & "  "

Next

End Sub


Или и сами столбцы тоже нужно сортировать? Тогда по какому признаку.



извините, забыла уточнить, что необходимо отсортировать значения (в столбце) типа string в соответствии с заранее заданным списком.

есть массив с данными - как обычная табличка
8 столбцов.
каждой строчке соответствует отдельный объект с восьмью параметрами.
нужно упорядочить по столбцу "код" (string)
а если код повторяется несколько раз, то среди этих строк (с одинаковым кодом) упорядочить ещё по одному параметру "содержание" (тоже string)



'А почему бы так сразу не написать?

Dim mas(10, 8) As String

Private Sub Command1_Click()

Label1 = ""

Label2 = ""

'перенос слов в label чтоб корректно отображалась инфа

Label1.WordWrap = True

Label1.WordWrap = True

'заполнение массива случайными именами

For i = 0 To 9

    For j = 0 To 7

        mas(i, j) = "name" & Int(20 * Rnd(1))

        Label1 = Label1 & " " & mas(i, j)

    Next

    Label1 = Label1 & vbCrLf

Next

'сортировка по столбцу 0

For i = 1 To 9

    k = i

    Do While k > 0

        If mas(k, 0) < mas(k - 1, 0) Then

            For j = 0 To 7

                t = mas(k, j)

                mas(k, j) = mas(k - 1, j)

                mas(k - 1, j) = t

            Next

            k = k - 1

        Else

            Exit Do

        End If

       

    Loop

Next

'сортировка по столбцу 1 при условии равенства значений в столбце 0

For i = 1 To 10

    k = i

    Do While k > 0

        If mas(k, 0) = mas(k - 1, 0) Then

       

            If mas(k, 1) < mas(k - 1, 1) Then

                For j = 0 To 7

                    t = mas(k, j)

                    mas(k, j) = mas(k - 1, j)

                    mas(k - 1, j) = t

                Next

                k = k - 1

            Else

                Exit Do

            End If

           

            k = k - 1

        Else

            Exit Do

        End If

    Loop

Next

'Вывод

For i = 0 To 9

    For j = 0 To 7

        Label2 = Label2 & " " & mas(i, j)

    Next

    Label2 = Label2 & vbCrLf

Next

End Sub





 
MyTetra Share v.0.59
Яндекс индекс цитирования