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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2011, 20:06   #1
MIKE11IPME
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 159
По умолчанию Сортировка двумерного массива

Условие
відсортувати елементи заданого стовпчика за умовою зменшення величини його елементів

Тут я попытался по возрастанию , но в строке Arr(j, 1) > Kas
выбивает Sabscript out of range , хотя я не знаю что может тут выходить за пределы
Помогите исправить ошибку

Код:
Private Sub CommandButton2_Click()
Dim i, Arr(), Tmp, Mas, p, j, n, Kas As Double
    If Selection.Columns.Count > 1 Then MsgBox "кол-во столбцов>1"
    If Selection.Columns.Count > 1 Then Exit Sub
    If Selection.Cells.Count = 1 Then MsgBox "кол-во ячеек<2"
    If Selection.Cells.Count = 1 Then Exit Sub
    Mas = Selection.Value
    p = Selection.Rows.Count
    n = p
    Arr = Mas
   For i = 0 To n - 1
        For j = 0 To n - 2 - i
            Kas = Arr(j + 1, 1)
            If Arr(j, 1) > Kas Then
                Tmp = Arr(j, 1)
                Arr(j, 1) = Kas
                Arr(j + 1, 1) = Tmp
            End If
        Next j
    Next i

For i = 1 To p
Selection.Cells(1, i + 2) = Arr(i, 1)
Next
MsgBox k
End Sub
И еще вопрос почему например Mas = Mas1 можно ,а по элементно
нельзя присвоить т.е. p - фиксированное число

Код:
For i=1 to p  
Mas(i,1)=Mas1(i,1)
Next

Последний раз редактировалось MIKE11IPME; 17.04.2011 в 20:36.
MIKE11IPME вне форума Ответить с цитированием
Старый 17.04.2011, 20:20   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Вторую строку можно сказать понял не совсем... но про ошибку понятно - массив из выделенного диапазона начинается с 1.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.04.2011, 20:28   #3
MIKE11IPME
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 159
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Вторую строку можно сказать понял не совсем... но про ошибку понятно - массив из выделенного диапазона начинается с 1.
а по подробнее ?
ну собственно я не сильно понял в чем дело , но вроде бы так и задумывается что сначала идет 1-ый елемент сравнение со вторым и т.д.
да и как тогда исправить данную ошибку ?
по сути у меня одномерный массив , но я забиваю как двумерный с несколькими строками
MIKE11IPME вне форума Ответить с цитированием
Старый 17.04.2011, 20:35   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

У Вас, когда j=0, то Arr(j, 1) будет давать ошибку.
Пишите For j = 1 To ... Но естественно нужно остальной код скорректировать.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.04.2011, 20:37   #5
MIKE11IPME
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 159
По умолчанию

спасибо понял

Последний раз редактировалось MIKE11IPME; 17.04.2011 в 20:41.
MIKE11IPME вне форума Ответить с цитированием
Старый 17.04.2011, 20:45   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Да и выгрузку можно сделать проще.
Да и вообще - сортировку можно вынести в отдельную процедуру.
Вот кусок кода - конец основного с выгрузкой и сортировка.
В перменной ii хранится количество заполненных ячеек массива b - он на самом деле больше, но выгружается только заполненная после сортировки верхушка.
Тут правда массив из двух колонок диапазона - это подкорректируйте, а может и так кому пригодится (такой нашёл пример):

Код:
...
SortArray b
[G8:H8].Resize(ii) = b

End Sub

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
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.04.2011, 20:46   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Здесь есть пример функции сортировки двумерного массива:
http://excelvba.ru/code/SortArray
EducatedFool вне форума Ответить с цитированием
Старый 17.04.2011, 20:54   #8
MIKE11IPME
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 159
По умолчанию

Код:
Private Sub CommandButton1_Click()
Dim i, j As Long, Arr(), Tmp, n, Kas As Double
    If Selection.Columns.Count > 1 Then MsgBox "кол-во столбцов>1"
    If Selection.Columns.Count > 1 Then Exit Sub
    If Selection.Cells.Count = 1 Then MsgBox "кол-во ячеек<2"
    If Selection.Cells.Count = 1 Then Exit Sub
    Arr = Selection.Value
    n = Selection.Rows.Count
    For i = 0 To n - 1
        For j = 1 To n - 1 - i
            If Arr(j, 1) > Arr(j + 1, 1) Then
                Tmp = Arr(j, 1)
                Arr(j, 1) = Arr(j + 1, 1)
                Arr(j + 1, 1) = Tmp
            End If
        Next
    Next

For i = 1 To n
Selection.Cells(1, i + 2) = Arr(i, 1)
Next
End Sub
Все теперь работает как надо , дурацкая ошибка , благодарю за исправление =)
MIKE11IPME вне форума Ответить с цитированием
Старый 17.04.2011, 20:56   #9
MIKE11IPME
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 159
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Здесь есть пример функции сортировки двумерного массива:
http://excelvba.ru/code/SortArray
Слишком сложный . задачу надо было выполнить с применением элементарных операторов , а так уже видел его когда искал варианты сортировки =)
но все равно и вам спасибо
MIKE11IPME вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка двумерного массива AlexXXX12389 Помощь студентам 0 17.10.2010 10:32
Сортировка двумерного массива Расим Помощь студентам 7 15.12.2009 22:29
Сортировка двумерного массива на C/C++ HDMI Помощь студентам 1 04.12.2009 20:08
Сортировка двумерного массива(С) Александр Елис Помощь студентам 1 31.10.2009 13:25