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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 25.01.2008, 09:39   #1
Обыватель
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 98
По умолчанию макрос VBA EXCEL - деление ряда чисел по заданному критерию

Добрый день! Подскажите, пожалуйста, как решить задачу: имеем ранжированный ряд значений. Задача - разбить ряд на группы таким образом, чтобы крайние значения групп отличались не более, чем в два раза.
Как будет выглядеть код?
Обыватель вне форума
Старый 25.01.2008, 09:55   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

А если дан ряд, например: 1, 10, 100, 1000, ... Тогда что?
Условие для ряда произвольных значений задано некорректно.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 25.01.2008, 13:53   #3
Обыватель
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 98
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
А если дан ряд, например: 1, 10, 100, 1000, ... Тогда что?
Условие для ряда произвольных значений задано некорректно.
точно!
тогда уточняю: необходимо условие для ряда типа - 4, 6, 8, 10, 11, 14, 16, 20, 22, 24, 27 ...
Обыватель вне форума
Старый 26.01.2008, 16:44   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Пусть столбец "A" содержит ряд ранжированных чисел.
Следующий макрос "разобьет" этот ряд по столбцам, согласно заданному условию.
Код:
Sub Ranking()
    Dim i As Long, j As Long, a As Long
    j = 2
    a = Cells(1, 1)
    For i = 1 To Range("A65536").End(xlUp).Row
        If a * 2 >= Cells(i, 1) Then
            Cells(Cells(65536, j).End(xlUp).Row + 1, j) = Cells(i, 1)
        Else
            j = j + 1
            Cells(Cells(65536, j).End(xlUp).Row + 1, j) = Cells(i, 1)
            a = Cells(i, 1)
        End If
    Next i
End Sub
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 30.01.2008, 09:18   #5
Обыватель
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 98
По умолчанию

Большое спасибо! Теперь логика понятна.
Обыватель вне форума
Старый 30.01.2008, 12:23   #6
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию позволю себе немножко поправить

Sub Ranking()
Dim i As Long, j As Long, a As Long, nrow As Long
nrow = 1
j = 2
a = Cells(1, 1)
For i = 1 To Cells(Columns(1).Rows.Count, 1).End(xlUp).Row
If IsNumeric(Cells(i, 1)) Then
If a * 2 < Cells(i, 1) Then
j = j + 1
a = Cells(i, 1)
nrow = 1
End If
Cells(nrow, j) = Cells(i, 1)
nrow = nrow + 1
End If
Next
End Sub

самое главное в этом - что строк может быть больше 65536, на дворе 2008й
ну и при наличии нецифровых значений код a=cells не вызовет ошибку несоответствия типа.

кстати, "исходный код" пропускает первую "порцию" данных, а остальное записывает начиная со второй строчки(а не с первой)
slan вне форума
Старый 30.01.2008, 12:23   #7
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию позволю себе немножко поправить

Sub Ranking()
Dim i As Long, j As Long, a As Long, nrow As Long
nrow = 1
j = 2
a = Cells(1, 1)
For i = 1 To Cells(Columns(1).Rows.Count, 1).End(xlUp).Row
If IsNumeric(Cells(i, 1)) Then
If a * 2 < Cells(i, 1) Then
j = j + 1
a = Cells(i, 1)
nrow = 1
End If
Cells(nrow, j) = Cells(i, 1)
nrow = nrow + 1
End If
Next
End Sub

самое главное в этом - что строк может быть больше 65536, на дворе 2008й
ну и при наличии нецифровых значений код a=cells не вызовет ошибку несоответствия типа.

кстати, "исходный код" пропускает первую "порцию" данных, а остальное записывает начиная со второй строчки(а не с первой)
slan вне форума
Старый 30.01.2008, 13:07   #8
Обыватель
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 98
По умолчанию

Slan
Понял, спасибо !
Обыватель вне форума
Старый 30.01.2008, 13:30   #9
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

На счет строк соглашусь с Вами, а все остальное полностью удовлетворяло условию задачи.
Во-первых:
Цитата:
имеем ранжированный ряд значений. Задача - разбить ряд на группы таким образом, чтобы крайние значения групп отличались не более, чем в два раза
Т. е. все значения - числа, иначе как Вы понимаете, что строковые переменные отличаются в два раза?
Во-вторых:
Цитата:
Задача - разбить ряд на группы
Что такое "группы", где их располагать, или куда девать? (кто требует располагать именно в этих столбцах и именно с первой строки?) Я вообще сначала хотел предложить создать массивы с этими "группами". Раз условием это не задано, то минимизирован код.

Поясните, что значит
Цитата:
"исходный код" пропускает первую "порцию" данных
???
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 30.01.2008 в 14:32.
SAS888 вне форума
Старый 30.01.2008, 14:17   #10
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию я же и не ругаюсь..

кстати, насчет превой порции - это у меня заморочка при тестировании - беру слова обратно.
а насчет минимизации.. если привести к аналогичному виду
Sub Ranking()
Dim i As Long, j As Long, a As Long
j = 2
a = Cells(1, 1)
For i = 1 To Cells(Columns(1).Rows.Count, 1).End(xlUp).Row
If a * 2 < Cells(i, 1) Then
j = j + 1
a = Cells(i, 1)
End If
Cells(Columns(j).Rows.Count, j)).End(xlUp).offset(1) = Cells(i, 1)
Next
End Sub

выглядит короче ), хотя исполнение кода полностью аналогично
slan вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
макрос перехода на заданный лист в excel Руслан Набиуллин Microsoft Office Excel 2 06.08.2008 20:46
программа перестановки чисел натурального ряда от 1 до 10 Ольга 01 Общие вопросы C/C++ 1 28.07.2008 20:09
помогите, пожалуйсто, написать макрос для excel bacalavr Microsoft Office Excel 2 04.04.2008 11:39
макрос VBA Excel Bor Microsoft Office Excel 5 25.01.2008 12:20
Деление чисел в двоичной системе счисления Mss_Smith Помощь студентам 9 04.05.2007 17:02