Страницы: 1 2 След.
RSS
Сортировка матрицы VBA
 
В общем, здравствуйте. Возникла проблема с сортировкой матрицы. Хотел написать на VBA, сортирует частично, но почему-то добавляет лишний столбец и там числа по рандому.

Может, где-то что неправильно написал в коде, т к занялся этим сегодня только. В общем, помогите, пожалуйста.
Код
Sub Сортировка_матрицы()
' Сортировка_матрицы Макрос
For i = 13 To 17
For j = 1 To 10

For k = 13 To 17
For l = 1 To 10

If l = 10 And k = 17 Then
' Ничего не делаем
Else

If l = 10 And Cells(k, l).Value > Cells(k + 1, 1).Value Then

Temp = Cells(k, l).Value
Cells(k, l).Value = Cells(k + 1, 1).Value
Cells(k + 1, 1).Value = Temp

Else

If Cells(k, l).Value > Cells(k, l + 1).Value Then

Temp = Cells(k, l).Value
Cells(k, l).Value = Cells(k, l + 1).Value
Cells(k, l + 1).Value = Temp

End If
End If
End If

Next l
Next k

Next j
Next i
End Sub
В общем, посмотрите, пожилуйста, и поправьте, если не сложно. И если есть встроенный способ, то хотелось бы знать, а то есть только сортировка обыкновенного массива.
Алгоритм простой, как два пальца. Вот только что в коде не так, не пойму, ну или я в синтаксисе что-то недопонял. Может, лишнее условие выполняется.
Изменено: Deuce97 - 24.04.2018 16:20:19
 
опишите задачу, которая перед Вами стоит, а там... глядишь и помощь подоспеет
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Добрый день,
Цитата
Deuce97 написал:
Может, где-то что неправильно написал в коде
Конечно, неправильно, 4-х уровневый for и в нем 3 уровня IF.
Какая задача была у Вас?
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
Отсортировать по возрастанию матрицу.
 
по грамотно написанному коду не всегда просто понять суть задачи
а по "криво написанному", который не решает ничего, понять что он должен решать - вообще НЕ ВОЗМОЖНО
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
ProFessor написал:
Конечно, неправильно, 4-х уровневый for и в нем 3 уровня IF.
Что тут неправильного?  
 
Ігор Гончаренко, тему я пояснил, да и в самом начале описано ПРОБЛЕМА С СОРТИРОВКОЙ МАТРИЦЫ. Если лень читать, то извините - не мои проблемы. К чему ваш этот ответ, не понимаю.
 
Цитата
Deuce97 написал:
Что тут неправильного?  
Честно говоря, я не пойду что тут правильного.
Если вам нужна сортировка по возрастанию и/или убыванию, то я могу привести с десяток разных вариантов.
Меня смущают какие-то условия, наподобие:
Код
 If l = 10 And k = 17 Then
' Ничего не делаем
Else
Изменено: ProFessor - 24.04.2018 16:37:43
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
Алгоритм такой - сортировать строки, а последний элемент каждой строки сравнивать с первым элементом следующей строки и свапать, если нужно. Первое пустое условие нужно для того, чтобы игнорировать последний элемент. Как сделать возвращение  к началу цикла по типу continue, не знаю.
 
Судя по коду Вы хотели реализовать сортировку перестановкой?
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
ProFessor, пузырёк, да.
 
для того чтобы сортировать матрицу
эту матрицу нужно получить в качестве аргумента или собрать из данных?
если матрица двумерная, то нужно знать:
по чему сортируем (колонки по какой-то строке или строки по какой-то колонке)
по какой-то - это по какой конкретно?
когда сортируем нужно знать сортируем по возростанию или убыванию?

Вы серьезно считаете, что фраза
Цитата
самом начале описано ПРОБЛЕМА С СОРТИРОВКОЙ МАТРИЦЫ.
отвечает на все печечисленные вопросы?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
по чему сортируем (колонки по какой-то строке или строки по какой-то колонке)по какой-то - это по какой конкретно?
Сортируем целиком, не отдельно строки или стоблцы, а ЦЕЛИКОМ. Первая ячейка - левый верхний угол - самый маленький элемент, последняя ячейка - правый нижний угол - самый большой элемент.
 
Пример моей боевой сортировки (сортировка расчёской), она намного быстрее пузырьковой, а вот о чём Вам говорит Ігор Гончаренко:
Есть массив есть сортируемое поле arr_X(i, 1), которое сортируется по возрастанию:

Код
maxs = k - 1
gap = k - 1
Do While gap >= 1
   If gap >= 1 Then
   i = 1
      Do While (i - 1 + gap) < maxs
         If arr_X(i, 1) > arr_X(i + gap, 1) Then  
            For j = 1 To 5
               buf = arr_X(i, j)
               arr_X(i, j) = arr_X(i + gap, j)
               arr_X(i + gap, j) = buf
            Next
         End If
      i = i + 1
      Loop
      If (i + gap) >= maxs Then
         If gap = 1 Then
            gap = 0
         End If
         If gap = 2 Then
              gap = 1
         End If
         gap = CLng(gap / 1.24733095010398)
      End If
Loop
Изменено: ProFessor - 24.04.2018 16:49:38
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
Цитата
Ігор Гончаренко написал:
эту матрицу нужно получить в качестве аргумента или собрать из данных?
без понятия, что вы сказали. Я обращаюсь к диапазону по ячейкам, диапазон у меня лично A13:J17 и его постепенно улучшаю, отсортировывая методом пузырька
Изменено: Deuce97 - 24.04.2018 16:50:23
 
Цитата
Deuce97 написал:
Сортируем целиком, не отдельно строки или стоблцы, а ЦЕЛИКОМ
То есть по всем столбцам и строкам?
В чем проблема сцепить их вместе? И также сортировать по одному полю...
Изменено: ProFessor - 24.04.2018 16:51:59
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
ProFessor,спасибо, буду разбираться
 
допустим имеем матрицу 3х3, содержащую в произвольном порядке числа от 1 до 9
матрицы:
1 2 3
4 5 6
7 8 9
и
1 4 7
2 5 8
3 6 9
соответсвуют Вашему ТЗ? а какой вариант на самом деле нужен Вам? понимаете, о чем я несколько постов?

тема уже не в кайф, начинает утомлять
удачи Вам в сортировке матриц и постановке задач!
Изменено: Ігор Гончаренко - 24.04.2018 16:57:07
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Deuce97 написал:
диапазон у меня лично A13:J17 и его постепенно улучшаю
диапазон A13:J17 совершенен сам по себе и не нуждается в улучшениях, особенно в постепенных
разве что... я бы улучшил его до B17:K21
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Вставлю свои пять копеек:
1. Сортировать значения ячеек прямо на листе это гиблое дело. Как только их станет более - менее приличное количество - время станет совершенно неприемлемым. ИМХО нужно диапазон загнать в двумерный массив, его отсортировать, а потом результат вогнать обратно в диапазон.
2. Если Вы хотите получить в результате матрицу вида
1 2 3
4 5 6
7 8 9
, то я бы из двумерного массива сделал одномерный (столбцы вниз добавил), отсортировал его каким-нить чужим алгоритмом, а потом заполнил бы обратно двумерный массив значениями из одномерного. ИМХО, должно быть проще, чем сортировать двумерный массив.
Изменено: Wiss - 24.04.2018 17:19:54
Я не волшебник, я только учусь.
 
Никогда не занимался сортировкой, так что решил попробовать.
Код
Sub Сортировка_матрицы()

Dim i As Long
Dim j As Long
Dim u As Long

Dim curCell As Range
Dim prevCell As Range
Dim tmp As Variant

    Set curCell = Cells(13, 1)
    
    For u = 1 To 50
        For i = 13 To 17
            For j = 1 To 10
                Set prevCell = curCell
                Set curCell = Cells(i, j)
            
                If i = 13 And j = 1 Then GoTo nextI
                
                If prevCell > curCell Then
                    tmp = prevCell
                    prevCell = curCell
                    curCell = tmp
                End If
nextI:
            Next j
        Next i
    Next u
End Sub
Я не волшебник, я только учусь.
 
Deuce97, если я правильно понял по всей этой переписке:
- берете данные с листа в массив
- создаем доп.массив ,либо расширяем текущий
- проходите циклом по массиву сверху вниз определяя наименьшее или что вам нужно определить
- в доп.столбец массива (или вспомогательный массив, смотря какой вариант будет выбран) заносим результат вычисления по пред.пункту
- далее сортируем массив по этому доп.столбцу по возрастанию любым алгоритмом
- выгружаем данные обратно на лист за минусом доп.столбца
Изменено: Anchoret - 24.04.2018 18:43:54
 
Anchoret, без обид, но я на Си это сделал за 1,5 минуты. Мне нужно было тупо большое кол-во данных отсортировать и я полдня потратил на это vba, в итоге отсортировал на Си, перезаписал в файл и готово.
 
Deuce97, тогда смысл был писать сюда?

П.С.: А с доп.столбцом на листе + формулы + штатная сортировка уйдет еще меньше.
 
Anchoret,энтузиазм был вба почекать.  
 
Цитата
Deuce97 написал:
я на Си это сделал за 1,5 минуты
у Вас хорошая техника набора символов! (Шахиджан, слепой набор?)
сколько символов код на Си (с учетом того что нужно было обратиться к файлу Excel)?
Изменено: Ігор Гончаренко - 24.04.2018 21:54:29
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
и можно на это помотреть?  
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Код
void SortSpiral(float mass[][10], const int nLine, const int nColumn)
{
   int iter_1 = 5*nLine;
   while (iter_1--)
   {
      for (int k = 0; k < nLine; k++) {

         int iter_2 = nLine;
         while (iter_2--)
         {
            for (int j = 0; j < nColumn - 1; j++)
            {
               if (mass[k][j] > mass[k][j + 1])
               {
                  float temp = mass[k][j];
                  mass[k][j] = mass[k][j + 1];
                  mass[k][j + 1] = temp;
               }
                  
               
            }
         }
         if (k < nLine - 1 && mass[k][nColumn - 1] > mass[k + 1][0])
         {
            float temp = mass[k][nColumn - 1];
            mass[k][nColumn - 1] = mass[k + 1][0];
            mass[k + 1][0] = temp;
         }
      }
   }
   return;
}
Изменено: Deuce97 - 24.04.2018 22:26:46
 
Deuce97, на Си вроде есть встроеная сортировка? И где выгрузка в Excel?)
 
Word мне говорит что в процедуре 421 символ, делим на 1.5 мин получаем скорость набора = 4.7 символа в сек.!
я преклоняюсь перед талантом!
и тут еще нет обращения к Excel, к диапазону A13:J17 и обратной выгрузки в диапазон УЖЕ СОРТИРОВАННОГО массива тоже не видно... но для профессионала - это мелочь!
вот она победа СИ над VBA
Изменено: Ігор Гончаренко - 24.04.2018 22:22:55
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1 2 След.
Наверх