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

Вход

Регистрация

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

 

= Мир MS Excel/Простая сортировка массива - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Простая сортировка массива (Макросы/Sub)
Простая сортировка массива
t330 Дата: Пятница, 01.02.2019, 17:05 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Добрый день, уважаемые коллеги.
Помогите пожалуйста понять почему не работает сортировка массива с циклом DO WHILE
[vba]
Код

Option Explicit
Sub arrays()

    Dim Ar1() As Long
    Dim Elem As Integer
    Dim i As Integer, j As Integer
    Dim R
    
'  Заполняю массив рандомными числами и записываю их в столбец 1

    Elem = InputBox("Введите размер массива ")
    ReDim Ar1(1 To Elem, 0)
    For i = 1 To Elem
        Ar1(i, 0) = CLng(Rnd * 100000)
    Next i
    Range(Cells(1, 1), Cells(Elem, 1)) = Ar1()

' Сортирую массив перебором и записываю отсортированный массив в столбец 3
    
    For i = 1 To Elem - 1
        j = i
        Do While Ar1(j + 1, 0) < Ar1(j, 0) & j > 0
            R = Ar1(j, 0)
            Ar1(j, 0) = Ar1(j + 1, 0)
            Ar1(j + 1, 0) = R
            j = j - 1
        Loop
    Next i
     
    Range(Cells(1, 3), Cells(Elem, 3)) = Ar1()
    
    
End Sub

[/vba]

В Столбце 1 отображается исходный массив,
А в Столбце 3 должен отображаться отсортированный по возрастанию массив, но там отображается тот же самый не отсортированный массив...

Заранее благодарен за ответ...
К сообщению приложен файл: Sort.xlsm (13.8 Kb)
 
Ответить
СообщениеДобрый день, уважаемые коллеги.
Помогите пожалуйста понять почему не работает сортировка массива с циклом DO WHILE
[vba]
Код

Option Explicit
Sub arrays()

    Dim Ar1() As Long
    Dim Elem As Integer
    Dim i As Integer, j As Integer
    Dim R
    
'  Заполняю массив рандомными числами и записываю их в столбец 1

    Elem = InputBox("Введите размер массива ")
    ReDim Ar1(1 To Elem, 0)
    For i = 1 To Elem
        Ar1(i, 0) = CLng(Rnd * 100000)
    Next i
    Range(Cells(1, 1), Cells(Elem, 1)) = Ar1()

' Сортирую массив перебором и записываю отсортированный массив в столбец 3
    
    For i = 1 To Elem - 1
        j = i
        Do While Ar1(j + 1, 0) < Ar1(j, 0) & j > 0
            R = Ar1(j, 0)
            Ar1(j, 0) = Ar1(j + 1, 0)
            Ar1(j + 1, 0) = R
            j = j - 1
        Loop
    Next i
     
    Range(Cells(1, 3), Cells(Elem, 3)) = Ar1()
    
    
End Sub

[/vba]

В Столбце 1 отображается исходный массив,
А в Столбце 3 должен отображаться отсортированный по возрастанию массив, но там отображается тот же самый не отсортированный массив...

Заранее благодарен за ответ...

Автор - t330
Дата добавления - 01.02.2019 в 17:05
Pelena Дата: Пятница, 01.02.2019, 17:21 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 19174
Репутация: 4413 ±
Замечаний: ±

Excel 365 & Mac Excel
Здравствуйте.
Это & знак сцепления строк. Для объединения условий надо писать And


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЗдравствуйте.
Это & знак сцепления строк. Для объединения условий надо писать And

Автор - Pelena
Дата добавления - 01.02.2019 в 17:21
t330 Дата: Пятница, 01.02.2019, 17:46 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Для объединения условий надо писать And

Спасибо, поставил And, теперь пишет
Run time error "9"
Subscript out of range

Дебаг указывает на строку
[vba]
Код
Do While Ar1(j + 1, 0) < Ar1(j, 0) And j > 0
[/vba]

Что-то ему не нравится?


Сообщение отредактировал t330 - Пятница, 01.02.2019, 17:47
 
Ответить
Сообщение
Для объединения условий надо писать And

Спасибо, поставил And, теперь пишет
Run time error "9"
Subscript out of range

Дебаг указывает на строку
[vba]
Код
Do While Ar1(j + 1, 0) < Ar1(j, 0) And j > 0
[/vba]

Что-то ему не нравится?

Автор - t330
Дата добавления - 01.02.2019 в 17:46
_Boroda_ Дата: Пятница, 01.02.2019, 18:23 | Сообщение № 4
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16672
Репутация: 6479 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Когда j=0, то Вы одновременно и проверяете кусок j>0, и сравниваете Ar1(j + 1, 0) с Ar1(j, 0). А сравнить-то не получится - у Вас же j=0, а массив начинается с 1. Вот и ошибка - нет у Вас Ar1(0, 0)
Погуглите "Сортировка массива VBA" есть куча методов


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеКогда j=0, то Вы одновременно и проверяете кусок j>0, и сравниваете Ar1(j + 1, 0) с Ar1(j, 0). А сравнить-то не получится - у Вас же j=0, а массив начинается с 1. Вот и ошибка - нет у Вас Ar1(0, 0)
Погуглите "Сортировка массива VBA" есть куча методов

Автор - _Boroda_
Дата добавления - 01.02.2019 в 18:23
t330 Дата: Пятница, 01.02.2019, 20:06 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Когда j=0, то Вы одновременно и проверяете кусок j>0, и сравниваете Ar1(j + 1, 0) с Ar1(j, 0). А сравнить-то не получится - у Вас же j=0, а массив начинается с 1.

[vba]
Код

For i = 1 To Elem - 1
        j = i
        Do While Ar1(j + 1, 0) < Ar1(j, 0) And j > 0
[/vba]

Где же j = 0 то? В коде цикла сверху j = i , а i начинается с 1...

Я знаю, что в сети куча метородов по сортировке на ВБА, но я только что начал его изучать и поэтому пытаюсь писать самостоятельно а не только разбирать примеры.
 
Ответить
Сообщение
Когда j=0, то Вы одновременно и проверяете кусок j>0, и сравниваете Ar1(j + 1, 0) с Ar1(j, 0). А сравнить-то не получится - у Вас же j=0, а массив начинается с 1.

[vba]
Код

For i = 1 To Elem - 1
        j = i
        Do While Ar1(j + 1, 0) < Ar1(j, 0) And j > 0
[/vba]

Где же j = 0 то? В коде цикла сверху j = i , а i начинается с 1...

Я знаю, что в сети куча метородов по сортировке на ВБА, но я только что начал его изучать и поэтому пытаюсь писать самостоятельно а не только разбирать примеры.

Автор - t330
Дата добавления - 01.02.2019 в 20:06
_Boroda_ Дата: Пятница, 01.02.2019, 20:58 | Сообщение № 6
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16672
Репутация: 6479 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Где же j = 0 то?

Вот здесь
j = j - 1


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
Где же j = 0 то?

Вот здесь
j = j - 1

Автор - _Boroda_
Дата добавления - 01.02.2019 в 20:58
t330 Дата: Суббота, 02.02.2019, 01:13 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Вот здесь
Цитата t330, 01.02.2019 в 17:05, в сообщении № 1 ( писал(а)):


Спасибо огромное!
В Паскале такой код прошел бы нормально, а в VBA пришлось добавить дополнительное условие на выход из цикла
If j = 0 Then Exit Do

Теперь сортирует нормально.

Цитата
Do While Ar1(j + 1, 0) < Ar1(j, 0) And j > 0
R = Ar1(j, 0)
Ar1(j, 0) = Ar1(j + 1, 0)
Ar1(j + 1, 0) = R
j = j - 1
If j = 0 Then Exit Do

Loop
 
Ответить
Сообщение
Вот здесь
Цитата t330, 01.02.2019 в 17:05, в сообщении № 1 ( писал(а)):


Спасибо огромное!
В Паскале такой код прошел бы нормально, а в VBA пришлось добавить дополнительное условие на выход из цикла
If j = 0 Then Exit Do

Теперь сортирует нормально.

Цитата
Do While Ar1(j + 1, 0) < Ar1(j, 0) And j > 0
R = Ar1(j, 0)
Ar1(j, 0) = Ar1(j + 1, 0)
Ar1(j + 1, 0) = R
j = j - 1
If j = 0 Then Exit Do

Loop

Автор - t330
Дата добавления - 02.02.2019 в 01:13
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Простая сортировка массива (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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